📄 keypad.lst
字号:
C51 COMPILER V7.50 KEYPAD 11/10/2008 14:21:37 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE KEYPAD
OBJECT MODULE PLACED IN keypad.OBJ
COMPILER INVOKED BY: E:\II\Software\Keil\C51\BIN\C51.EXE keypad.c BROWSE DEBUG OBJECTEXTEND
line level source
1
2 /*
3 ****************************************************
4
5 键盘
6
7 ****************************************************
8 */
9
10
11 #include <reg52.H>
12 #include <rtx51tny.h>
13
14 #include "Typedef.H"
15 #include "UserDef.H"
16
17 #include "disp.h"
18
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 static INT8U sig_targ; // 接收键盘信号的任务
C51 COMPILER V7.50 KEYPAD 11/10/2008 14:21:37 PAGE 2
56
57 /***************************************************
58
59 按键任务
60
61 ****************************************************/
62 static void TaskKey(void) _task_ TASK_KEY
63 {
64 1 INT8U n;
65 1 INT8U cnt = 0; //按键消抖计数器
66 1 INT16U PrevImg = 0x0FFF; //上次的扫描码
67 1 INT8U PrevKey = VK_NULL;
68 1 INT16U img;
69 1
70 1 float df;
71 1 INT8U d8;
72 1 INT16U d16;
73 1 INT32U d32;
74 1 INT32S d32S;
75 1
76 1 while (1)
77 1 {
78 2 os_wait(K_TMO,10,0);
79 2
80 2 img = 0;
81 2
82 2 //获取扫描码
83 2 P1 = 0xFF;
84 2 KP_Col0 = 0;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 1;
85 2 img |= (P1>>4); img <<= 4;
86 2 KP_Col0 = 1;KP_Col1 = 0;KP_Col2 = 1;KP_Col3 = 1;
87 2 img |= (P1>>4); img <<= 4;
88 2 KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 0;KP_Col3 = 1;
89 2 img |= (P1>>4); img <<= 4;
90 2 KP_Col0 = 1;KP_Col1 = 1;KP_Col2 = 1;KP_Col3 = 0;
91 2 img |= (P1>>4);
92 2
93 2 //按键消抖:连续5次不变的按键扫描值可确认为一个稳定的按键动作
94 2 if (PrevImg != img)
95 2 {
96 3 cnt = 0;
97 3 PrevImg = img;
98 3 continue;
99 3 }
100 2
101 2 PrevImg = img;
102 2 cnt ++;
103 2 if (cnt < 5)
104 2 {
105 3 continue;
106 3 }
107 2
108 2 cnt = 0;
109 2
110 2 //按键扫描码转换为虚键码
111 2 for (n=0;n<(sizeof(KeyMap)/8);n++)
112 2 {
113 3 if (KeyMap[n][0] == img)
114 3 {
115 4 break;
116 4 }
117 3 }
C51 COMPILER V7.50 KEYPAD 11/10/2008 14:21:37 PAGE 3
118 2
119 2 if ( n < (sizeof(KeyMap)/8) ) //检索到匹配值,有合法按键按下,发送按键消息
120 2 {
121 3 if (PrevKey != KeyMap[n][1]) //只在按键值变化时发送消息
122 3 {
123 4 PrevKey = KeyMap[n][1];
124 4
125 4 switch (KeyMap[n][1])
126 4 {
127 5 case VK_0: //演示:清屏
128 5 DISP_REQ;
129 5 dm.type = DTYPE_CLS;
130 5 os_send_signal(sig_targ);
131 5 break;
132 5 case VK_1: //演示:显示单个字符
133 5 DISP_REQ;
134 5 dm.type = DTYPE_CHAR;
135 5 dm.font = 1;
136 5 dm.x = 4;
137 5 dm.y = 20;
138 5 d8 = '*';
139 5 dm.DData = &d8;
140 5 os_send_signal(sig_targ);
141 5 break;
142 5 case VK_2: //演示:显示字符串
143 5 DISP_REQ;
144 5 dm.type = DTYPE_STR;
145 5 dm.font = 1;
146 5 dm.x = 4;
147 5 dm.y = 20;
148 5 dm.DData = "Hello";
149 5 os_send_signal(sig_targ);
150 5 break;
151 5 case VK_3: //演示:显示汉字
152 5 DISP_REQ;
153 5 dm.type = DTYPE_HZ;
154 5 dm.x = 4;
155 5 dm.y = 20;
156 5 d8 = 0;
157 5 dm.DData = &d8;
158 5 os_send_signal(sig_targ);
159 5 break;
160 5 case VK_4: //演示:显示浮点数
161 5 DISP_REQ;
162 5 dm.type = DTYPE_FLOAT;
163 5 dm.font = 1;
164 5 dm.x = 4;
165 5 dm.y = 20;
166 5 dm.len = 6;
167 5 df = 1.2345;
168 5 dm.DData = &df;
169 5 os_send_signal(sig_targ);
170 5 break;
171 5 case VK_5: //演示:显示8位无符号整数
172 5 DISP_REQ;
173 5 dm.type = DTYPE_INT8U;
174 5 dm.font = 1;
175 5 dm.x = 4;
176 5 dm.y = 20;
177 5 dm.len = 3;
178 5 d8 = 147;
179 5 dm.DData = &d8;
C51 COMPILER V7.50 KEYPAD 11/10/2008 14:21:37 PAGE 4
180 5 os_send_signal(sig_targ);
181 5 break;
182 5 case VK_6: //演示:显示16位无符号整数
183 5 DISP_REQ;
184 5 dm.type = DTYPE_INT16U;
185 5 dm.font = 1;
186 5 dm.x = 4;
187 5 dm.y = 20;
188 5 dm.len = 4;
189 5 d16 = 6789;
190 5 dm.DData = &d16;
191 5 os_send_signal(sig_targ);
192 5 break;
193 5 case VK_7: //演示:显示32位无符号整数
194 5 DISP_REQ;
195 5 dm.type = DTYPE_INT32U;
196 5 dm.font = 1;
197 5 dm.x = 4;
198 5 dm.y = 20;
199 5 dm.len = 8;
200 5 d32 = 258369;
201 5 dm.DData = &d32;
202 5 os_send_signal(sig_targ);
203 5 break;
204 5 case VK_8: //演示:显示32位有符号整数
205 5 DISP_REQ;
206 5 dm.type = DTYPE_INT32S;
207 5 dm.font = 1;
208 5 dm.x = 4;
209 5 dm.y = 20;
210 5 dm.len = 8;
211 5 d32S = -69258;
212 5 dm.DData = &d32S;
213 5 os_send_signal(sig_targ);
214 5 break;
215 5 }
216 4 }
217 3 }
218 2 }
219 1 }
220
221
222 /***************************************************
223
224 任务创建函数
225
226 signal_target_task 接收键盘信号的任务编号
227
228 ****************************************************/
229 void TaskCreate_Key(INT8U signal_target_task)
230 {
231 1 sig_targ = signal_target_task;
232 1 os_create_task(TASK_KEY);
233 1 }
234
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 799 ----
CONSTANT SIZE = 142 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
C51 COMPILER V7.50 KEYPAD 11/10/2008 14:21:37 PAGE 5
DATA SIZE = 1 22
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -