📄 monitor.lst
字号:
C51 COMPILER V7.02b MONITOR 01/18/2005 13:48:05 PAGE 1
C51 COMPILER V7.02b, COMPILATION OF MODULE MONITOR
OBJECT MODULE PLACED IN monitor.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE monitor.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <at898252.h>
2 #include <absacc.h>
3 #include "vehicle.h"
4
5 #define LIMIT 60
6 #define uint unsigned int
7 #define uchar unsigned char
8
9 #define CSA P1_1
10 #define CSB P1_2
11 #define DI P1_3
12 #define RW P1_0
13
14 sbit uip_bit=ACC^7;//ds12c887 register a bit 7
15 sbit busy_bit=ACC^7;//lcd state byte bit 7
16 sbit run_bit=P3^3;
17
18 uchar timer0_flag=0;
19 uchar int0_flag=0;
20 uchar active_buffer=1;
21
22 uint page_counter=0;
23 uint buffer_counter=0;
24 //uchar active_buffer=1;
25 uchar circle=0;
26 uchar time_counter=0;
27 uchar year,month,day,hour,min,sec;
28 unsigned long ttcy=0;
29
30 //delay 100ms,should be adjusted for frequency and compile
31 void dl_100ms(void)
32 {
33 1 unsigned char i,j;
34 1 for (i=10;i>0;i--) for (j=0;j<250;j++) ;
35 1 }
36
37 /*下面是对液晶屏gxm12864d操作的函数,其内置的控制器是hd61202,
38 128x64点阵,汉字显示,CSA,CSB用来进行左右显示区的选择。
39 R/W,D/I两个信号我没有接在地址线上,而是用单独的端口控制,
40 数据访问通过对外部数据区的0xffff访问实现。E信号由地址译码产生
41 */
42
43 /* 发命令i到主窗口*/
44 void lcd_mwc(uchar i)
45 {
46 1 CSA=1;
47 1 CSB=0;
48 1 RW=1;
49 1 DI=0;
50 1 do {ACC=LCD;}
51 1 while (busy_bit) ;//wait for lcd not busy
52 1 RW=0;
53 1 LCD=i;
54 1 }
55
C51 COMPILER V7.02b MONITOR 01/18/2005 13:48:05 PAGE 2
56 /* 写数据i到主窗口*/
57 void lcd_mwd(uchar i)
58 {
59 1 CSA=1;
60 1 CSB=0;
61 1 RW=1;
62 1 DI=0;
63 1 do {ACC=LCD;} while (busy_bit);//wait for lcd not busy
64 1 RW=0;
65 1 DI=1;
66 1 LCD=i;
67 1 }
68
69 /* 清屏 */
70 void lcd_clear(void)
71 {
72 1 uchar i;
73 1 uchar page;
74 1 for (page=0xb8;page<0xc0;page++)
75 1 {
76 2 lcd_mwc(page); /*设置显示页面*/
77 2
78 2 lcd_mwc(0x40); /*设置列地址*/
79 2
80 2 for (i=0;i<64;i++)
81 2 {
82 3
83 3 lcd_mwd(0);
84 3 }
85 2 }
86 1 }
87
88 //初始化lcd
89 void lcd_init(void)
90 {
91 1 lcd_mwc(0xc0);
92 1
93 1 lcd_mwc(0x3f);
94 1
95 1 }
96
97 //dispm_hz_up() display up half of a hanzi in left area
98 void dispm_hz_up(uchar code * hz)
99 {
100 1 uchar i;
101 1 for (i=0;i<16;i++) lcd_mwd(*(hz+i));
102 1 }
103
104 //dispm_hz_down() display down half of a hanzi in left area
105 void dispm_hz_down(uchar code * hz)
106 {
107 1 uchar i;
108 1 for (i=16;i<32;i++) lcd_mwd(*(hz+i));
109 1 }
110
111 void disp_num(uchar i)
112 {
113 1 uchar j;
114 1 for (j=0;j<8;j++) lcd_mwd(ARAB[j+i*8]);
115 1 }
116
117
C51 COMPILER V7.02b MONITOR 01/18/2005 13:48:05 PAGE 3
118 /*set mcu counter0 as 5s timer,clk is 500ms*/
119
120 void set_5s_counter(void)
121 {
122 1 TMOD=0x16;//counter0 mode 2
123 1 TH0=-10;
124 1 TL0=-10;
125 1 IP=0x01;//int0 high,counter0 low
126 1 IT0=1;
127 1 EA=1;//enable interrupt
128 1 ET0=1;
129 1 EX0=1;
130 1 TR0=1;
131 1 }
132
133 /*下面是对flash存储卡at45d041的操作,数据接口为spi接口,
134 卡共2048页,每页264字节
135 */
136
137 void write_spi(uchar dat)
138 {
139 1 SPDR = dat;
140 1 while (!(SPSR & 0x80)) ; // wait for data transfer to be completed
141 1 }
142
143 uchar df_busy(void)
144 {
145 1 P1 &= ~DF_CHIP_SELECT; // enable DataFlash
146 1
147 1 write_spi(STAT_REG_READ);
148 1 write_spi(0x00); // don't cares
149 1
150 1 P1 |= DF_CHIP_SELECT; // disable DataFlash
151 1 return SPDR;
152 1 }
153
154 //write_to_flash write data to buffer,if buffer is full write buffer to memory page
155 void write_to_flash(uchar flash_data)
156 {
157 1 // checking if flash is busy
158 1 while (!(df_busy()&0x80)) ;
159 1 P1 &= ~DF_CHIP_SELECT; // enable DataFlash
160 1
161 1 if (active_buffer==1) write_spi(BUFFER_1_WRITE);
162 1 else write_spi(BUFFER_2_WRITE);
163 1 write_spi(0x00); // don't cares
164 1 write_spi((uchar)(buffer_counter>>8)); // don't cares plus first bit of buffer address
165 1 write_spi((uchar)buffer_counter); // buffer address
166 1 write_spi(flash_data); // write data into SPI Data Register
167 1
168 1 P1 |= DF_CHIP_SELECT; // disable DataFlash
169 1
170 1 buffer_counter++;
171 1
172 1 if (buffer_counter > 263) // if buffer full write buffer into memory page
173 1 {
174 2 buffer_counter = 0;
175 2 if (page_counter < 2047) // if memory is not full
176 2 {
177 3 P1 &= ~DF_CHIP_SELECT; // enable DataFlash
178 3
179 3 if (active_buffer==1) write_spi(B1_TO_MM_PAGE_PROG_WITHOUT_ERASE);// write data from buffer1 t
C51 COMPILER V7.02b MONITOR 01/18/2005 13:48:05 PAGE 4
-o page
180 3 else write_spi(B2_TO_MM_PAGE_PROG_WITHOUT_ERASE);//write data from buffer2 to page
181 3 write_spi((uchar)(page_counter>>7));
182 3 write_spi((uchar)(page_counter<<1));
183 3 write_spi(0x00); // don't cares
184 3
185 3 P1 |= DF_CHIP_SELECT; // disable DataFlash
186 3 page_counter++; //page_counter 指向下一可用页
187 3 }
188 2 if (active_buffer==1) active_buffer=0;
189 2 else active_buffer=1;
190 2 }
191 1 }
192
193 uchar cardin(void)
194 {
195 1 SPCR=0x5d;//interrupt disabled,spi enabled,master,msb first,spi mode 3,Fosc/16
196 1
197 1 P1 &= ~DF_CHIP_SELECT; // enable DataFlash
198 1
199 1 write_spi(MAIN_MEMORY_PAGE_READ) ;
200 1 write_spi(0x00) ;
201 1 write_spi(0x00) ;
202 1 write_spi(0x00) ;
203 1 write_spi(0x00) ;
204 1 write_spi(0x00) ;
205 1 write_spi(0x00) ;
206 1 write_spi(0x00) ;
207 1 write_spi(0xff) ;//write dummy value to start register shift
208 1
209 1 P1 |= DF_CHIP_SELECT ;//disable flash card
210 1 return SPDR;
211 1 }
212
213 /*下面是对日历时钟芯片ds12c887的部分操作,芯片初始化的操作在settime.c中实现*/
214
215 //getlstpage()从DS12C887中读取最近可用页地址
216 uint getcurpage(void)
217 {
218 1 uchar i=0;
219 1 uint j=0;
220 1 i=TIME_LSTPGH;
221 1 j=i+j;//maybe wrong
222 1 i=TIME_LSTPGL;
223 1 j=j<<8;
224 1 j=j+i;
225 1 return j;
226 1 }
227
228 //getfrnpg()从DS12C887中读取最近可用的存放终止页地址的页地址
229 uint getfrnpg(void)
230 {
231 1 uchar i=0;
232 1 uint j=0;
233 1 i=TIME_FRNPGH;
234 1 j+=i;
235 1 i=TIME_FRNPGL;
236 1 j=j<<8;
237 1 j+=i;
238 1 return j;
239 1 }
240
C51 COMPILER V7.02b MONITOR 01/18/2005 13:48:05 PAGE 5
241 //storetime() read time from ds12887 then store in flash card
242 void storetime(void)
243 {
244 1 // uchar year,month,day,hour,min,sec;
245 1 do {ACC=TIME_A;} while (uip_bit) ;//wait for UIP bit turn 0
246 1 sec=TIME_SEC;
247 1 min=TIME_MIN;
248 1 hour=TIME_HOUR;
249 1 day=TIME_DAY;
250 1 month=TIME_MONTH;
251 1 year=TIME_YEAR;
252 1 write_to_flash(year);
253 1 write_to_flash(month);
254 1 write_to_flash(day);
255 1 write_to_flash(hour);
256 1 write_to_flash(min);
257 1 write_to_flash(sec);
258 1 }
259
260 /*下面是键盘扫描和给键赋值的操作*/
261
262 //keyscan() scan keyboard and return key code
263 uchar keyscan(void)
264 {
265 1 uchar sccode,recode;
266 1 P2=0x78;
267 1 if ((P2&0x78)!=0x78)
268 1 {
269 2 dl_100ms();
270 2 if ((P2&0x78)!=0x78)
271 2 {
272 3 sccode=0xfe;
273 3 while ((sccode&0x08)!=0)
274 3 {
275 4 P2=sccode;
276 4 if((P2&0x78)!=0x78)
277 4 {
278 5 recode=(P2&0x78)|0x87;
279 5 return ((~sccode)+(~recode));
280 5 }
281 4 else sccode=(sccode<<1)|0x01;
282 4 }
283 3 }
284 2 }
285 1 return (0);
286 1 }
287
288
289 //getkey() translate key code to number ,return keyboard input number
290 uint getkey(void)
291 {
292 1 uchar num1=0;
293 1 uint num2=0;
294 1 while (num1!=0x44)
295 1 {
296 2 num1=keyscan();
297 2 switch(num1)
298 2 {
299 3 case 0x09:
300 3 num1=0;
301 3 num2=num2*10;
302 3 disp_num(num1);
C51 COMPILER V7.02b MONITOR 01/18/2005 13:48:05 PAGE 6
303 3 break;
304 3 case 0x11:
305 3 num1=1;
306 3 num2=num2*10+num1;
307 3 disp_num(num1);
308 3 break;
309 3 case 0x21:
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -