📄 key.lst
字号:
C51 COMPILER V7.50 KEY 09/13/2007 18:47:03 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN key.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE key.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <stdio.h>
2 #include "STC89C51RC.H"
3
4 sbit ACC_0 = ACC^0;
5 sbit ACC_1 = ACC^1;
6
7 sbit SPEAK = P3^6;
8
9 unsigned char UartStauts;
10 unsigned char SpeakOn;
11
12 unsigned char code keynum[8][8]={
13
14 /* A~Z*/
15 0x1E,0x30,0x2E,0x20,0x12,0x21,0x22,0x23,
16 0x17,0x24,0x25,0x26,0x32,0x31,0x18,0x19,
17 0x10,0x13,0x1F,0x14,0x16,0x2F,0x11,0x2D,
18 0x15,0x2C,
19
20 /* 0......9*/
21 0x0B,0x02,0x03,0x04,0x05,0x06,0x07,0x08,0x09,0x0A,
22 /*F1..….f10*/
23 0x3B,0x3C,0x3D,0x3E,0x3F,0x40,0x41,
24 /* . ; + - / */
25 0x34,0x27,0x0D,0x0C,0x35,
26 /* ↑↓←→空格 */
27 0x1E,0x1F,0x20,0x21,0x22,
28 /* Ctrl Alt Shift Esc Del */
29 0x23,0x24,0x25,0x1E,0x1F,
30 /* Insert BackSpace 回车 Pageup Pagedown End */
31 0x52,0x0E,0x1C,0x49,0x51,0x4F,
32
33
34 }; //key1~key5,enter,right,left.
35
36 unsigned char code keynum1[3]={0x01,0x02,0x03};
37
38 unsigned char Key_flag; //有键按下标志
39 unsigned char Key_num; //按下键盘值
40
41
42 /******************************************************************************
43
44 ******************************************************************************/
45 void Delay()
46 {
47 1 unsigned int i;
48 1 for(i=0;i<1000;i++){i=i;}
49 1 }
50 /******************************************************************************
51
52 ******************************************************************************/
53 void Delay20ms()
54 {
55 1 unsigned int i;
C51 COMPILER V7.50 KEY 09/13/2007 18:47:03 PAGE 2
56 1 for(i=0;i<500;i++){i=i;}
57 1 }
58 /******************************************************************************
59
60 ******************************************************************************/
61 void mcu_int()
62 {
63 1 SCON = 0x50; //串口方式1,允许接收
64 1 TMOD = 0x20; //定时器1定时方式2
65 1 TCON = 0x40; //设定时器1开始计数
66 1 TH1 = 0xFC; //14.3184MHz 9600波特率
67 1 TL1 = 0xFC;
68 1 PS = 1;
69 1
70 1 ES=1; //Enable serial
71 1 EA=1;
72 1
73 1 TI = 0;
74 1 TR1 = 1; //启动定时器
75 1 }
76
77
78 /******************************************************************************
79
80 ******************************************************************************/
81 void Char_send(unsigned char chr)
82 {
83 1
84 1 SBUF=chr;
85 1 while(!TI);
86 1 TI=0;
87 1
88 1 }
89
90 char Getdata(unsigned char num)
91 {
92 1 switch(num)
93 1 {
94 2 case 0x01 : return 0; break;
95 2 case 0x02 : return 1; break;
96 2 case 0x04 : return 2; break;
97 2 case 0x08 : return 3; break;
98 2 case 0x10 : return 4; break;
99 2 case 0x20 : return 5; break;
100 2 case 0x40 : return 6; break;
101 2 case 0x80 : return 7; break;
102 2
103 2 }
104 1 }
105 /******************************************************************************
106
107 ******************************************************************************/
108 void Key_scan()
109 {
110 1 unsigned char temp,i=0;
111 1 unsigned char line,col,s1,s2;
112 1 P2 = 0;
113 1 if((P0 != 0xff)||((P1&0x1c)!=0x1c))
114 1 {
115 2 if(SpeakOn == 1)
116 2 SPEAK = 1;
117 2 Delay20ms();
C51 COMPILER V7.50 KEY 09/13/2007 18:47:03 PAGE 3
118 2
119 2 if(P0 != 0xff)
120 2 {
121 3 Key_flag=1;
122 3
123 3 line = 0xfe;
124 3 for(i=0;i<8;i++)
125 3 {
126 4 P2 = line;
127 4 if(P0 != 0xff)
128 4 {
129 5 col = P0;
130 5 s1=Getdata(~line);
131 5 s2=Getdata(~col);
132 5 Key_num = keynum[s1][s2];
133 5 break;
134 5 }else
135 4 line=(line<<1)|0x01;
136 4
137 4 }
138 3
139 3 while(P0 != 0xff);
140 3 }
141 2
142 2 if ((P1&0x1c)!=0x1c)
143 2 {
144 3 Key_flag=1;
145 3 temp = P1&0x1c ;
146 3 switch(temp)
147 3 {
148 4
149 4 case 0x0c: Key_num=keynum1[0]; //enter
150 4 break;
151 4
152 4 case 0x14: Key_num=keynum1[1]; //right
153 4 break;
154 4
155 4 case 0x18: Key_num=keynum1[2]; //left
156 4 break;
157 4
158 4 default :
159 4 break;
160 4 }
161 3 }
162 2
163 2 }
164 1 else SPEAK = 0;
165 1 }
166
167 /******************************************************************************
168
169 ******************************************************************************/
170 void Key_send()
171 {
172 1 while(P1!=0xff);
173 1 Char_send(0xeb); //包头
174 1 Delay();
175 1 Char_send(0x67);
176 1 Delay();
177 1 Char_send(Key_num);
178 1 Delay();
179 1 Char_send(0xfb);
C51 COMPILER V7.50 KEY 09/13/2007 18:47:03 PAGE 4
180 1 }
181
182
183
184
185 /*******************UART 中断处理程序*****************************/
186 void serial0_process(void) interrupt 4 using 1
187 {
188 1 unsigned char temp;
189 1 if(RI)
190 1 {
191 2 EA=0;RI=0;
192 2
193 2 switch(UartStauts)
194 2 {
195 3 case 0 :
196 3 if(SBUF != 0xeb)UartStauts=0x00;
197 3 else UartStauts=0x01;
198 3 break;
199 3
200 3 case 1 :
201 3 temp = SBUF;
202 3 if(temp == 0x66)
203 3
204 3 UartStauts=0X02;
205 3 break;
206 3
207 3 case 2 :
208 3 temp = SBUF;
209 3 if (temp == 1)
210 3 SpeakOn = 1;
211 3 if (temp == 0)
212 3 SpeakOn = 0;
213 3 UartStauts=0x03;
214 3
215 3 break;
216 3
217 3 case 3 :
218 3 temp = SBUF;
219 3 UartStauts=0x00;
220 3
221 3 break;
222 3 }
223 2
224 2 EA=1;
225 2 }
226 1 }
227
228
229 /******************************************************************************
230
231 ******************************************************************************/
232
233 void main(void)
234 {
235 1 SPEAK = 0;
236 1 mcu_int();
237 1
238 1 while(1)
239 1 {
240 2
241 2 Key_scan();
C51 COMPILER V7.50 KEY 09/13/2007 18:47:03 PAGE 5
242 2 if(Key_flag == 1)
243 2 {
244 3 Key_flag = 0;
245 3
246 3 Key_send();
247 3
248 3 }
249 2 }
250 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 419 ----
CONSTANT SIZE = 67 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
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 + -