按键控制LED灯(裸奔)

 

一、实验平台:开发板fs2410,采用三星s3c2410的cpu,无操作系统。

二、实现功能:K1~K4分别控制LED灯D12~9,第一次按点亮,再按熄灭,再按点亮...

三、实验原理:

按键和LED原理图:

 

       按键采用查询方式,并采用循环扫描的方式:要想唯一的识别出是哪个按键被按下,这里用到了循环扫描的方法,先让KSCAN0~2 = 011,那么K1被按下时,EINT19才会变为低电平,这时K2按下时,EINT19不会变低,这样就区分了按键K1和K2,区分其它按键原理一样。

四、实验现象:按下K1时,LED12点亮,再按时熄灭,再按有点亮…如图,其它按键类似。

 

 

 

五、实验总结:

       为了实现第一次按时点亮、第二次按时熄灭、再按点亮的功能,所以在按下按下后,首先要判断LED等以前的状态,若之前的状态为点亮状态,则现在将其熄灭,若之前是熄灭状态,则现在将其点亮。

       在按下按键时,会有抖动问题,这里用wait()延时函数进行去抖。

六、示例代码:

/*key_led.c*/
#define GPECON (*(volatile unsigned long *)0x56000040)
#define GPEDAT (*(volatile unsigned long *)0x56000044)
#define GPFCON (*(volatile unsigned long *)0x56000050)
#define GPFDAT (*(volatile unsigned long *)0x56000054)
#define GPGCON (*(volatile unsigned long *)0x56000060)
#define GPGDAT (*(volatile unsigned long *)0x56000064)

#define GPE11_out (1<<22)
#define GPE13_out (1<<26)
#define GPF4_out (1<<8)
#define GPF5_out (1<<10)
#define GPF6_out (1<<12)
#define GPF7_out (1<<14)
#define GPF4_in (0<<9)
#define GPG3_in (0<<7)
#define GPG6_out (1<<12)
#define GPG11_in (0<<23)

void wait(unsigned long dly)
{
	for(;dly>0;dly--);
}

int main(void)
{
	GPFCON = GPF4_out|GPF5_out|GPF6_out|GPF7_out;   //先灭掉LED灯
	GPFDAT |= 0XF0;

	GPECON = GPE11_out|GPE13_out;   //设置E口功能
	GPGCON = GPG3_in|GPG6_out|GPG11_in;   //设置G口功能
	
	int GPG_read;

	while(1){	//循环扫描(KSCAN0~2 = 011,101,110),并为按键去抖
		GPEDAT &= 0XF7FF;
		GPGDAT |= 0X40;
		GPEDAT |= 0X2000;
		GPG_read = GPGDAT&0X808;
		if((GPG_read&0X8) == 0X0){   //K4被按下
			GPG_read = 0X8;
			wait(200000);
			if((GPG_read&=GPGDAT) == 0X0){
				if((GPFDAT&0X80) == 0X80)
					GPFDAT &= 0X7F;  //点亮D9
				else
					GPFDAT |= 0X80;  //熄灭D9
			}
		}
		else if((GPG_read&0X800) == 0X0){   //K1被按下
			GPG_read = 0X800;
			wait(200000);
			if((GPG_read&=GPGDAT) == 0X0){
				if((GPFDAT&0X10) == 0X10)
					GPFDAT &= 0XEF;  //点亮D12
				else
					GPFDAT |= 0X10;  //熄灭D12
			}
		}

		GPEDAT |= 0X2800;
		GPGDAT &= 0XFFBF;
		GPG_read = GPGDAT&0X800;
		if(GPG_read == 0X0){   //K2被按下
			GPG_read = 0X800;
			wait(200000);
			if((GPG_read&=GPGDAT) == 0X0){
				if((GPFDAT&0X20) == 0X20)
					GPFDAT &= 0XDF;  //点亮D11
				else
					GPFDAT |= 0X20;  //熄灭D11
			}
		}

		GPEDAT |= 0X800;
		GPGDAT |= 0X40;
		GPEDAT &= 0XDFFF;
		GPG_read = GPGDAT&0X800;
		if(GPG_read == 0X0){   //K3被按下
			GPG_read = 0X800;
			wait(200000);
			if((GPG_read&=GPGDAT) == 0X0){
				if((GPFDAT&0X40) == 0X40)
					GPFDAT &= 0XBF;  //点亮D10
				else
					GPFDAT |= 0X40;  //熄灭D10
			}
		}
	}

	return 0;
}


 

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值