目的:通过开发板上的独立按键 K1 控制 D1 指示灯亮灭
编译软件:keil5
过程:
(1)定义独立按键控制脚
sbit KEY1=P3^1; sbit KEY2=P3^0; sbit KEY3=P3^2; sbit KEY4=P3^3;
(2)定义 LED1 控制脚
sbit LED1=P2^0;
(3)使用宏定义独立按键按下的键值
#define KEY1_PRESS 1 #define KEY2_PRESS 2 #define KEY3_PRESS 3 #define KEY4_PRESS 4 #define KEY_UNPRESS 0
(4)延时函数
void delay_10us(u16 ten_us) { while(ten_us--); }
(5)key_scan函数
函数功能 : 检测独立按键是否按下,按下则返回对应键值
输 入 : mode=0:单次扫描按键 mode=1:连续扫描按键
输 出 : KEY1_PRESS:K1 按下
KEY2_PRESS:K2 按下
KEY3_PRESS:K3 按下
KEY4_PRESS:K4 按下
KEY_UNPRESS:未有按键按下
u8 key_scan(u8 mode) { static u8 key=1; if(mode)key=1; if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0)) { delay_10us(1000); key=0; if(KEY1==0) return KEY1_PRESS; else if(KEY2==0) return KEY2_PRESS; else if(KEY3==0) return KEY3_PRESS; else if(KEY4==0) return KEY4_PRESS; } else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1) { key=1; return KEY_UNPRESS; } }
key_scan 函数带一个形参 mode,该参数用来设定是否连续扫描按键,如果 mode 为 0,只能 *** 作一次按键,只有当按键松开后才能触发下次的扫描,这样 做的好处是可以防止按下一次出现多次触发的情况。如果 mode 为 1,函数是支 持连续扫描的,即使按键未松开,在函数内部有 if(mode==1)这条判断语句,因 此 key 始终是等于 1 的,所以可以连续扫描按键,当按下某个按键,会一直返 回这 个按键的键值,这样做的好处是可以很方便实现连按 *** 作。函数内的 delay_10us(1000)即为软件消抖处理,通常延时 10ms 即可。
key_scan 函数还带有一个返回值,如果未有按键按下,返回值即为 KEY_UNPRESS,否则返回值即为对应按键的键值,如 KEY1_PRESS、KEY2_PRESS、 KEY3_PRESS、 KEY4_PRESS,这都是程序开头定义好的宏,方便大家理解和使用。 函数内定义了一个 static 变量 key,相当于全局变量,所以该函数不是一个可 重入函数。还有一点要注意的就是该函数按键的扫描是有优先级的,因为函数内 用了 if...else if...else 格式,所以最先扫描处理的按键是 KEY1,其次是 KEY2,然后是 KEY3,最后是 KEY4。如果需要将其优先级设置一样,那么可以全部用 if 语句。
main 函数中主要就是调用 key_scan 函数用于检测按键,此时传入的 mode 值为 0,表示单次扫描按键,然后将扫描按键的值保存在变量 key 中,最后通过 if 判断语句控制 LED1 状态。
(6)主函数
void main() { u8 key=0; while(1) { key=key_scan(0); if(key==KEY1_PRESS) LED1=!LED1; }
(7)编译代码得到hex文件烧录
(8) 连接P31-K1;P20-D1观察实验现象
当按下 K1 键,D1 指 示灯亮,再按下 K1 键,D1 指示灯灭,如此循环。
c51单片机学习笔记-独立按键实验现象
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)