现在贴出我自己写的4×4矩阵键盘代码和注释
1 ** 2 3 * 通过理解行列矩阵键盘,和串行数码管的原理, 4 5 *写出来本代码。下面附键盘的 6 7 * @author windmill 8 9 */? 10 #include ? <reg52.h> 11 #define uchar unsigned char 12 #define uint unsigned int 13 //Led数码管数 14 sbit DIO = P2^0;//串行数据输入 15 sbit LRCLK = P2^1;//时钟脉冲信号——上升沿有效 16 sbit LSCLK = P2^2;//打入信号————上升沿有效 17 unsigned char code LED_0F[] = 18 {// 0 1 2 34 5 6 78 9 A bC d E F - 19 0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x8C,0xBF,0xC6,0xA1,0x86,0xFF,0xbf 20 }; 21 uchar scan_keyboard(void); // 扫描键盘 22 void delay_ms(int n); //毫秒级延时函数 23 void get_LED(uchar key); //获得LED对应的数组值 24 void LED_ON(uchar x); //点亮led数码管 25 void main() 26 { 27 while(1){ 28 uchar key = scan_keyboard(); 29 get_LED(key); 30 } 31 } 32 void delay_ms(int n) 33 { 34 int i = 0, j = 0; 35 for(i = 0; i < n; i++) 36 for(j = 0; j < 100; j++); 37 } 38 void LED_ON(uchar lcode) 39 { 40 uint i; 41 for(i = 8;i >= 1; i--) 42 { 43 if (lcode & 0x80) 44 DIO = 1; 45 else 46 DIO = 0; 47 lcode <<= 1; 48 LSCLK = 0; 49 LSCLK = 1; 50 } 51 } 52 void LED_code(uchar value) 53 { 54 uchar code *led_table; // 查表指针 55 uchar lcode; //要得到的显示码 56 //显示第1位 57 led_table = LED_0F + value; 58 lcode = *led_table; 59 LED_ON(lcode); 60 LED_ON(0x01); 61 LRCLK = 0; 62 LRCLK = 1; 63 //显示第2位 64 } 65 void get_LED(uchar key) 66 { 67 if(key == 0x00) 68 return; //如果为0x00,说明没有扫描到值,返回 69 switch(key) 70 { 71 case 0xee: LED_code(0);break;//0按下相应的键显示相对应的码值 72 case 0xde: LED_code(1);break;//1 按下相应的键显示相对应的码值 73 case 0xbe: LED_code(2);break;//2 74 case 0x7e: LED_code(3);break;//3 75 case 0xed: LED_code(4);break;//4 76 case 0xdd: LED_code(5);break;//5 77 case 0xbd: LED_code(6);break;//6 78 case 0x7d: LED_code(7);break;//7 79 case 0xeb: LED_code(8);break;//8 80 case 0xdb: LED_code(9);break;//9 81 case 0xbb: LED_code(10);break;//a 82 case 0x7b: LED_code(11);break;//b 83 case 0xe7: LED_code(12);break;//c 84 case 0xd7: LED_code(13);break;//d 85 case 0xb7: LED_code(14);break;//e 86 case 0x77: LED_code(15);break;//f 87 } 88 } 89 uchar scan_keyboard() 90 { 91 uchar row_wire, col_wire; //定义行线和列线,行线0-3,列线4-7 92 P1 = 0xf0; //行线输出全为0,列线输出全为1 93 col_wire = P1 & 0xf0; //读入列线值 94 if(col_wire != 0xf0) 95 { 96 delay_ms(1); //去抖延时 97 if(col_wire != 0xf0) 98 { 99 col_wire = P1 & 0xf0; //读入列线值 100 P1 = col_wire | 0x0f; //输出当前列线值 101 row_wire = P1 & 0x0f; //读入行线值 102 return(col_wire + row_wire);//键盘最后组合码值 103 } 104 } 105 return 0x00; 106 }
下面是该矩阵键盘的proteus原理图
原文:http://www.cnblogs.com/runhang/p/4886521.html