JZ2440开发板:用按键点亮LED灯(学习笔记)

本文是对韦东山嵌入式第一期学习的记录之一,如有您需要查找的信息,可以继续往下阅读。

 

  想要用按键点亮LED灯,就需要知道按键和LED灯的相关信息,这样才可以进行之后的操作。阅读JZ2440的原理图,可以得到以下信息(见下方图片)



 

JZ2440开发板用到了S2,S3,S4三个按键,nLED1,nLED2,nLED4三盏LED灯,它们对应的寄存器位分别是:

按键:S2(EINT0)——GPF0  S3(EINT2)——GPF2  S4(EINT11)——GPG3

LED:  nLED1——GPF4  nLED2——GPF5  nLED4——GPF6

知道这些之后,需要进一步了解相应寄存器的信息,阅读S3C2440的芯片手册,可以得到以下信息(见下方图片)

                      GPFCON和GPFDAT寄存器

                      GPGCON和GPGDAT寄存器

对于LED:需要设置GPFCON的GPF4/5/6,让它们变成输出引脚【GPFCON的bit8/9设为0b01,bit10/11设为0b01,bit12/13设为0b01】

对于按键:需要设置GPFCONGPF0(s2键),GPF2(s3键)以及GPGCONGPG3(s4键),让它们变成输入引脚【GPFCON的bit0/1设为0,bit4/5设为0,GPGCON的bit6/7设为0】

  由于GPFCON与GPFDAT是对应的,GPGCON与GPGDAT是对应的,根据芯片手册关于GPFDAT和GPGDAT的描述(上面的图片)可知:

当端口配置为输入时,相应的位为针状态。当端口配置为输出时,引脚状态为与相应的位相同。 当端口配置为功能引脚时,将读取未定义的值。

由此可以知道:

  按键的状态对应GPFDAT中位0和位2的值以及GPGDAT中位3的值LED的状态对应GPFAT中位6/5/4的值

  按键和LED一样,平时电位都处于拉高状态,对应着松开和熄灭(也就是1),当按键按下时,或者LED点亮时,对应着低电位(也就是0)

因此,GPFDAT寄存器和GPGDAT寄存器也需要进行相关的设置(程序中体现)。

  接下来仅对C程序进行解析:

 1 #include "s3c2440_soc.h"                         //写好了寄存器地址的宏,C程序中直接写寄存器名称即可
 2 int main(void)
 3 {
 4     int val1,val2;
 5     /*设置GPFCON的GPF4/5/6,让它们变成输出引脚*/
 6     GPFCON &=~((3<<8)|(3<<10)|(3<<12));                        //先让GPFCON的GPF4/5/6清零
 7     GPFCON |=((1<<8)|(1<<10)|(1<<12));                        //配置好GPFCON的GPF4/5/6,让它们变成输出引脚
 8 
 9     /*设置GPFCON的GPF0(s2键),GPF2(s3键)以及GPGCON的GPG3(s4键),让它们变成输入引脚*/
10     GPFCON &=~((3<<0)|(3<<4));
11     GPGCON &=~(3<<6);
12 
13     /*按下点亮*/
14     while(1)
15     {
16         val1=GPFDAT;
17         val2=GPGDAT;
18         if(val1 & (1<<0))                        //判断S2键是否按下,对应GPF6的LED灯
19             {
20                 GPFDAT |=(1<<6);                //此时S2键为松开,LED应该熄灭
21             }
22         else
23             {
24                 GPFDAT &=~(1<<6);                //此时S2键为按下,LED应该点亮
25             }
26         if(val1 & (1<<2))                        //判断S3键是否按下,对应GPF5的LED灯
27             {
28                 GPFDAT |=(1<<5);                //此时S3键为松开,LED应该熄灭
29             }
30         else
31             {
32                 GPFDAT &=~(1<<5);                //此时S3键为按下,LED应该点亮
33             }
34         if(val2 & (1<<3))                        //判断S4键是否按下,对应GPF4的LED灯
35             {
36                 GPFDAT |=(1<<4);                //此时S4键为松开,LED应该熄灭
37             }
38         else
39             {
40                 GPFDAT &=~(1<<4);                //此时S4键为按下,LED应该点亮
41             }
42     }
43     return 0;
44 }

  整个C程序到此就写完了,连同其他文件(start.S / s3c2440_soc.h / makefile 本文没有附上)一起上传到linux编译后,得到的bin文件,烧写到JZ2440开发板上,经过验证,按键按下时,对应的LED亮,松开时熄灭。

posted @ 2018-10-18 07:48  知微之见  阅读(2022)  评论(0编辑  收藏  举报