📄 test.lst
字号:
C51 COMPILER V7.02a TEST 04/18/2006 12:47:48 PAGE 1
C51 COMPILER V7.02a, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE test.c ROM(SMALL) OPTIMIZE(9,SPEED) BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <AT89X52.H>
2 #include "string.h"
3
4 //液晶块
5 #define LCM_RW P3_6 //定义引脚
6 #define LCM_RS P3_5
7 #define LCM_E P3_7
8 #define LCM_Data P1
9 #define Busy 0x80 //用于检测LCM状态字中的Busy标识
10 typedef int byte;
11 typedef unsigned int word;
12
13 void Read_Temp(void);
14 void mychar(char,char);
15
16 void WriteDataLCM(unsigned char WDLCM);
17 void WriteCommandLCM(unsigned char WCLCM,BuysC);
18 unsigned char ReadDataLCM(void);
19 unsigned char ReadStatusLCM(void);
20 void LCMInit(void);
21 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
22 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);
23 void Delay5Ms(void);
24 void Delay400Ms(void);
25
26 void delay(word useconds)
27 {
28 1 for(;useconds>0;useconds--);
29 1 }
30
31 void mychar(char xx,char yy)
32 {
33 1
34 1 DisplayOneChar(0,0,0x54);
35 1 DisplayOneChar(1,0,0x65);
36 1 DisplayOneChar(2,0,0x6D);
37 1 DisplayOneChar(3,0,0x70);
38 1 DisplayOneChar(4,0,0x65);
39 1 DisplayOneChar(5,0,0x72);
40 1 DisplayOneChar(6,0,0x61);
41 1 DisplayOneChar(7,0,0x74);
42 1 DisplayOneChar(8,0,0x75);
43 1 DisplayOneChar(9,0,0x72);
44 1 DisplayOneChar(10,0,0x65);
45 1 DisplayOneChar(11,0,0x3A);
46 1 ///////////////////////自定义字符
47 1 WriteCommandLCM(0x48, 0); //第一行
48 1 WriteDataLCM(0x06);
49 1 WriteCommandLCM(0x49, 0); //第2行
50 1 WriteDataLCM(0x09);
51 1 WriteCommandLCM(0x4a, 0); //第3
52 1 WriteDataLCM(0x09);
53 1 WriteCommandLCM(0x4b, 0); //第4
54 1 WriteDataLCM(0x06);
55 1 WriteCommandLCM(0x4c, 0); //第5
C51 COMPILER V7.02a TEST 04/18/2006 12:47:48 PAGE 2
56 1 WriteDataLCM(0x00);
57 1 WriteCommandLCM(0x4d, 0); //第6
58 1 WriteDataLCM(0x00);
59 1 WriteCommandLCM(0x4e, 0); //第7
60 1 WriteDataLCM(0x00);
61 1 WriteCommandLCM(0x4f, 0); //第8
62 1 WriteDataLCM(0x00);
63 1 DisplayOneChar(xx,yy,0x01);
64 1 DisplayOneChar(xx+1,yy,0x43);
65 1 }
66 //写数据
67 void WriteDataLCM(unsigned char WDLCM)
68 {
69 1 ReadStatusLCM(); //检测忙
70 1 LCM_Data = WDLCM;
71 1 LCM_RS = 1;
72 1 LCM_RW = 0;
73 1 LCM_E = 0; //若晶振速度太高可以在这后加小的延时
74 1 LCM_E = 0; //延时
75 1 LCM_E = 1;
76 1 }
77
78 //写指令
79 void WriteCommandLCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测
80 {
81 1 if (BuysC) ReadStatusLCM(); //根据需要检测忙
82 1 LCM_Data = WCLCM;
83 1 LCM_RS = 0;
84 1 LCM_RW = 0;
85 1 LCM_E = 0;
86 1 LCM_E = 0;
87 1 LCM_E = 1;
88 1 }
89
90 //读状态
91 unsigned char ReadStatusLCM(void)
92 {
93 1 LCM_Data = 0xFF;
94 1 LCM_RS = 0;
95 1 LCM_RW = 1;
96 1 LCM_E = 0;
97 1 LCM_E = 0;
98 1 LCM_E = 1;
99 1 while (LCM_Data & Busy); //检测忙信号
100 1 return(LCM_Data);
101 1 }
102
103 void LCMInit(void) //LCM初始化
104 {
105 1 LCM_Data = 0;
106 1 WriteCommandLCM(0x38,0); //三次显示模式设置,不检测忙信号
107 1 Delay5Ms();
108 1 WriteCommandLCM(0x38,0);
109 1 Delay5Ms();
110 1 WriteCommandLCM(0x38,0);
111 1 Delay5Ms();
112 1
113 1 WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号
114 1 WriteCommandLCM(0x08,1); //关闭显示
115 1 WriteCommandLCM(0x01,1); //显示清屏
116 1 WriteCommandLCM(0x06,1); // 显示光标移动设置
117 1 WriteCommandLCM(0x0C,1); // 显示开及光标设置
C51 COMPILER V7.02a TEST 04/18/2006 12:47:48 PAGE 3
118 1 }
119
120 //按指定位置显示一个字符
121 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
122 {
123 1 Y &= 0x1;
124 1 X &= 0xF; //限制X不能大于15,Y不能大于1
125 1 if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;
126 1 X |= 0x80; //算出指令码
127 1 WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码
128 1 WriteDataLCM(DData);
129 1 }
130
131 //按指定位置显示一串字符 ***原来的遇到空格0x20就不显示***
132 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
133 {
134 1 unsigned char ListLength,j;
135 1 ListLength = strlen(DData);
136 1 Y &= 0x1;
137 1 X &= 0xF; //限制X不能大于15,Y不能大于1
138 1 if (X <= 0xF) //X坐标应小于0xF
139 1 {
140 2 for(j=0;j<ListLength;j++)
141 2 {
142 3 DisplayOneChar(X, Y, DData[j]); //显示单个字符
143 3 X++;
144 3 }
145 2 }
146 1 }
147
148
149 //5ms延时
150 void Delay5Ms(void)
151 {
152 1 unsigned int TempCyc = 5552;
153 1 while(TempCyc--);
154 1 }
155
156 //400ms延时
157 void Delay400Ms(void)
158 {
159 1 unsigned char TempCycA = 5;
160 1 unsigned int TempCycB;
161 1 while(TempCycA--)
162 1 {
163 2 TempCycB=7269;
164 2 while(TempCycB--);
165 2 };
166 1 }
167
168
169
170
171
172
173
174
175
176
177
178
179
C51 COMPILER V7.02a TEST 04/18/2006 12:47:48 PAGE 4
180
181
182 sbit W_IN = P2^1;
183 sbit W_OUT = P2^0;
184
185 unsigned char w_data; //接收时用于存储两次上升沿之间的时长,发送时存储前半周
186 unsigned char send_busy = 0;//存储发送时后半周
187 unsigned char recv_timer = 0;
188 bit w_stat, last_w_stat;
189
190 unsigned char jiffies=0;
191 void clock_timer(void) interrupt 1 using 1{
192 1 if (send_busy){
193 2 if(w_data){
194 3 w_data--;
195 3 w_stat = 0;
196 3 }else{
197 3 send_busy--;
198 3 w_stat = 1;
199 3 }
200 2 W_OUT = w_stat;
201 2 }else{
202 2 w_stat = W_IN;
203 2 if (w_stat != last_w_stat){
204 3 last_w_stat = w_stat;
205 3 if (w_stat){
206 4 w_data = recv_timer;
207 4 recv_timer = 0;
208 4 }
209 3 }
210 2 if (~recv_timer)//if(recv_busy != 0xff)
211 2 recv_timer++;
212 2 }
213 1 jiffies++;
214 1 }
215
216 void clock_init(void){
217 1 jiffies = 0;
218 1 TMOD=0x02;
219 1 TH0=TL0=0x0ce;//12M,50us
220 1 // TH0=TL0=0x7a;//16M
221 1 // TH0=TL0=0x75;//16.59M
222 1 // TH0=TL0=0x72;//17M
223 1 // TH0=TL0=0x37;//24M
224 1 // TH0=TL0=0x47;//22.1844M, 100us
225 1 // TH0=TL0=0xa3;//22.1844M, 50us
226 1 EA=1;
227 1 ET0=1;
228 1
229 1 TR0=1;
230 1 }
231 void init_serialcomm(void)
232 {
233 1 SCON = 0x50; //SCON: serail mode 1, 8-bit UART, enable ucvr
234 1 TMOD |= 0x20; //TMOD: timer 1, mode 2, 8-bit reload
235 1 PCON |= 0x80; //SMOD=1;
236 1 TH1 = 0x0e6; //Baud:2400 fosc=11.0592MHz :f4
237 1 TL1 = 0x0e6;
238 1 //IE |= 0x90; //Enable Serial Interrupt
239 1 TR1 = 1; // timer 1 run
240 1 RI=0;
241 1 TI=1;
C51 COMPILER V7.02a TEST 04/18/2006 12:47:48 PAGE 5
242 1 }
243
244 void serial_out(unsigned char d){
245 1 while(!TI);
246 1 TI=0;
247 1 SBUF=(d);
248 1 }
249
250
251
252 void send_string_com(unsigned char *str,int strlen)//串口程序
253 { unsigned char sum;
254 1
255 1 unsigned char k=0;
256 1 //serial_out(02);
257 1 do
258 1 { //sum^=*(str+k);
259 2 serial_out(*(str + k));
260 2 //serial_out('a');
261 2 k++;
262 2 } while(k < strlen);
263 1 //serial_out(sum);
264 1 //serial_out('e');
265 1 }
*** WARNING C280 IN LINE 253 OF TEST.C: 'sum': unreferenced local variable
266
267 //等待指定长度的串行数据到达,超时值为每两个字节之间的间隔时间而非等待整个串的时间.
268 //超时单位为time_out * 100uS
269 bit wait_serial(unsigned char *p, unsigned char len, unsigned char time_out){
270 1 unsigned int time=jiffies;
271 1 unsigned char n=0;
272 1 do{
273 2 if (RI){
274 3 p[n++]=SBUF;
275 3 RI=0;
276 3 if(n==len)
277 3 return 0;
278 3 time=jiffies;
279 3 }
280 2 }while(jiffies-time < time_out);
281 1 return 1;
282 1 }
283
284 sys_init(){
285 1 clock_init();
286 1 init_serialcomm();
287 1 }
288
289
290
291
292 //=============================================================
293 //发送程序 开始
294 //=============================================================
295
296 #define PULS_0_WIDTH 8 //低电平脉宽
297 #define PULS_1_WIDTH 16 //高电平脉宽
298 #define PULS_HEAD_WIDTH 8 //前导信号脉宽
299 #define PULS_START_WIDTH 24 //引导信号脉宽
300 #define PULS_STOP_WIDTH 8 //结束码脉宽
301
302 #define PULS_HEAD_COUNTS 16 //前导信号长度
C51 COMPILER V7.02a TEST 04/18/2006 12:47:48 PAGE 6
303
304
305 unsigned char send_buf[16];
306 #define send_byts send_buf[0] //剩余字节数,发送完后为0
307 unsigned char sending_byte; //当前正在发送的字节
308 unsigned char send_byte_p; //已发送字节数(含正在发送的字节)
309 unsigned char send_bit_p; //当前正在发送的字节已发送位数(含正在发送的位)
310
311 #define SEND_PROGRESSING 0x41
312 #define SEND_FAILED 0x21
313 #define SEND_SUCCESS 0x31
314 unsigned char send_stat = 0; //发送程序当前状态,为0时正常
315 unsigned char head_counts; //前导信号计数器(包括引导信号)
316
317 void start_send(){
318 1 send_byte_p = 0;
319 1 send_bit_p = 0;
320 1 send_stat = SEND_PROGRESSING;
321 1 head_counts = 16;
322 1 }
323
324 #define START_SEND(byts) send_buf[0]=byts;send_byts=byts;start_send()
325
326 //发送前应清除send_byte_p,send_bit_p,send_stat,并设置send_byts
327 //发送过程中可根据send_byts的值得到剩余字节数,根据send_byte_p的值得到已发送字节数.注意,将正在发送的字节当
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -