📄 key.lst
字号:
C51 COMPILER V8.02 KEY 04/12/2007 10:04:26 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN key.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <Reg52.h>
2 #include <intrins.h> //_nop_();
3 #include <stdio.h>
4 #define uchar unsigned char
5 #define uint unsigned int
6 #define ulong unsigned long
7 #define nops() {_nop_();_nop_();_nop_();_nop_();_nop_();_nop_();}
8
9
10 sbit Key_Data =P3^2; //定义Keyboard引脚
11 sbit Key_CLK= P3^3;
12
13 void Delay5Ms(void);
14 void Delay400Ms(void);
15 void Decode(unsigned char ScanCode);
16 void Keyboard_out(void);
17 unsigned char code cdle_net[] = {"www.newmcu.com"};
18 unsigned char code email[] = {"zsdfwnl@163.com"};
19 unsigned char code Cls[] = {" "};
20 static unsigned char IntNum = 0; //中断次数计数
21 static unsigned char KeyV; //键值
22 static unsigned char DisNum = 0; //显示用指针
23 static unsigned char Key_UP=0, Shift = 0;//Key_UP是键松开标识,Shift是Shift键按下标识
24 static unsigned char BF = 0; //标识是否有字符被收到
25 unsigned char code UnShifted[59][2] = {
26 0x1C, 'a',
27 0x32, 'b',
28 0x21, 'c',
29 0x23, 'd',
30 0x24, 'e',
31 0x2B, 'f',
32 0x34, 'g',
33 0x33, 'h',
34 0x43, 'i',
35 0x3B, 'j',
36 0x42, 'k',
37 0x4B, 'l',
38 0x3A, 'm',
39 0x31, 'n',
40 0x44, 'o',
41 0x4D, 'p',
42 0x15, 'q',
43 0x2D, 'r',
44 0x1B, 's',
45 0x2C, 't',
46 0x3C, 'u',
47 0x2A, 'v',
48 0x1D, 'w',
49 0x22, 'x',
50 0x35, 'y',
51 0x1A, 'z',
52 0x45, '0',
53 0x16, '1',
54 0x1E, '2',
55 0x26, '3',
C51 COMPILER V8.02 KEY 04/12/2007 10:04:26 PAGE 2
56 0x25, '4',
57 0x2E, '5',
58 0x36, '6',
59 0x3D, '7',
60 0x3E, '8',
61 0x46, '9',
62 0x0E, '`',
63 0x4E, '-',
64 0x55, '=',
65 0x5D, '\\',
66 0x29, ' ',
67 0x54, '[',
68 0x5B, ']',
69 0x4C, ';',
70 0x52, '\'',
71 0x41, ',',
72 0x49, '.',
73 0x4A, '/',
74 0x71, '.',
75 0x70, '0',
76 0x69, '1',
77 0x72, '2',
78 0x7A, '3',
79 0x6B, '4',
80 0x73, '5',
81 0x74, '6',
82 0x6C, '7',
83 0x75, '8',
84 0x7D, '9',
85 };
86
87 unsigned char code Shifted[59][2] = {
88 0x1C, 'A',
89 0x32, 'B',
90 0x21, 'C',
91 0x23, 'D',
92 0x24, 'E',
93 0x2B, 'F',
94 0x34, 'G',
95 0x33, 'H',
96 0x43, 'I',
97 0x3B, 'J',
98 0x42, 'K',
99 0x4B, 'L',
100 0x3A, 'M',
101 0x31, 'N',
102 0x44, 'O',
103 0x4D, 'P',
104 0x15, 'Q',
105 0x2D, 'R',
106 0x1B, 'S',
107 0x2C, 'T',
108 0x3C, 'U',
109 0x2A, 'V',
110 0x1D, 'W',
111 0x22, 'X',
112 0x35, 'Y',
113 0x1A, 'Z',
114 0x45, '0',
115 0x16, '1',
116 0x1E, '2',
117 0x26, '3',
C51 COMPILER V8.02 KEY 04/12/2007 10:04:26 PAGE 3
118 0x25, '4',
119 0x2E, '5',
120 0x36, '6',
121 0x3D, '7',
122 0x3E, '8',
123 0x46, '9',
124 0x0E, '~',
125 0x4E, '_',
126 0x55, '+',
127 0x5D, '|',
128 0x29, ' ',
129 0x54, '{',
130 0x5B, '}',
131 0x4C, ':',
132 0x52, '"',
133 0x41, '<',
134 0x49, '>',
135 0x4A, '?',
136 0x71, '.',
137 0x70, '0',
138 0x69, '1',
139 0x72, '2',
140 0x7A, '3',
141 0x6B, '4',
142 0x73, '5',
143 0x74, '6',
144 0x6C, '7',
145 0x75, '8',
146 0x7D, '9',
147 };
148
149
150
151 void main(void)
152 {
153 1 Delay400Ms(); //启动等待,等LCM讲入工作状态
154 1
155 1 IT1 = 0; //设外部中断1为低电平触发
156 1 EA = 1;
157 1 EX1 = 1; //开中断
158 1
159 1 do
160 1 {
161 2 if (BF)
162 2 Decode(KeyV);
163 2 else
164 2 EA = 1; //开中断
165 2 }
166 1 while(1);
167 1 }
168
169 //5ms延时
170 void Delay5Ms(void)
171 {
172 1 unsigned int TempCyc = 5552;
173 1 while(TempCyc--);
174 1 }
175
176 //400ms延时
177 void Delay400Ms(void)
178 {
179 1 unsigned char TempCycA = 5;
C51 COMPILER V8.02 KEY 04/12/2007 10:04:26 PAGE 4
180 1 unsigned int TempCycB;
181 1 while(TempCycA--)
182 1 {
183 2 TempCycB=7269;
184 2 while(TempCycB--);
185 2 };
186 1 }
187
188 void Keyboard_out(void) interrupt 2
189 {
190 1 if ((IntNum > 0) && (IntNum < 9))
191 1 {
192 2 KeyV = KeyV >> 1; //因键盘数据是低>>高,结合上一句所以右移一位
193 2 if (Key_Data) KeyV = KeyV | 0x80; //当键盘数据线为1时为1到最高位
194 2 }
195 1 IntNum++;
196 1 while (!Key_CLK); //等待PS/2CLK拉高
197 1
198 1 if (IntNum > 10)
199 1 {
200 2 IntNum = 0; //当中断11次后表示一帧数据收完,清变量准备下一次接收
201 2 BF = 1; //标识有字符输入完了
202 2 EA = 0; //关中断等显示完后再开中断 (注:如这里不用BF和关中断直接调Decode()则所Decode中所调用的所有函数要声
-明为再入函数)
203 2 }
204 1 }
205
206 void Decode(unsigned char ScanCode) //注意:如SHIFT+G为12H 34H F0H 34H F0H 12H,也就是说shift的通码+G的通码
-+shift的断码+G的断码
207 {
208 1 unsigned char TempCyc;
209 1
210 1 if (!Key_UP) //当键盘松开时
211 1 {
212 2 switch (ScanCode)
213 2 {
214 3 case 0xF0 : // 当收到0xF0,Key_UP置1表示断码开始
215 3 Key_UP = 1;
216 3 break;
217 3
218 3 case 0x12 : // 左 SHIFT
219 3 Shift = 1;
220 3 break;
221 3
222 3 case 0x59 : // 右 SHIFT
223 3 Shift = 1;
224 3 break;
225 3
226 3 default:
227 3 if (DisNum > 15)
228 3 {
229 4 //DisplayListChar(0, 1, Cls);//清LCD第二行
230 4 DisNum = 0;
231 4 }
232 3 if(!Shift) //如果SHIFT没按下
233 3 {
234 4 for (TempCyc = 0;(UnShifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
235 4 //if (UnShifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, UnShifted[TempCyc][1]);
236 4 DisNum++;
237 4 }
238 3 else //按下SHIFT
239 3 {
C51 COMPILER V8.02 KEY 04/12/2007 10:04:26 PAGE 5
240 4 for(TempCyc = 0; (Shifted[TempCyc][0]!=ScanCode)&&(TempCyc<59); TempCyc++); //查表显示
241 4 //if (Shifted[TempCyc][0] == ScanCode) DisplayOneChar(DisNum, 1, Shifted[TempCyc][1]);
242 4 DisNum++;
243 4 }
244 3
245 3 break;
246 3 }
247 2 }
248 1 else
249 1 {
250 2 Key_UP = 0;
251 2 switch (ScanCode) //当键松开时不处理判码,如G 34H F0H 34H 那么第二个34H不会被处理
252 2 {
253 3 case 0x12 : // 左 SHIFT
254 3 Shift = 0;
255 3 break;
256 3
257 3 case 0x59 : // 右 SHIFT
258 3 Shift = 0;
259 3 break;
260 3 }
261 2 }
262 1 BF = 0; //标识字符处理完了
263 1 }
264
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 249 ----
CONSTANT SIZE = 269 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 6 1
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 + -