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 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· AI与.NET技术实操系列(二):开始使用ML.NET
· 单线程的Redis速度为什么快?
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库