📄 display.lst
字号:
C51 COMPILER V7.06 DISPLAY 02/21/2006 10:19:59 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DISPLAY
OBJECT MODULE PLACED IN display.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE display.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #define uchar unsigned char
2 #define uint unsigned int
3 #include <AT89x51.H>
4 #include <stdio.h>
5 #include <intrins.h>
6 #include <ctype.h>
7 #include <string.h>
8
9 //给出显示闪烁初值
10 #define DB_val 100
11
12 //定义
13 #define reload_high 0x4c
14 #define reload_low 0xb0
15 #define reload_high1 0xfe
16 #define reload_low1 0x16
17
18 sfr dispdata=0x80; //定义显示口
19 sfr keybord_row=0xA0; //定义键盘的行和列地址
20 sfr keybord_col=0xB0;
21 sfr dataout=0x90;
22
23 sbit FLASH=dataout^0;
24 sbit F=keybord_row^5;
25 sbit RF=dataout^7;
26 sbit pulse_control=dataout^6;
27 sbit D5=dataout^5;
28 sbit D4=dataout^4;
29 sbit D3=dataout^3;
30 sbit D2=dataout^2;
31 sbit D1=dataout^1;
32 sbit D0=dataout^0;
33 uchar RFOUT;
34 uchar led_buf[4]; //显示缓冲区
35 uchar bdata flag;
36 sbit time_init=flag^0;
37 sbit auto_flush=flag^1;
38 sbit message_disp=flag^3;
39 sbit message_flag=flag^2; //需刷新显示置位
40 sbit auto_scanl=flag^4;
41 sbit auto_scanh=flag^5;
42 uint message_time;
43 bit fre_init=0;
44
45 typedef struct {
46 uchar tho,hun,dec,num; //定义千,百,十,个;
47 }fredispstruct;
48 fredispstruct curfre, //存当前频显
49 freholder; //存显示频点
50
51 char code bcdmap[42][4]={
52 "F999","1000","1001","1004","1005","1006","1009","1010",
53 "1011","1029","1030","1031","1049","1050","1051","1054",
54 "1055","1056","1059","1060","1061","1064","1065","1066",
55 "1069","1070","1071","1089","1090","1091","1109","1110",
C51 COMPILER V7.06 DISPLAY 02/21/2006 10:19:59 PAGE 2
56 "1111","1114","1115","1116","1119","1120","1121","1059",
57 "1060","1061"
58 };
59
60 //函数声明
61 void init_sys(void); //初始化系统
62 uchar get_ch(uchar); //键盘输入函数
63 uchar * get_str(uchar *,uint );
64 void delay(int); //延迟时间函数
65 bit kb_hit(void); //判断是否有键按下
66 void put_0ff_leds(void); //关显示
67 void monitor(void);
68 void switch_power(void); //put off switch_power
69 void disp_data(void);
70 void set_led_buf(uchar,uchar,uchar);
71 void led_buf_auto_flush(void) reentrant;
72 void error_message(void);
73 void set_fre_disp(void);
74 void scan_fre_bufL(void);
75 void scan_fre_bufH(void);
76 void fre_outl(void);
77 void fre_outm(void);
78 void fre_outh(void);
79 void pulse_switch(void);
80 void fre_up(void);
81 void fre_down(void);
82 bit compare_fre_disp(void);
83
84 /*********************************************************************
85 函数原型:void put_off_leds(void)
86 功 能:关闭LED显示器
87 *********************************************************************/
88 void put_off_leds(void)
89 {
90 1 dispdata=0x0f;
91 1 message_disp=!message_disp;
92 1 }
93
94 //延时程序
95 void delay(int delayValue)
96 {
97 1 int i;
98 1 for(i=0;i<delayValue;i++)
99 1 {};
100 1 }
101
102 /*********************************************************************
103 函数原型:void init_sys(void)
104 功 能:初始化系统
105 *********************************************************************/
106 void init_sys(void)
107 {
108 1 uint b,j;
109 1 for(b=0;b<5;b++)
110 1 {
111 2 for(j=0;j<=DB_val;j++) //系统初始化,开显示并显示8888
112 2 {
113 3 delay(25);
114 3 dispdata=0xe8;
115 3 delay(25);
116 3 dispdata=0xd8;
117 3 delay(25);
C51 COMPILER V7.06 DISPLAY 02/21/2006 10:19:59 PAGE 3
118 3 dispdata=0xb8;
119 3 delay(25);
120 3 dispdata=0x78;
121 3 };
122 2 for(j=0;j<=DB_val;j++) //系统初始化,关显示
123 2 {
124 3 delay(100);
125 3 dispdata=0xf8;
126 3 };
127 2 }
128 1 }
129
130 /*********************************************************************
131 函数原型:void get_ch(void)
132 功 能:读出按键值
133 *********************************************************************/
134 uchar get_ch(void)
135 {
136 1 uchar row=0,col=0;
137 1 uchar mask;
138 1 uchar rmask;
139 1 uchar pic;
140 1 keybord_row=0xff;
141 1 keybord_col=0xff;
142 1 mask=keybord_row&0xfe; //使第1列线为0
143 1 rmask=keybord_row&0xdf;
144 1 if(!kb_hit()) return(0); //无键按下,输入不成功,返回0。
145 1 //分析按键所在的列号。
146 1 keybord_row=mask; //使第1列线为0
147 1 while(((keybord_col&0x1f)==0x1f)&&(mask>rmask))
148 1 {
149 2 ++col;
150 2 mask=_crol_(mask,1);
151 2 keybord_row=mask;
152 2 }
153 1 //分析按键所在的行号
154 1 pic=keybord_col&0x1f;
155 1 mask=0x01;
156 1 while(pic&mask)
157 1 {
158 2 ++row;
159 2 mask=_crol_(mask,1);
160 2 }
161 1 //等待按键释放。
162 1 while((keybord_col&0x1f)!=0x1f);
163 1 //delay(20);
164 1 keybord_row=keybord_row|0x1f;
165 1 //计算按键编码值并以ASCII码值返回
166 1 pic=(row*5)+col;
167 1 if(pic<10) pic+='0';
168 1 else pic+='A'-10;
169 1 switch(pic)
170 1 {
171 2 case '0':pic='9';break;
172 2 case '1':pic='8';break;
173 2 case '2':pic='7';break;
174 2 case '5':pic='6';break;
175 2 case '6':pic='5';break;
176 2 case '7':pic='4';break;
177 2 case 'A':pic='3';break;
178 2 case 'B':pic='2';break;
179 2 case 'C':pic='1';break;
C51 COMPILER V7.06 DISPLAY 02/21/2006 10:19:59 PAGE 4
180 2 case 'F':pic='0';break;
181 2 case '3':pic='A';break;
182 2 case '4':pic='B';break;
183 2 case '8':pic='C';break;
184 2 case '9':pic='D';break;
185 2 case 'D':pic='E';break;
186 2 case 'E':pic='F';break;
187 2 default:break;
188 2 }
189 1 return(pic);
190 1 }
191
192 /*********************************************************************
193 函数原型:* get_str(uchar * str, uchar len);
194 功 能:从矩阵键盘输入长度为len的字符串,并将其储在由指针str所指向的空间,
195 并返回该指针。
196 *********************************************************************/
197 uchar * get_str(uchar * str, uint len)
198 {
199 1 //uchar data i;
200 1 uchar data ch;
201 1 uchar data keybord_buf[4]; //键盘缓冲区
202 1 uchar data ledbuf_pos=0,keybuf_pos=0; //消除显示缓冲区
203 1 set_led_buf(0x0f,0,4); //关显示
204 1 while(keybuf_pos<len)
205 1 {
206 2 disp_data();
207 2 ch=get_ch();
208 2 /*如果成功,将显示缓冲区原字符向左滚动一位*/
209 2 /*并将新字符放在显示缓冲区末尾,并送键盘缓冲区*/
210 2 if(isdigit(ch))
211 2 {
212 3 if(ledbuf_pos>3) ledbuf_pos=3;
213 3 led_buf[ledbuf_pos++]=ch;
214 3 keybord_buf[keybuf_pos++]=ch;
215 3 }
216 2 }
217 1 //for(i=0;i<100;i++)
218 1 disp_data(); //短时显示最后输入的字符
219 1 memcpy(str,keybord_buf,len);
220 1 return(str);
221 1 }
222
223 /*********************************************************************
224 函数原型:bit kb_hit(void);
225 功 能:按键
226 *********************************************************************/
227 bit kb_hit(void)
228 {
229 1 uchar kb_row;
230 1 uchar kb_col;
231 1 keybord_row=0x0ff;
232 1 keybord_col=0x0ff;
233 1 kb_row=keybord_row&0xe0; //往矩正列线送0
234 1 keybord_row=kb_row;
235 1 kb_col=keybord_col; //读出行线状态
236 1 if((keybord_col&0x1f)==0x1f) //输入并见检查行线
237 1 return((bit) 0); //行线为1则还回0
238 1 delay(100);
239 1 if((keybord_col&0x1f)==0x1f)
240 1 return((bit) 0);
241 1 return((bit) 1);
C51 COMPILER V7.06 DISPLAY 02/21/2006 10:19:59 PAGE 5
242 1 }
243
244 /*********************************************************************
245 函数原型:void monitor(void)
246 功 能:
247 *********************************************************************/
248 void monitor(void)
249 {
250 1 uchar ccommand;
251 1 while(1)
252 1 {
253 2 if(message_disp) //判断显示
254 2 disp_data();
255 2 if(message_time==0)
256 2 {
257 3 message_flag=0;
258 3 auto_flush=1;
259 3 }
260 2 if((ccommand=get_ch()))
261 2 {
262 3 message_flag=0;
263 3 message_time=0;
264 3 }
265 2 switch(ccommand)
266 2 {
267 3 //case 'M':if(!compare_fre_disp())
268 3 // error_message(); break;
269 3 case 'F':set_fre_disp(); break;
270 3 case 'A':switch_power(); break;
271 3 case 'C':put_off_leds(); break;
272 3 case 'B':scan_fre_bufL(); break; //扫描频率缓冲区中的值
273 3 case 'D':scan_fre_bufH(); break;
274 3 case 'I':fre_outl(); break;
275 3 case 'H':fre_outm(); break;
276 3 case 'G':fre_outh(); break;
277 3 case 'E':pulse_switch(); break;
278 3 case 'O':fre_up(); break;
279 3 case 'N':fre_down(); break;
280 3 default:break;
281 3 }
282 2 }
283 1 }
284
285 /*********************************************************************
286 函数原型:void disp_data(void)
287 功 能:将当前显示缓冲区的字符输出到LED显示
288 *********************************************************************/
289 void disp_data(void)
290 {
291 1 uchar dmask=0xef;
292 1 uchar pos;
293 1 for(pos=0;pos<4;pos++)
294 1 {
295 2 dispdata=(led_buf[pos]&0x0f)|(dmask&0xf0);
296 2 delay(200);
297 2 dispdata=0xff;
298 2 delay(10);
299 2 dmask=_crol_(dmask,1);
300 2 auto_flush=0;
301 2 };
302 1 }
303
C51 COMPILER V7.06 DISPLAY 02/21/2006 10:19:59 PAGE 6
304 /*********************************************************************
305 函数原型:void timer0(void)
306 功 能:中断服务程序
307 *********************************************************************/
308 void timer0(void) interrupt 1 using 2
309 {
310 1 static uchar click; //中断次数变量
311 1 static uchar scanl;
312 1 static uchar scanh;
313 1 static uchar out;
314 1 TH0=reload_high;
315 1 TL0=reload_low;
316 1 if(auto_flush) led_buf_auto_flush();
317 1 //if(!fre_init) return; //如果设置不成功,则返回
318 1 ++click;
319 1 if(click>=10)
320 1 {
321 2 click=0;
322 2 //根据消息标志决定是否将消息显示时间减少一秒。
323 2 if(message_flag&&message_time) --message_time;
324 2 if(auto_flush) led_buf_auto_flush();
325 2 }
326 1 ++scanl;
327 1 if(scanl>=60)
328 1 {
329 2 scanl=0;
330 2 if(!auto_scanl)
331 2 {
332 3 dataout=(out&0x3f)|(dataout&0xc0);
333 3 freholder.tho=bcdmap[out][0];
334 3 freholder.hun=bcdmap[out][1];
335 3 freholder.dec=bcdmap[out][2];
336 3 freholder.num=bcdmap[out][3];
337 3 led_buf_auto_flush();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -