实验实现功能:TQ2440开发板上按下某个键后对应的LED被点亮,如:按下key1点亮led1。下面是main.c程序
—————————————————————————————————————
#include "2440addr.h"
#define KEY1 (0<<2)
#define KEY2 (0<<8)
#define KEY3 (0<<4)
#define KEY4 (0<<0)
#define LED1_ON (rGPBDAT &=~(1<<5))
#define LED1_OFF (rGPBDAT |=(1<<5) )
#define LED2_ON (rGPBDAT &=~(1<<6))
#define LED2_OFF (rGPBDAT |=(1<<6))
#define LED3_ON (rGPBDAT &=~(1<<7))
#define LED3_OFF (rGPBDAT |=(1<<7))
#define LED4_ON (rGPBDAT &=~(1<<8))
#define LED4_OFF (rGPBDAT |=(1<<8))
void Led_Init(void)
{
rGPBCON &=~((3<<10)|(3<<12)|(3<<14)|(3<<16)); //对GPBCON[10:17]清零
rGPBCON |=((1<<10)|(1<<12)|(1<<14)|(1<<16)); //设置GPB5~8为输出
rGPBUP &=~((1<<5)|(1<<6)|(1<<7)|(1<<8)); //设置GPB5~8的上拉功能
rGPBDAT |=(1<<5)|(1<<6)|(1<<7)|(1<<8); //关闭LED
}
void Key_Init(void)
{
rGPFCON &=~((3<<0)|(3<<2)|(3<<4)|(3<<8)); //使rGPFCON相应的位清零
rGPFCON |=KEY1|KEY2|KEY3|KEY4; //设置为输入
rGPFDAT |=(1<<0)|(1<<1)|(1<<2)|(1<<4); //相应端口设置为高电平
}
int Key_Scan(void)
{
int keynum=0;
if((rGPFDAT & (1<<1))==0) //按键1按下
{
keynum=1;
}
if((rGPFDAT & (1<<4))==0) //按键2按下
{
keynum=2;
}
if((rGPFDAT & (1<<2))==0) //按键3按下
{
keynum=3;
}
if((rGPFDAT & (1<<0))==0) //按键4按下
{
keynum=4;
}
return keynum;
}
int main( )
{
Led_Init();
Key_Init();
while(1)
{
switch(Key_Scan())
{
case 1:Led_Init(); LED1_ON; break;
case 2:Led_Init(); LED2_ON; break;
case 3:Led_Init(); LED3_ON; break;
case 4:Led_Init(); LED4_ON; break;
default : break;
}
}
return 0;
}
—————————————————————————————————————
#include "2440addr.h" 这个在上LED详解已经介绍过,这里不再详述;
我们首先来看看TQ公司的按键设计是怎样的:
从这里,我们可以看到,K1~K4分别接到核心板的EINT1、EINT4、EINT2、EINT0,对应的GPIO口为如下所示:
所以我们要控制的IO口为GPF1、GPF4、GPF2、GPF0这四个寄存器。我们首先分析main函数,进入main函数后,首先调用Led_Init();函数,这个函数就是我们LED详解里面讲过的设置GPBCON对应位为输出,GPBUP对应位为上拉有效,GPBDAT对应位写入1关闭全部LED。