📄 key.lst
字号:
C51 COMPILER V7.07 KEY 04/06/2006 10:20:44 PAGE 1
C51 COMPILER V7.07, COMPILATION OF MODULE KEY
OBJECT MODULE PLACED IN key.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE key.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <intrins.h>
2 #include <absacc.h>
3 #include "main.h"
4 #include "mcs51.h"
5 #include "io_define.h"
6 #include "ch451.h"
7
8 void deal_menu(uchar type,uchar num2);
9 void deal_device_num(void);
10 void write_menu_word(uchar n);
11 void display_main_menu(void);
12 void deal_enable(uchar num);
13 void display_second_menu(uchar type);
14 void init_CPU();
15 void putchar(unsigned char ch);
16 void putchar1(unsigned char ch);
17
18 bit rcv_bit=0;
19 bit key_bit=0;
20 bit led_time_over_bit=0;
21 bit dat_changed_bit=0;
22 uchar key_buff[3];
23 uchar key_times=0;
24 uchar bdata keyset_enable;
25 uchar key;
26 uchar rcv_byte=0x00;
27
28 uchar idata t50ms=0,t50ms1=0;
29 uchar idata t1s1=0,t1s2=0,t1s3=0;
30 uchar idata t1m1=0,t1m2=0,t1m3=0,t1h1=0,times;
31
32 uchar xdata ppout[2]={33,44};
33 uchar xdata att[2]={15,16};
34 uchar xdata gate[6]={55,55,66,66,66,66};
35 uchar xdata device_num[4]={9,5,1,9};
36
37 uchar code led_num[10]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
38 uchar code num_bit[9]={0x00,0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
39
40
41 void main(void)
42 {
43 1 uchar temp=0xff;
44 1 uchar hh=0;
45 1
46 1 init_CPU();
47 1 init_ch451();
48 1 AUXR=0X00;
49 1
50 1 display_led(2,0x11);
51 1
52 1 display_led(7,0xff);
53 1 display_led(6,0xff);
54 1 display_led(5,0xff);
55 1 display_led(4,0xff);
C51 COMPILER V7.07 KEY 04/06/2006 10:20:44 PAGE 2
56 1 display_led(3,0xff);
57 1
58 1 putchar('f');
59 1
60 1 while(t1s3<2);
61 1 clear_led();
62 1
63 1 putchar('B');
64 1
65 1 while(1)
66 1 {
67 2 //putchar('c');
68 2
69 2 temp=get_key();
70 2 if(temp>=0x40)
71 2 { key=temp;
72 3 key_bit=1;
73 3 }
74 2 else key_bit=0;
75 2
76 2 if(key_bit) // 按键处理.added.06-03-18
77 2 {
78 3 putchar(0x59);
79 3 putchar(key);
80 3 key_bit=0;
81 3 do{temp= get_key();}while((temp&0x40)!=0x00); // 等待按键松开.
82 3 putchar('w');
83 3
84 3 if(key==KEY_ENTER)
85 3 {
86 4 display_main_menu(); //进入菜单处理.
87 4 clear_led(); // 数码管清 0 .
88 4 putchar('x');
89 4 }
90 3 key_bit=0; // added by gao.06-03-22
91 3 led_time_over_bit=0;
92 3 putchar(0x88);
93 3 }
94 2 }
95 1 }
96
97 void T0_INT() interrupt 1 // using 2
98 {
99 1 TR0=0;
100 1 TH0=TH0+0x4c; //TL0=0xe0; // T0=5ms
101 1 t50ms++;
102 1 t50ms1++;
103 1
104 1 if(t50ms>=20)
105 1 { t50ms=0;
106 2 t1s1++;
107 2 t1s2++;
108 2 t1s3++;
109 2
110 2 /*putchar(0x22);
111 2 putchar(0x33);
112 2 putchar(t1s1);*/
113 2 }
114 1
115 1 if(t1s2>=60)
116 1 { t1m1++;
117 2 t1m2++;
C51 COMPILER V7.07 KEY 04/06/2006 10:20:44 PAGE 3
118 2 t1m3++;
119 2 t1s2=0;
120 2 }
121 1
122 1 if(t1m2>=60)
123 1 { t1m2=0;
124 2 t1h1++;
125 2 }
126 1 TR0=1;
127 1 }
128
129 void init_CPU()
130 {
131 1 //WDTC=100; // 需要针对 STC89C58RD+ 作修改.
132 1
133 1 SCON=0x50;
134 1 TMOD=0x21; // T1:baut,T0:Time 16bit
135 1 TCON=0x50; // TR0,TR1=1
136 1 TH1=0xfd;TL1=0xfd;PCON=0; // Uart Baut=9600
137 1 TH0=0x4c;TL0=0x00; // T0=50ms
138 1 IE=0x92; //开全局中断,定时器0。串口中断。
139 1 IP=0x10; // UART高
140 1 AUXR=0x02;//内部XRAM,ALE为1/6FOSC,AUXR=0x02外部XRAM
141 1 }
142
143 void deal_device_num(void)
144 {
145 1 uchar i;
146 1 uchar check_key;
147 1 uchar right_key=0; // 选择位,初始为第一位.
148 1 uchar num[4];
149 1
150 1 display_led(7,LED_N|0x80);
151 1
152 1 // 读出本机编号显示.
153 1
154 1 for(i=0;i<4;i++)
155 1 {
156 2 num[i]=device_num[i];
157 2 display_led(6-i,led_num[num[i]]);
158 2 }
159 1
160 1 display_led(6,led_num[num[0]]|0x80); // 默认进入时选择最高位,显示小数点.
161 1
162 1 ////EX0=1;
163 1 t1s1=0; // 显示以后再开始计时.
164 1 //while((key_bit==0)&&(t1s1<=30));
165 1 while(1)
166 1 {
167 2 if(t1s1>=30) // 超时退出.
168 2 { t1s1=0;
169 3 led_time_over_bit=1;
170 3 break;
171 3 }
172 2
173 2 check_key=get_key();
174 2 if(check_key>=0x40)
175 2 {
176 3 key=check_key;
177 3 key_bit=1;
178 3 }
179 2 else key_bit=0;
C51 COMPILER V7.07 KEY 04/06/2006 10:20:44 PAGE 4
180 2
181 2 if(key_bit) // 对按键处理.
182 2 {
183 3 do{check_key=get_key();}while((check_key&0X40)!=0X00); // 等待按键松开.
184 3 key_bit=0;
185 3 t1s1=0;
186 3
187 3 if(key==KEY_UP)
188 3 {
189 4 if(num[right_key]>0)
190 4 num[right_key]--;
191 4 display_led(6-right_key,0x80|led_num[num[right_key]]);
192 4 }
193 3
194 3 else if(key==KEY_DOWN)
195 3 {
196 4 if(num[right_key]<9)
197 4 num[right_key]++;
198 4 display_led(6-right_key,0x80|led_num[num[right_key]]);
199 4
200 4 }
201 3
202 3 else if(key==KEY_RIGHT)
203 3 { display_led(6-right_key,led_num[num[right_key]]); // 去掉原来表示选择该位的点显示.
204 4 right_key++;
205 4 if(right_key>=4)
206 4 right_key=0;
207 4 display_led(6-right_key,0x80|led_num[num[right_key]]);
208 4 }
209 3
210 3 else if(key==KEY_ENTER) // 本机编号显示,修改单独处理.
211 3 {
212 4 for(i=0;i<4;i++)
213 4 {
214 5 device_num[i]=num[i];
215 5 putchar(num[i]);
216 5 }
217 4 ////EX0=1;
218 4 break;
219 4 }
220 3
221 3 else if(key==KEY_ESC)
222 3 { ////EX0=1;
223 4 break;
224 4 }
225 3
226 3 ////EX0=1; // 本次按键处理完毕开中断.
227 3 }
228 2 }
229 1 }
230
231
232 void write_menu_word(uchar n) // 写菜单固定内容.
233 {
234 1 switch(n)
235 1 {
236 2 case 1:display_led(7,LED_T);display_led(6,LED_T);break;
237 2 case 2:display_led(7,LED_E);display_led(6,LED_A);break;
238 2 case 3:display_led(7,LED_G);display_led(6,LED_A);break;
239 2 case 4:display_led(7,LED_S);display_led(6,LED_P);break;
240 2 case 5:display_led(7,LED_P);display_led(6,LED_A);break;
241 2 case 6:display_led(7,LED_N);display_led(6,LED_b);break;
C51 COMPILER V7.07 KEY 04/06/2006 10:20:44 PAGE 5
242 2 default:break;
243 2 }
244 1 }
245
246 void display_main_menu(void) // 显示一级菜单.
247 {
248 1 uchar temp=1;
249 1 uchar check_key;
250 1
251 1 write_menu_word(temp);
252 1
253 1 t1s1=0;
254 1
255 1 while(1)
256 1 {
257 2 putchar(0x55);
258 2 putchar(IE);
259 2 putchar(TCON);
260 2 putchar(t1s1);
261 2
262 2 if(t1s1>=30) // 超时退出.
263 2 { t1s1=0;
264 3 led_time_over_bit=1;
265 3 break;
266 3 }
267 2
268 2 check_key=get_key();
269 2 if(check_key>=0x40)
270 2 {
271 3 key=check_key;
272 3 key_bit=1;
273 3 }
274 2 else key_bit=0;
275 2
276 2 if(key_bit) // 对按键处理.
277 2 {
278 3 do{check_key=get_key();}while((check_key&0X40)!=0X00); // 等待按键松开.
279 3 key_bit=0;
280 3 t1s1=0;
281 3
282 3 if(key==KEY_UP)
283 3 { if(temp>1)
284 4 temp--;
285 4 write_menu_word(temp);
286 4 }
287 3
288 3 else if(key==KEY_DOWN)
289 3 { if(temp<6)
290 4 temp++;
291 4 write_menu_word(temp);
292 4 }
293 3
294 3 else if(key==KEY_ENTER)
295 3 {
296 4 if(temp==6) // 本机编号显示,修改单独处理.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -