矩阵键盘

矩阵键盘电路原理图

CT107D单片机中,首先将J5的跳帽接到1-2引脚,其中IAP15F2K61S2单片机中,电路变化:P37-->P44 P36-->P42

 硬件实现原理

键盘扫描原理:按键左端I/O口可接高电平或者低电平(取决于板子的原理图),右端接个上拉电阻,作用是是I/O口稳定输出高电平。

要识别出黄色按键下的按键状态:逐行扫描,然后读取列的转态信号,按下按键则为低电平,没有按下则为高电平。扫描步骤如下

1、R1输出低电平,R2,R3,R4输出高电平,若C1=C2=C3=C4输出是高电平则R1行没有按键按下;

2、R2输出低电平,R1,R3,R4输出高电平,此时C1=C2=C4输出高电平,C3输出低电平,则R2C3处有按键按下;

3、R3输出低电平,R1,R2,R4输出高电平,若C1=C2=C3=C4输出是高电平则R1行没有按键按下;

4、R4输出低电平,R1,R2,R3输出高电平,若C1=C2=C3=C4输出是高电平则R1行没有按键按下;

代码实现

  1 #include "reg52.h"
  2 
  3 sfr P4 = 0xC0;
  4 
  5 sbit R1 = P3^0;
  6 sbit R2 = P3^1;
  7 sbit R3 = P3^2;
  8 sbit R4 = P3^4;
  9 
 10 sbit C1 = P4^4;
 11 sbit C2 = P4^2;
 12 sbit C3 = P3^4;
 13 sbit C4 = P3^5;
 14 
 15 unsigned char key_num = 0;
 16 unsigned char code tab[] = 
 17 {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};
 18 
 19 void delay(unsigned int i)
 20 {
 21     while(i--);
 22 }
 23 
 24 void Select(unsigned char channel)
 25 {
 26     switch(channel)
 27     {
 28         case 4:
 29             P2 = P2 & 0x1f | 0x80;
 30         break;
 31         
 32         case 5:
 33             P2 = P2 & 0x1f | 0xa0;
 34         break;
 35         
 36         case 6:
 37             P2 = P2 & 0x1f | 0xc0;
 38         break;
 39         
 40         case 7:
 41             P2 = P2 & 0x1f | 0xe0;
 42         break;
 43     }    
 44 }
 45 
 46 void DisplayKeynum(unsigned char value)
 47 {
 48     Select(6);
 49     P0 = 0x01;
 50     Select(7);
 51     P0 = value;
 52 }
 53 
 54 void scankey()
 55 {
 56     R1 = 0;
 57     R2 = R3 = R4 = 1;
 58     C1 = C2 = C3 = C4 = 1;
 59     
 60     if(C1 == 0)
 61     {
 62         delay(1000);
 63         if(C1 == 0)
 64         {
 65             while(C1 == 0);
 66             key_num = 0;
 67             DisplayKeynum(tab[key_num]);
 68         }
 69     }
 70     
 71     else if (C2 == 0)
 72     {
 73         delay(1000);
 74         if(C2 == 0)
 75         {
 76             while(C2 == 0);
 77             key_num = 1;
 78             DisplayKeynum(tab[key_num]);
 79         }
 80     }
 81     
 82     else if (C3 == 0)
 83     {
 84         delay(1000);
 85         if(C3 == 0)
 86         {
 87             while(C3 == 0);
 88             key_num = 3;
 89             DisplayKeynum(tab[key_num]);
 90         }
 91     }
 92     
 93     else if (C4 == 0)
 94     {
 95         delay(1000);
 96         if(C4 == 0)
 97         {
 98             while(C4 == 0);
 99             key_num = 4;
100             DisplayKeynum(tab[key_num]);
101         }
102     }
103 }
104 
105 void main()
106 {
107     while(1)
108     {
109         scankey();
110     }
111 }
原文地址:https://www.cnblogs.com/kevinkala/p/13761370.html