📄 keypad.lst
字号:
C51 COMPILER V7.50 KEYPAD 01/04/2009 21:53:54 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE KEYPAD
OBJECT MODULE PLACED IN keypad.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE keypad.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /*
3 ****************************************************
4
5 键盘
6
7 ****************************************************
8 */
9
10 #include<rtx51tny.h>
11 #include <reg52.H>
12 #include "Typedef.H"
13 #include "UserDef.H"
14 #include "Keypad.h"
15 #include "Disp_drive.h"
16 #include "chuankou_drive.h"
17
18 INT8U key_value,key_value_flag=0;
19 /* 按键对照表 */
20 static INT32U code KeyMap[][2] = {
21 // 扫描码 虚键码
22 0xFFFF, VK_NULL,
23 0xFFEF, VK_0,
24 0xFFFD, VK_1,
25 0xFFDF, VK_2,
26 0xFDFF, VK_3,
27 0xFFFB, VK_4,
28 0xFFBF, VK_5,
29 0xFBFF, VK_6,
30 0xFFF7, VK_7,
31 0xFF7F, VK_8,
32 0xF7FF, VK_9,
33 0xEFFF, VK_ADD,
34 0xDFFF, VK_SUB,
35 0xBFFF, VK_MUL,
36 0x7FFF, VK_DIV,
37 0xFEFF, VK_EQU,
38 0xFFFE, VK_CLR,
39 };
40
41
42 /* 端口定义 */
43 sbit KP_Col0 = P1^0;
44 sbit KP_Col1 = P1^1;
45 sbit KP_Col2 = P1^2;
46 sbit KP_Col3 = P1^3;
47 sbit KP_Row0 = P1^4;
48 sbit KP_Row1 = P1^5;
49 sbit KP_Row2 = P1^6;
50 sbit KP_Row3 = P1^7;
51
52
53 /* 全局变量 */
54
55
C51 COMPILER V7.50 KEYPAD 01/04/2009 21:53:54 PAGE 2
56 /***************************************************
57
58 按键扫描程序
59
60 ****************************************************/
61 INT8U Keypad_GetKey(void)
62 {
63 1 static INT8U cnt = 0; //按键消抖计数器
64 1 static INT16U PrevImg = 0x0FFF; //上次的扫描码
65 1 static INT8U PrevKey = VK_NULL; //上次有效按键的虚键码
66 1 INT16U img;
67 1 INT8U n;
68 1 BOOLEAN find;
69 1
70 1 img = 0;
71 1 find = FALSE;
72 1
73 1 //获取扫描码
74 1 P1 = 0xFF;
75 1 KP_Col0 = 0;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 1;
76 1 img |= (P1>>4); img <<= 4;
77 1 KP_Col0 = 1;KP_Col1 = 0;KP_Col2 = 1;KP_Col3 = 1;
78 1 img |= (P1>>4); img <<= 4;
79 1 KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 0;KP_Col3 = 1;
80 1 img |= (P1>>4); img <<= 4;
81 1 KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 0;
82 1 img |= (P1>>4);
83 1
84 1 //消抖
85 1 if (PrevImg != img)
86 1 {
87 2 cnt = 0;
88 2 PrevImg = img;
89 2 return VK_NULL;
90 2 }
91 1
92 1 PrevImg = img;
93 1 cnt ++;
94 1 if (cnt < 5)
95 1 {
96 2 return VK_NULL;
97 2 }
98 1
99 1 //本次消抖完毕,计数器清零,为下次消抖做准备
100 1 cnt = 0;
101 1
102 1 //获取按键的虚键码
103 1 for (n=0;n<(sizeof(KeyMap)/8);n++)
104 1 {
105 2 if (KeyMap[n][0] == img)
106 2 {
107 3 find = TRUE;
108 3 break;
109 3 }
110 2 }
111 1
112 1 if (find == TRUE)
113 1 {
114 2 if (KeyMap[n][1] != PrevKey) //只识别改变的按键动作
115 2 {
116 3 PrevKey = KeyMap[n][1];
117 3 return KeyMap[n][1];
C51 COMPILER V7.50 KEYPAD 01/04/2009 21:53:54 PAGE 3
118 3 }
119 2 else
120 2 return VK_NULL;
121 2 }
122 1 else
123 1 return VK_INVALID;
124 1 }
125
126
127 /*************************************
128 键盘扫描任务
129
130 *************************************/
131
132
133 key() _task_ TASK_KEYSCAN
134 {
135 1
136 1
137 1
138 1
139 1 while(1)
140 1 {
141 2 key_value=Keypad_GetKey();
142 2
143 2 if(key_value!=VK_NULL) //仅在数字按键按下时才允许动作
144 2 {
145 3 key_value_flag=key_value;
146 3
147 3
148 3 os_send_signal(TASK_DISP);
149 3 key_value_flag=key_value;
150 3 os_send_signal(TASK_0);
151 3
152 3 SBUF=key_value; //通过串口发送按键值
153 3 while(!TI);
154 3 TI=0;
155 3
156 3 TEST=0; //通信指示灯
157 3 os_wait(K_TMO,100,0);
158 3 TEST=1;
159 3
160 3 }
161 2 if(key_value==20)
162 2 { DispStr("ABCDEFG",1,0,0);
163 3 Str_send("ABCDEFG",7);
164 3
165 3
166 3 }
167 2 if(key_value==21)
168 2 {
169 3
170 3 Int_send(2012311);
171 3
172 3 }
173 2
174 2 if(key_value==22)
175 2 {
176 3
177 3 Str_send("*",1); //通过串口发送按键值
178 3 }
179 2
C51 COMPILER V7.50 KEYPAD 01/04/2009 21:53:54 PAGE 4
180 2 if(key_value==24)
181 2 {
182 3
183 3 DispCls();
184 3 DispStr("0.",1,14,0);
185 3 }
186 2
187 2
188 2
189 2 }
190 1
191 1
192 1
193 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 414 ----
CONSTANT SIZE = 149 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 3
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -