uchar ScanKey() { uchar ret = 0; uchar key; uchar line, row; do { DDRB=0X0F; KEYBOARD = 0xf0; //扫描列 key =PINB&0XF0; if(key == 0xf0) break; //没有键按下 //有键按下 delay_nms(1); //延时消除抖动 key = PINB&0XF0; //再次读端口值 if(key == 0xf0) break; //没有键按下 switch(key) //有键按下,记录行值 { case 0x70: line = 3; break; case 0xb0: line = 2; break; case 0xd0: line = 1; break; case 0xe0: line = 0; break; } DDRB=0XF0; KEYBOARD = 0x0f; //扫描行 key = PINB&0X0F; if(key == 0x0f) break; //没有键按下 delay_nms(1); //延时消除抖动 key = PINB&0X0F; //再次读端口值 if(key == 0x0f) break; //没有键按下 switch(key) //有键按下,记录列值 { case 0x07: row = 3; break; case 0x0b: row = 2; break; case 0x0d: row = 1; break; case 0x0e: row = 0; break; } //查找对应的键值 ret = key_map[row][line]; // 行列 } while(0); return ret; }给这个代码画一个流程图
时间: 2024-04-25 16:26:10 浏览: 78
Serial-communication-source-code.zip_Table_uchar code table_ucha
抱歉,我作为语言模型无法绘制流程图,但我能够为您描述一下这段代码的流程:
1. 初始化变量 ret、key、line 和 row 为 0
2. 进入 do-while 循环
3. 将 DDRB 设为输出模式,将 KEYBOARD 的值设为 0xf0(11110000),用于扫描列
4. 读取 PINB 的值,并将其与 0xf0 进行按位与操作,保存在 key 变量中
5. 如果 key 的值等于 0xf0,说明没有键按下,跳出循环
6. 如果 key 的值不等于 0xf0,说明有键按下,进行消抖处理,再次读取 PINB 的值,保存在 key 变量中
7. 如果 key 的值仍然等于 0xf0,说明没有键按下,跳出循环
8. 根据 key 的值,记录下当前按下键的所在行数,保存在 line 变量中
9. 将 DDRB 设为输出模式,将 KEYBOARD 的值设为 0x0f(00001111),用于扫描行
10. 读取 PINB 的值,并将其与 0x0f 进行按位与操作,保存在 key 变量中
11. 如果 key 的值等于 0x0f,说明没有键按下,跳出循环
12. 如果 key 的值不等于 0x0f,说明有键按下,进行消抖处理,再次读取 PINB 的值,保存在 key 变量中
13. 如果 key 的值仍然等于 0x0f,说明没有键按下,跳出循环
14. 根据 key 的值,记录下当前按下键的所在列数,保存在 row 变量中
15. 在 key_map 数组中查找出对应键值,保存在 ret 变量中
16. 循环结束,返回 ret 变量的值
阅读全文