1、环境

1、操作系统:win7 64位
2、集成开发环境:keil4.7
3、开发板:FL2440
4、下载器:Jlink V9

2、按键以及LED灯原理图

根据FL2440开发板原理图可知,有四个led灯分别由GPB5、GPB6、GPB8、GPB10控制,当控制小灯的管脚输出高电平时,小灯熄灭;当控制小灯的管脚输出低电平时,小灯点亮。四个按键分别通过GPF0、GPF2、GPF3、GPF4查看其按下与否,若按键按下,则其对应的管脚寄存器读取的电平是低电平,未按下则读取的电平为高电平。

S3C2440裸机按键控制小灯

S3C2440裸机按键控制小灯

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;
		}			
	}
}

5、代码下载

相关文章:

  • 2021-12-15
猜你喜欢
  • 2021-11-20
  • 2021-12-29
  • 2022-12-23
  • 2022-12-23
  • 2022-01-17
  • 2021-07-31
相关资源
相似解决方案