51单片机-矩阵按键

 1 /**************************************************************************************                                                                                
 2 *                      矩阵按键实验                                                  *                        
 3 实现现象:下载程序后数码管显示0,按下矩阵按键上的按键显示对应的数字                                                                                
 4             S1-S4:0-3                                                                    
 5             S5-S8:4-7                                                                    
 6             S9-S12:8-B                                                                    
 7             S13-S16:C-F。                                                                    
 8 注意事项:如果不想让点阵模块显示,可以将74HC595模块上的JP595短接片拔掉。                                                                                  
 9 ***************************************************************************************/                                                                                
10                                                                                 
11 #include "reg52.h"             //此文件中定义了单片机的一些特殊功能寄存器                                                                    
12                                                                                 
13 typedef unsigned int u16;                                                                                
14 typedef unsigned char u8;                                                                                
15                                                                                 
16 #define GPIO_DIG P0                                                                                
17 #define GPIO_KEY P1                                                                                
18                                                                                 
19 sbit LSA=P2^2;                                                                                
20 sbit LSB=P2^3;                                                                                
21 sbit LSC=P2^4;                                                                                
22                                                                                 
23 u8 KeyValue;    //用来存放读取到的键值                                                                            
24                                                                                 
25                                                                                 
26 u8 code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                                                                                
27                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//显示0~F的值                                                            
28                                                                                 
29 /*******************************************************************************                                                                                
30 * 函 数 名         : delay                                                                                
31 * 函数功能           : 延时函数,i=1时,大约延时10us                                                                        
32 *******************************************************************************/                                                                                
33 void delay(u16 i)                                                                                
34 {                                                                                
35     while(i--);                                                                            
36 }                                                                                
37                                                                                 
38 /*******************************************************************************                                                                                
39 * 函 数 名         : KeyDown                                                                                
40 * 函数功能           : 检测有按键按下并读取键值                                                                        
41 * 输    入         : 无                                                                                
42 * 输    出         : 无                                                                                
43 *******************************************************************************/                                                                                
44 void KeyDown(void)                                                                                
45 {                                                                                
46     char a=0;                                                                            
47     GPIO_KEY=0x0f;                                                                            
48     if(GPIO_KEY!=0x0f)//读取按键是否按下            0000 1111                                                                
49     {                                                                            
50         delay(1000);//延时10ms进行消抖                                                                        
51         if(GPIO_KEY!=0x0f)//再次检测键盘是否按下                                                                        
52         {                                                                        
53             //测试列                                                                    
54             GPIO_KEY=0X0F;                                                                    
55             switch(GPIO_KEY)                                                                    
56             {                                                                    
57                 case(0X07):    KeyValue=0;break;                                                            
58                 case(0X0b):    KeyValue=1;break;                                                            
59                 case(0X0d): KeyValue=2;break;                                                                
60                 case(0X0e):    KeyValue=3;break;                                                            
61             }                                                                    
62             //测试行                                                                    
63             GPIO_KEY=0XF0;                                                                    
64             switch(GPIO_KEY)                                                                    
65             {                                                                    
66                 case(0X70):    KeyValue=KeyValue;break;                                                            
67                 case(0Xb0):    KeyValue=KeyValue+4;break;                                                            
68                 case(0Xd0): KeyValue=KeyValue+8;break;                                                                
69                 case(0Xe0):    KeyValue=KeyValue+12;break;                                                            
70             }                                                                    
71             while((a<50)&&(GPIO_KEY!=0xf0))     //检测按键松手检测                                                                
72             {                                                                    
73                 delay(1000);                                                                
74                 a++;                                                                
75             }                                                                    
76         }                                                                        
77     }                                                                            
78 }                                                                                
79                                                                                 
80                                                                                 
81 /*******************************************************************************                                                                                
82 * 函 数 名       : main                                                                                
83 * 函数功能         : 主函数                                                                        
84 * 输    入       : 无                                                                                
85 * 输    出         : 无                                                                            
86 *******************************************************************************/                                                                                
87 void main()                                                                                
88 {                                                                                
89     LSA=0; //给一个数码管提供位选                                                                            
90     LSB=0;                                                                            
91     LSC=0;                                                                            
92     while(1)                                                                            
93     {                                                                            
94         KeyDown();           //按键判断函数                                                                
95         GPIO_DIG=smgduan[KeyValue];      //                                                                    
96     }                                                                            
97 }                                                                                

猜你喜欢

转载自www.cnblogs.com/clam-hao/p/10076562.html