51单片机的按键实验

复制代码
 1 /*此程序为51单片机独立按键控制LED的程序,以及本人对“支持连续按”和“不支持连续按”的理解*/
 2 
 3 #include "reg52.h"
 4 
 5 //对系统默认数据类型重定义
 6 typedef unsigned int u16;
 7 typedef unsigned char u8;
 8 
 9 //定义独立按键的控制脚
10 sbit K1=P3^0;
11 sbit K2=P3^1;
12 sbit K3=P3^2;
13 sbit K4=P3^3;
14 
15 //定义LED控制引脚
16 sbit LED1=P2^0;
17 sbit LED2=P2^1;
18 sbit LED3=P2^2;
19 sbit LED4=P2^3;
20 
21 
22 
23 //使用宏定义独立按键按下的键值
24 //PS.宏定义是‌C语言中的一种预处理指令,用于在编译之前将标识符替换为特定的值或代码片段。
25 #define K1P 1
26 #define K2P 2
27 #define K3P 3
28 #define K4P 4
29 #define NKP 0
30 
31 //延时函数
32 void d10us(u16 ten)
33 {
34     while(ten--);
35 }
36 
37 //检测独立按键是否被按下,并返回键值
38 u8 ks(u8 mode)//mode=1,函数支持连续扫描,因为if(mode==1)循环,故key始终为1
39 {
40     static u8 key=1;//static局部变量只被初始化一次,下一次根据上一次的结果值
41 
42     if(mode==1)
43     {
44         key=1;
45     }
46     /*以上部分开发板给出的语句为"if(mode)key=1;"对于本人来说,不太好理解,改一下就好理解了!*/
47     if(key==1&&(K1==0||K2==0||K3==0||K4==0))
48     {
49         d10us(1000);//消抖
50         key=0;
51         if(K1==0)
52             return K1P;
53         if(K2==0)
54             return K2P;
55         if(K3==0)
56             return K3P;
57         if(K4==0)
58             return K4P;
59     }
60     else if(K1==1&&K2==1&&K3==1&&K4==1)
61         key=1;
62         return NKP;
63 }
64 /*以上这段对于本人比较难以理解,可以分步分析:
65 当mode=0时,key=1这条语句作废;进入第二个判断语句,如果有按键按下,则key=0,返回键值,下一次进入函数时,判断条件均不满足,无法再次返回键值,保持key=0;如果没有按键按下或者松手,则key=1,扫描并返回键值
66 当mode=1时,第一个判断语句满足,key=1,第二个判断语句可正常执行,每次进入函数都会key=1,完成检测和返回键值
67 */
68 //主函数
69 void main()
70 {
71     u8 key=0;//初始化key的值
72 
73     while(1)//无限循环
74     {
75         key=ks(0);//键盘函数,传递参数为0,即单次检测,键值传递给key
76         if(key==K1P)//判断哪个键按下,下一步对相应的LED作出动作
77             LED1=!LED1;
78             else if (key==K2P)
79                 LED2=!LED2;
80             else if (key==K3P)
81                 LED3=!LED3;
82             else if (key==K4P)
83                 LED4=!LED4;
84     }
85 }
复制代码

 

posted @   沐辰小尾巴  阅读(39)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
点击右上角即可分享
微信分享提示