按键控制LED


本文是基于韦东山视频的学习笔记

汇总点这

按键原理

按键原理图如下,按键分别是EINT0、2、11, 分别对应引脚是GPF0、GPF2、GPG3,原理图就不详贴了。

按键原理图

同样的,关于GPF寄存器可以看回 Linux嵌入式学习——点个灯(二),关于GPG寄存器如下图,大同小异。GPFCON寄存器是0x56000050,而GPGCON寄存器是0x560000060,如此类推。需要注意的是,设置按键需要把寄存器设置为输入(Input)模式。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

那么,GPFCON寄存器应是这样的。

bitbitbitbitbitbitbitbit
15141312111098
--101010
76543210
--00--00

GPGCON寄存器应是这样的。

bitbitbitbitbitbitbitbit
15141312111098
--------
76543210
00------

原理过后

判断按键状态

在这里插入图片描述
结合按键的原理图看,在按键没有按下的时候,引脚是拉高状态,也就是1,在按下的时候,就是0。根据这个信息,就可以读取引脚的状态来判断按键是否按下:0 - 按下
1 - 松开

GPFDAT

bitbitbitbitbitbitbitbit
76543210
-----?-?

GPGDAT

bitbitbitbitbitbitbitbit
76543210
----?---

代码

详码如下。
因为按键和LED很多,容易混淆,所以做了宏定义处理

void delay(volatile d)
{
	while(d--);
}

#define GPFCON (*((volatile unsigned int *)0X56000050))
#define GPFDAT (*((volatile unsigned int *)0X56000054))

#define GPGCON (*((volatile unsigned int *)0X56000060))
#define GPGDAT (*((volatile unsigned int *)0X56000064))

/* LED寄存器 */
#define C_LED1 8  //GPF4
#define C_LED2 10 //GPF5
#define C_LED3 12 //GPF6
#define D_LED1 4  //GPF4
#define D_LED2 5  //GPF5
#define D_LED3 6  //GPF6

/* 按键寄存器 */
#define C_S2 0 /* GPF0 */
#define C_S3 4 /* GPF2 */
#define C_S4 6 /* GPG3 */
#define D_S2 0 /* GPF0 */
#define D_S3 2 /* GPF2 */
#define D_S4 3 /* GPG3 */
int main(void)
{

	/* 设置GPFCON的GPF4/5/6为输出引脚 
	 * GPF4(8/9位) GPF5(10/11位) GPF6(12/13位)
	 */
	GPFCON &= ~((3<<C_LED1)| (3<<C_LED2) | (3<<C_LED3)); /* 把GPFCON 需要位置清零 */
	GPFCON |=  ((1<<C_LED1)| (1<<C_LED2) | (1<<C_LED3)); /* 把GPFCON 需要位置1,即设置为输出模式*/
	
	/* 设置GPFCON的GPF0/2、GPG3为输入引脚 
	 * GPF0(0/1位) GPF2(4/5位)
	 */
	GPFCON &= ~((3<<C_S2) | (3<<C_S3)); /* 把GPGCON 需要位置清零 */
	GPGCON &= ~(3<<C_S4); /* 把GPGCON 6~7 位清零 */


	/* S2-GPF0 、 S3-GPF2 、 S4 - GPG3
	 * S2控制GPF6、S3控制GPF5、S4控制GPF4
	 * 如果按键对应DAT寄存器是零,即按键按下,反之
	 */
	while(1)
	{
		
		/* S2控制LED3 */
		if (GPFDAT&(1<<D_S2)){
			GPFDAT |= (1<<D_LED3);
		}
		else{
			GPFDAT &= ~(1<<D_LED3);
		}
		
		/* S3控制LED2 */
		if (GPFDAT&(1<<D_S3)){
			GPFDAT |= (1<<D_LED2);
		}
		else{
			GPFDAT &= ~(1<<D_LED2);
		}
		
		/* S4控制LED1 */
		if (GPGDAT&(1<<D_S4)){
			GPFDAT |= (1<<D_LED1);
		}
		else{
			GPFDAT &= ~(1<<D_LED1);
		}
	} 
}	


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值