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