51单片机 | 实现按键查询并灯闪烁时间实验
————————————————————————————————————————————
实现功能:
功能模块:
- 初始化变量
-
主体功能(循环)
- 按键查询
- 对应LED状态及延时参数
- 改变LED状态
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
思路分析:
流程分析:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
伪代码分析:
- 初始化变量:
- 按键查询
- LED初始化
- LED改变
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
完整流程:
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
代码实现:
1 #include "reg52.h" 2 typedef unsigned char uchar; 3 typedef unsigned int uint; 4 int KEY_Detect(void); 5 void Delay(uint m); 6 void main(void) 7 { 8 uchar ledStatus; 9 uchar curDelay = 0; 10 uchar maxDelay = 20; 11 uchar keyStatus = 0xff; 12 uchar keyData = 0; 13 P3 = 0xff; 14 while(1) 15 { 16 keyData = KEY_Detect(); 17 switch (keyData) 18 { 19 case 1: 20 P1 = 0x7f; 21 ledStatus = 0; 22 maxDelay = 10; 23 curDelay = 0; 24 keyStatus = keyData; 25 break; 26 case 2: 27 P1 = 0xff; 28 keyStatus = keyData; 29 if (maxDelay < 250) 30 maxDelay += 5; 31 curDelay = maxDelay; 32 break; 33 case 3: 34 P1 = 0xff; 35 keyStatus = keyData; 36 if (maxDelay > 5) 37 maxDelay -= 5; 38 curDelay = maxDelay; 39 break; 40 default: 41 Delay(2000); 42 break; 43 } 44 if(curDelay == maxDelay) 45 { 46 switch(keyStatus) 47 { 48 case 1: 49 P1 >>= 1; 50 ledStatus++; 51 if (ledStatus == 8) 52 { 53 ledStatus = 0; 54 P1 = 0x7f; 55 } 56 break; 57 case 2: 58 case 3: 59 P1 = ~P1; 60 break; 61 default: 62 break; 63 } 64 curDelay = 0; 65 } 66 curDelay ++; 67 } 68 } 69 void Delay(unsigned int m) 70 { 71 while(m--); 72 } 73 int KEY_Detect(void) 74 { 75 uchar ucTemp = P3; 76 uchar key = 0xff; 77 if (ucTemp != 0xff) 78 { 79 Delay(2000); 80 ucTemp = P3; 81 if(ucTemp != 0xff) 82 { 83 switch(ucTemp) 84 { 85 case 0xFE: 86 key = 1; 87 break; 88 case 0xFD: 89 key = 2; 90 break; 91 case 0xFB: 92 key = 3; 93 break; 94 case 0xF7: 95 key = 4; 96 break; 97 case 0xEF: 98 key = 5; 99 break; 100 case 0xDF: 101 key = 6; 102 break; 103 case 0xBF: 104 key = 7; 105 break; 106 case 0x7F: 107 key = 8; 108 break; 109 default: 110 break; 111 } 112 } 113 } 114 while(ucTemp != 0xff) 115 ucTemp = P3; 116 return key; 117 }
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 周边上新:园子的第一款马克杯温暖上架
· 分享 3 个 .NET 开源的文件压缩处理库,助力快速实现文件压缩解压功能!
· Ollama——大语言模型本地部署的极速利器
· 使用C#创建一个MCP客户端
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!