📄 demo.lst
字号:
C51 COMPILER V8.02 DEMO 08/05/2007 19:27:06 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE DEMO
OBJECT MODULE PLACED IN demo.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE demo.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*8279键盘和LED显示程序*/
2 /*此程序响应8279的键盘中断,并根据按键来更新LED显示*/
3
4 #include<reg51.h>
5 #include<absacc.h>
6 #define uchar unsigned char
7 #define uint unsigned int
8
9 sfr AUXR = 0x8e;
10 #define COM XBYTE [0x0001] //8279的命令状态口
11 #define DAT XBYTE [0X0000] //8279的数据口
12 #define RAM XBYTE [0X8001] //8279的RAM地址
13
14 /*共阴的七段数码管译码0 1 2 3 4 5 6 7 8 9 a b c d e f*/
15 uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
16 0x39,0x5e,0x79,0x71};
17
18 ///////////////////////////////////////////////////////////////////////////////
19 //按键响应函数
20 //key0~key7 显示0~7
21 //skey0~skey7 显示8~f
22
23 void key0(void)
24 {
25 1 //在LED0上显示数字0
26 1 COM=0x80; //参见8279手册 ,写显示RAM命令
27 1 DAT=table[0]; //参见8279手册 ,把table[0]数据送给数据口DAT
28 1 }
29
30 void key1(void)
31 {
32 1 COM=0x81;
33 1 DAT=table[1];
34 1 }
35
36 void key2(void)
37 {
38 1 COM=0x82;
39 1 DAT=table[2];
40 1 }
41
42 void key3(void)
43 {
44 1 COM=0x83;
45 1 DAT=table[3];
46 1 }
47
48 void key4(void)
49 {
50 1 COM=0x84;
51 1 DAT=table[4];
52 1 }
53
54 void key5(void)
55 {
C51 COMPILER V8.02 DEMO 08/05/2007 19:27:06 PAGE 2
56 1 COM=0x85;
57 1 DAT=table[5];
58 1 }
59
60 void key6(void)
61 {
62 1 COM=0x86;
63 1 DAT=table[6];
64 1 }
65
66 void key7(void)
67 {
68 1 COM=0x87;
69 1 DAT=table[7];
70 1 }
71
72 void key8(void)
73 {
74 1 COM=0x80;
75 1 DAT=table[8];
76 1 }
77
78 void key9(void)
79 {
80 1 COM=0x80;
81 1 DAT=table[9];
82 1 }
83
84 void key10(void)
85 {
86 1 COM=0x80;
87 1 DAT=table[10];
88 1 }
89
90 void key11(void)
91 {
92 1 COM=0x80;
93 1 DAT=table[11];
94 1 }
95
96 void key12(void)
97 {
98 1 COM=0x80;
99 1 DAT=table[12];
100 1 }
101
102 void key13(void)
103 {
104 1 COM=0x80;
105 1 DAT=table[13];
106 1 }
107
108 void key14(void)
109 {
110 1 COM=0x80;
111 1 DAT=table[14];
112 1 }
113
114 void key15(void)
115 {
116 1 COM=0x80;
117 1 DAT=table[15];
C51 COMPILER V8.02 DEMO 08/05/2007 19:27:06 PAGE 3
118 1 }
119 /*带shift功能按键*/
120 void skey0(void)
121 {
122 1 COM=0x80;
123 1 DAT=table[8];
124 1 }
125
126 void skey1(void)
127 {
128 1 COM=0x81;
129 1 DAT=table[9];
130 1 }
131
132 void skey2(void)
133 {
134 1 COM=0x82;
135 1 DAT=table[10];
136 1 }
137
138 void skey3(void)
139 {
140 1 COM=0x83;
141 1 DAT=table[11];
142 1 }
143
144 void skey4(void)
145 {
146 1 COM=0x84;
147 1 DAT=table[12];
148 1 }
149
150 void skey5(void)
151 {
152 1 COM=0x85;
153 1 DAT=table[13];
154 1 }
155
156 void skey6(void)
157 {
158 1 COM=0x86;
159 1 DAT=table[14];
160 1 }
161
162 void skey7(void)
163 {
164 1 COM=0x87;
165 1 DAT=table[15];
166 1 }
167
168 void skey8(void)
169 {
170 1 COM=0x87;
171 1 DAT=table[16];
172 1 }
173
174 void skey9(void)
175 {
176 1 COM=0x81;
177 1 DAT=table[1];
178 1 }
179
C51 COMPILER V8.02 DEMO 08/05/2007 19:27:06 PAGE 4
180 void skey10(void)
181 {
182 1 COM=0x81;
183 1 DAT=table[11];
184 1 }
185
186 void skey11(void)
187 {
188 1 COM=0x81;
189 1 DAT=table[12];
190 1 }
191
192 void skey12(void)
193 {
194 1 COM=0x81;
195 1 DAT=table[13];
196 1 }
197
198 void skey13(void)
199 {
200 1 COM=0x81;
201 1 DAT=table[14];
202 1 }
203
204 void skey14(void)
205 {
206 1 COM=0x81;
207 1 DAT=table[15];
208 1 }
209
210 void skey15(void)
211 {
212 1 COM=0x81;
213 1 DAT=table[0];
214 1 }
215 ///////////////////////////////////////////////////////////////////////////////
216
217 //读取键盘数据,返回当前被按下的键号
218 uchar keyin(void)
219 {
220 1 uchar i;
221 1 COM=0x40; //读FIFO/传感器RAM的命令
222 1 i=DAT; //?? DAT原来存的是什么数据???
223 1 i=i&0x7f; //取键盘数据低7位
224 1 return(i);
225 1 }
226
227 sbit clflag=ACC^7;
228 bit int_flag=0; /*中断标志位*/
229 uchar key_value;/*中断返回键值*/
230
231 void main(void)
232 {
233 1
234 1 uchar i,j,k;
235 1
236 1 //////////////////////////////////////////////////////////////////////////////
237 1 //初始化单片机
238 1 AUXR = 0x02;/*STC单片机关内部RAM和开ALE*/
239 1 for(i=0;i<5;i++)
240 1 {
241 2 for(j=0;j<100;j++)
C51 COMPILER V8.02 DEMO 08/05/2007 19:27:06 PAGE 5
242 2 {
243 3 for(k=0;k<100;k++); //延时40ms
244 3 }
245 2 }
246 1
247 1 //////////////////////////////////////////////////////////////////////////////
248 1 //初始化8279
249 1 COM=0xd1;//1101 0001b 清除所有显示
250 1 do{ACC=COM;}
251 1 while(clflag==1); //清除起来比较慢,所以一条指令执行的时间不足以完成所有清除,故需等待
252 1 COM=0x01;COM=0x02; //??? COM=0x02???
253 1 IE=0x81;TCON=0x01; //CPU开中断,外部中断0 开中断;定时器控制 IT0=1 下降延触发方式
254 1 //////////////////////////////////////////////////////////////////////////////
255 1
256 1 //大循环
257 1 while(1)
258 1 {
259 2 while(int_flag==0) /*等待中断*/
260 2 {
261 3 //此处可填入后台程序
262 3 }
263 2
264 2 int_flag=0;
265 2
266 2 //根据键值调用键盘响应函数
267 2 switch(key_value)
268 2 {
269 3 case 0x40:key0();break;
270 3 case 0x41:key1();break;
271 3 case 0x42:key2();break;
272 3 case 0x43:key3();break;
273 3 case 0x48:key4();break;
274 3 case 0x49:key5();break;
275 3 case 0x4a:key6();break;
276 3 case 0x4b:key7();break;
277 3 case 0x50:key8();break;
278 3 case 0x51:key9();break;
279 3 case 0x52:key10();break;
280 3 case 0x53:key11();break;
281 3 case 0x58:key12();break;
282 3 case 0x59:key13();break;
283 3 case 0x5a:key14();break;
284 3 case 0x5b:key15();break;
285 3
286 3 case 0x00:skey0();break;
287 3 case 0x01:skey1();break;
288 3 case 0x02:skey2();break;
289 3 case 0x03:skey3();break;
290 3 case 0x08:skey4();break;
291 3 case 0x09:skey5();break;
292 3 case 0x0a:skey6();break;
293 3 case 0x0b:skey7();break;
294 3 case 0x10:skey8();break;
295 3 case 0x11:skey9();break;
296 3 case 0x12:skey10();break;
297 3 case 0x13:skey11();break;
298 3 case 0x18:skey12();break;
299 3 case 0x19:skey13();break;
300 3 case 0x1a:skey14();break;
301 3 case 0x1b:skey15();break;
302 3 default:break;
303 3 }
C51 COMPILER V8.02 DEMO 08/05/2007 19:27:06 PAGE 6
304 2 }
305 1 }
306
307 //INT0的中断服务函数
308 //INT0由8279在键盘按下时发出
309 //注意关键字interrupt
310 /*返回值-函数名-interrupt 对应中断源的编号 当前工作寄存器由PSW中的两位设置,
311 也可以使用using指定,指定使用,第n组寄存器,n=0~3*/
312 void int_int0() interrupt 0 using 0
313 {
314 1 //设置标志,告诉主循环中断发生了
315 1 int_flag=1;
316 1 //读取键值
317 1 key_value=keyin();
318 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 898 ----
CONSTANT SIZE = 16 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 1 ----
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 + -