09_单片机_矩阵按键1

1. 4*4 矩阵按键图如下:

2. 利用上图LED,检测按键是否是低电平,验证矩阵按键规律

  按键 0x0F

 1 #include <REG51.H>
 2 
 3 #define LED P1
 4 #define KEY P0
 5 
 6 
 7 void main(void)
 8 {
 9     while(1)
10     {
11         KEY = 0x0f;
12         if(KEY != 0x0f)
13         {
14             LED = KEY;
15         }
16     }
17 }
View Code

  按键0xF0

 1 #include <REG51.H>
 2 
 3 #define LED P1
 4 #define KEY P0
 5 
 6 
 7 void main(void)
 8 {
 9     while(1)
10     {
11         KEY = 0xf0;
12         if(KEY != 0xf0)
13         {
14             LED = KEY;
15         }
16     }
17 }
View Code

  通过上述验证,得到如下表格

 3. 如下图,按键是横向和纵向相交,Key1 是 行1和列1 相交

 4. 4*4矩阵按键 & 数码管显示(Key1~Key16 对应 数码管0~F,默认数码管不显示)

  1 #include <REG51.H>
  2 
  3 /*******************数据类型定义*******************/
  4 typedef unsigned char u8;
  5 
  6 /*******************I/O定义*******************/
  7 #define GPIO_DIG P1
  8 #define GPIO_KEY P0
  9 
 10 /*******************函数声明*******************/
 11 void delay10ms(void);
 12 u8 KeyPress(void);
 13 
 14 /*******************变量定义*******************/
 15 u8 code dat[] = 
 16 {0x00, 0x3f, 0x06, 0x5b, 0x4f, 0x66, 0x6d, 0x7d, 0x27,
 17  0x7f, 0x6f, 0x77, 0x7c, 0x39, 0x5e, 0x79, 0x71};
 18 
 19 
 20 void main(void)
 21 {
 22     while(1)
 23     {
 24         u8 i=0;
 25         i = KeyPress();
 26         GPIO_DIG = ~dat[i];
 27         delay10ms();
 28     }
 29 }
 30 
 31 u8 KeyPress(void)
 32 {
 33     u8 row = 0;
 34     u8 column = 0;
 35     u8 result = 0;
 36     
 37     // 判断 行
 38     GPIO_KEY = 0x0f;
 39     if(GPIO_KEY != 0x0f)
 40     {
 41         delay10ms();
 42         switch(GPIO_KEY)
 43         {
 44             case(0x0e):
 45                 row = 1;
 46                 break;
 47             case(0x0d):
 48                 row = 2;
 49                 break;
 50             case(0x0b):
 51                 row = 3;
 52                 break;
 53             case(0x07):
 54                 row = 4;
 55                 break;
 56             default:
 57                 break;
 58         }
 59     }
 60     
 61     // 判断 列
 62     GPIO_KEY = 0xf0;
 63     if(GPIO_KEY != 0xf0)
 64     {
 65         delay10ms();
 66         switch(GPIO_KEY)
 67         {
 68             case(0xe0):
 69                 column = 1;
 70                 break;
 71             case(0xd0):
 72                 column = 2;
 73                 break;
 74             case(0xb0):
 75                 column = 3;
 76                 break;
 77             case(0x70):
 78                 column = 4;
 79                 break;
 80             default:
 81                 break;
 82         }
 83     }
 84     
 85     if(row == 0 && column == 0)
 86     {
 87         return result;
 88     }
 89     else
 90     {
 91         result = (row-1)*4+column;
 92         return result;
 93     }
 94 
 95 }
 96 
 97 void delay10ms(void)   
 98 {
 99     u8 a,b,c;
100     for(c=5;c>0;c--)
101         for(b=4;b>0;b--)
102             for(a=248;a>0;a--);
103 }
View Code

记录~

posted on 2023-04-10 22:58  Ivan2023  阅读(31)  评论(0)    收藏  举报