4×4矩阵按键扫描,不知哪里出错?
4×4 矩阵按键扫描(行线接 P1.0~P1.4; 列线接P1.5~P1.7;列线(P1.5~P1.7)通过接上拉电阻拉电源),无法返回按键值,不知哪里出错?
接线图:
源码:
// 键盘扫描函数,无按键返回 16,有键按下返回键值.uchar keyscan(void){ // row: 行号 Column: 列号 num: 按键号 // row_data: 行状态 Column_data: 列状态 uchar row, Column, num, row_data, Column_data; P1 = 0xf0; // 将行线(P1.0 ~ P1.3)拉低 if((P1 & 0xf0) != 0xf0) // 有键按下 { delay(); // 消抖 } if((P1 & 0xf0) != 0xf0) // 消抖后还是有键按下,则查找键值 { row_data = 0xfe; // 首行扫描字送变量 row_data row = 0; // 首行号送 row while(1) { P1 = row_data; // 行扫描字送 P1 口 Column_data = P1; // 读入 P1 口的列状态 if((Column_data & 0x10) == 0) { Column = 0; // 第 0 列有键按下,第 0 列首号送 Column break; } else if((Column_data & 0x20) == 0) { Column = 1; // 第 1 列有键按下,第 1 列首号送 Column break; } else if((Column_data & 0x40) == 0) { Column = 2; // 第 2 列有键按下,第 2 列首号送 Column break; } else if(Column_data & 0x80 == 0) { Column = 3; // 第 3 列有键按下,第 3 列首号送 Column break; } row += 4; // 扫描行号加 4 (第2行从 4 开始排列:0 4 8 12) row_data <<= 1; // 扫描下一行 //_crol_(row_data, 1); } num = row + Column; // 将行号与列号相加,求键号 do { P1 = 0xf0; delay(); }while((P1 & 0xf0) != 0xf0); // 等待释放按键 return num; } return 16;}