51单片机从零到实战(10)——矩阵按键

发布时间:2026/7/21 7:55:10
51单片机从零到实战(10)——矩阵按键 第 10 篇矩阵键盘——16 个按键只占 8 个 IO 口你有 16 个按键需要接。如果用独立按键方式需要 16 个 IO 口——STC89C52 总共才 32 个 IO。这就不得不提到IO的多路复用方式中的经典案例——矩阵按键矩阵键盘 4×4 16 个按键只占 8 个 IO。1. 矩阵键盘接线P2.0 P2.1 P2.2 P2.3 (行线输出) P2.4 [1] [2] [3] [A] P2.5 [4] [5] [6] [B] P2.6 [7] [8] [9] [C] P2.7 [*] [0] [#] [D] (列线输入)2. 行扫描法unsignedcharkey_scan(void){unsignedcharrow,col;unsignedcharkey_map[4][4]{{1,2,3,A},{4,5,6,B},{7,8,9,C},{*,0,#,D},};for(row0;row4;row){P2~(0x10row);// 逐行输出低电平// row0: P2 0xEF (1110 1111)// row1: P2 0xDF (1101 1111)// row2: P2 0xBF (1011 1111)// row3: P2 0x7F (0111 1111)if((P20x0F)!0x0F){// 有列线被拉低delay(10);// 消抖if((P20x0F)!0x0F){colP20x0F;// 读列值// 找到是第几列if(col0x0E)returnkey_map[row][0];if(col0x0D)returnkey_map[row][1];if(col0x0B)returnkey_map[row][2];if(col0x07)returnkey_map[row][3];}}}return0;// 没按键}3. 实战矩阵键盘输入 → LCD 显示voidmain(){unsignedcharkey;charbuf[17];// LCD 一行 16 字符 \0unsignedcharpos0;lcd_init();lcd_print(Input:);while(1){keykey_scan();if(key){buf[pos]key;buf[pos]\0;lcd_set_cursor(1,0);lcd_print(buf);if(pos15)pos0;// 满了从头while(key_scan());// 等松开}}}下一篇DS18B20 温度传感器——学会读传感器数据