1、环境
1、操作系统:win7 64位
2、集成开发环境:keil4.7
3、开发板:FL2440
4、下载器:Jlink V9
2、按键以及LED灯原理图
根据FL2440开发板原理图可知,有四个led灯分别由GPB5、GPB6、GPB8、GPB10控制,当控制小灯的管脚输出高电平时,小灯熄灭;当控制小灯的管脚输出低电平时,小灯点亮。四个按键分别通过GPF0、GPF2、GPF3、GPF4查看其按下与否,若按键按下,则其对应的管脚寄存器读取的电平是低电平,未按下则读取的电平为高电平。
3、端口概述
3.1 S3C2440端口
S3C2440有130个I/O端口,分为A~J组:GPA、GPB、…、GPJ。可以通过设置设置寄存器来确定某个引脚用于输入、输出还是其他特殊功能。
对于输入,可以通过读取某个寄存器来确定引脚的电平是高还是低;对于输出,可以通过写入某个寄存器来让这个引脚输出高电平或低电平;对于其他特殊功能,则有另外的寄存器来控制它。
对于这几组GPIO,它们的寄存器是相似的:GPxCON用于选择引脚功能,GPxDAT用于读/写引脚数据;另外GPxUP用于确定是否使用内部上拉电阻。x为A、B、…、J。
3.2 GPxCON寄存器
用于配置选择引脚的功能。PORT A与PORT B ~ PORT J在功能选择方便有所不同,GPACON中每一位对应一根引脚(共23根引脚)。当某位被设置为0时,相应引脚为输出引脚,此时可以在GPADAT中相应位写入0或1让此引脚输出低电平或高电平;当某位被设为1时,相应引脚为地址线或用于地址控制,此时GPADAT无用。一般情况下,GPACON被设为全1,以便访问外部存储器件。
PORT B ~ PORT J在寄存器操作方便完全相同。GPxCON中每两位控制一根引脚:00表示输入、01表示输出、10表示特殊功能、11保留不用。
3.3 GPxDAT寄存器
GPxDAT用于读/写引脚:当引脚被设置为输入时,读此寄存器可知相应引脚的电平状态是高还是低;当引脚被设为输出时,写此寄存器相应位可令此引脚输出高电平或低电平。
3.4 GPxUP寄存器
GPxUP某位为1时,相应引脚无内部上拉电阻;为0时,相应引脚使用内部上拉电阻。上拉电阻、下拉电阻的作用在于,当GPIO引脚处于第三态时,它的电平状态是由上拉电阻、下拉电阻确定。
4、代码概述
Led.h主要是定义一些LED相关的宏,提高程序的通用性和易读性。
#define LED0_OUT (1<<(10))
#define LED1_OUT (1<<(12))
#define LED2_OUT (1<<(16))
#define LED3_OUT (1<<(20))
#define LED0_MSK (3<<(10))
#define LED1_MSK (3<<(12))
#define LED2_MSK (3<<(16))
#define LED3_MSK (3<<(20))
#define LED0_ON GPBDAT &= ~(1<<5)
#define LED1_ON GPBDAT &= ~(1<<6)
#define LED2_ON GPBDAT &= ~(1<<8)
#define LED3_ON GPBDAT &= ~(1<<10)
#define LED0_OFF GPBDAT |= 1<<5
#define LED1_OFF GPBDAT |= 1<<6
#define LED2_OFF GPBDAT |= 1<<8
#define LED3_OFF GPBDAT |= 1<<10
kkkLed.c设置相关的LED的IO引脚为输出,并将相关LED0关闭。
void led_GPIO_Init(void)
{
//LED0到LED3对应的引脚设置成输出
GPBCON &= ~(LED0_MSK | LED1_MSK | LED2_MSK | LED3_MSK);
GPBCON |= (LED0_OUT | LED1_OUT | LED2_OUT | LED3_OUT);
LED0_OFF;
LED1_OFF;
LED2_OFF;
LED3_OFF;
return ;
}
Key.h定义来一些按键相关宏
#define S2_OUT (1<<(0))
#define S3_OUT (1<<(4))
#define S4_OUT (1<<(6))
#define S5_OUT (1<<(8))
#define S2_MSK (3<<(0))
#define S3_MSK (3<<(4))
#define S4_MSK (3<<(6))
#define S5_MSK (3<<(8))
Key.c设置相关按键的引脚为输入
void key_GPIO_Init(void)
{
//S2到S5对应的引脚设置成输入
GPBCON &= ~(S2_MSK | S3_MSK | S4_MSK | S5_MSK);
GPBCON |= (S2_OUT | S3_OUT | S4_OUT | S5_OUT);
return ;
}
main.c初始化led以及按键的IO引脚,并实时检测按键是否按下,若没按下按键,则关闭相应LED灯;若按键按下,则点亮相应的LED灯。
int __main()
{
unsigned int dwDate = 0;
led_GPIO_Init();
key_GPIO_Init();
while (1)
{
dwDate = GPFDAT;
if ( dwDate&(1<<0))//S2没有按下
{
LED0_OFF;
}
else
{
LED0_ON;
}
if ( dwDate&(1<<2))//S3没有按下
{
LED1_OFF;
}
else
{
LED1_ON;
}
if ( dwDate&(1<<3))//S3没有按下
{
LED2_OFF;
}
else
{
LED2_ON;
}
if ( dwDate&(1<<4))//S4没有按下
{
LED3_OFF;
}
else
{
LED3_ON;
}
}
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)