📄 receive.lst
字号:
C51 COMPILER V8.02 RECEIVE 08/18/2007 13:32:16 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE RECEIVE
OBJECT MODULE PLACED IN receive.OBJ
COMPILER INVOKED BY: D:\SOFTWARE\uv3\C51\BIN\C51.EXE receive.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <reg51.h>
2 #include <intrins.h>
3 #include<string.h>
4 #include<stdio.h>
5 #include<math.h>
6 #define uint unsigned int
7 #define uchar unsigned char
8 #define lcd_bus P1
9 #define key_bus P0
10 sbit rt=P2^4;
11 sbit enable=P2^7;
12 sbit beep=P2^5;
13 // lcd
14 sbit rs=P2^0;
15 sbit rw=P2^1;
16 sbit e =P2^2;
17 uchar offset=0x80;
18 uchar inte; //整数部分
19 uchar dec; //小数部分
20 uint detemp; //年月摄氏度
21 uchar state=0;
22 uchar TLL;
23 uchar THH;
24 uchar code hanzi[]={0x80,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02,
25 0xf,0x9,0xf,0x9,0xf,0x9,0x11,0,
26 0x1C,0x14,0x1C,0x0,0x0,0x0,0x00,0x00,
27 0x06,0x08,0x10,0x10,0x10,0x08,0x06,0x00};
28 uchar code str1[]="temperature is:";
29 uchar code str2[]="welcome";
30 uchar code str3[]="1:temperature";
31 uchar code str4[]="2:INPUT TL";
32 uchar code str5[]="3:INPUT TH";
33 uchar code key_table[16]={15,0,14,13,7,8,9,12,4,5,6,11,1,2,3,10};
34 /*****************读按键***************/
35 uchar getkey()
36 {
37 1 uchar keycode=0xff,temp,i;
38 1 key_bus=0x0f;
39 1 temp=key_bus&0x0f;
40 1 if(temp!=0x0f) //有键按下
41 1 {
42 2 key_bus=0x7f;
43 2 for(i=0;i<4;i++)
44 2 {
45 3 temp=key_bus&0x0f;
46 3 if(temp==0x07)
47 3 {
48 4 keycode=i*4;
49 4 break;
50 4 }
51 3 else if(temp==0x0b)
52 3 {
53 4 keycode=i*4+1;
54 4 break;
55 4 }
C51 COMPILER V8.02 RECEIVE 08/18/2007 13:32:16 PAGE 2
56 3 else if(temp==0x0d)
57 3 {
58 4 keycode=i*4+2;
59 4 break;
60 4 }
61 3 else if(temp==0x0e)
62 3 {
63 4 keycode=i*4+3;
64 4 break;
65 4 }
66 3 key_bus=(key_bus>>1)|0x80;
67 3 }
68 2
69 2 while((key_bus&0x0f)!=0x0f) //等待释放
70 2 {
71 3 key_bus=0x0f;
72 3 }
73 2
74 2 }
75 1 return key_table[keycode];
76 1 }
77
78
79 //////////////////////////////////////////
80 delay(uchar d)
81 {
82 1 while(--d);
83 1 }
84
85
86 /**********判断忙标志,返回的是一个位BF**********/
87 bit lcd_busy(void)
88 {
89 1 uchar bflag;
90 1 rs=0;
91 1 rw=1;
92 1 _nop_();
93 1 e=1;
94 1 _nop_();
95 1 lcd_bus=0xff;
96 1 bflag=lcd_bus;
97 1 e=0;
98 1 return(bit)(bflag&0x80); //BF=1 busy
99 1 }
100
101
102
103 /*********写命令,有两个参数,第一个是要写的命令控制字,
104 第二个是用来控制是否进行忙标志的判断。
105 busyflag=1:判断;为 0:不判断****************/
106 void lcd_wrcmd(uchar cmd)
107 {
108 1 while(lcd_busy());
109 1 lcd_bus=cmd;
110 1 rs=0;
111 1 rw=0;
112 1 _nop_();
113 1 e=1;
114 1 _nop_();
115 1 _nop_();
116 1 e=0;
117 1 }
C51 COMPILER V8.02 RECEIVE 08/18/2007 13:32:16 PAGE 3
118
119
120 /************向液晶片写数据***************/
121 void lcd_wrdata( uchar lcddata)
122 {
123 1 while(lcd_busy());
124 1 lcd_bus=lcddata;
125 1 rs=1;
126 1 rw=0;
127 1 _nop_();
128 1 e=1;
129 1 _nop_();
130 1 _nop_();
131 1 e=0;
132 1 }
133
134 /****************初始化***************/
135 void lcd_ini(void)
136 {
137 1 lcd_wrcmd(0x38);
138 1 delay(100);
139 1 lcd_wrcmd(0x0c);
140 1 delay(100);
141 1 lcd_wrcmd(0x06);
142 1 delay(100);
143 1 lcd_wrcmd(0x01);
144 1 delay(100);
145 1 }
146
147 //////////////////////////////////////////////
148 //
149 // 生成汉字子模函数
150 // 当lcd_wrdata(0);显示第一个汉字
151 // 当lcd_wrdata(1);显示第二个汉字
152 //
153 //////////////////////////////////////////////
154 lcd_h()
155 {
156 1 uchar i;
157 1 lcd_wrcmd(0x40);
158 1 for(i=0;i<32;i++) lcd_wrdata(hanzi[i]);
159 1 }
160
161
162 receivedata() interrupt 4 //接收中断
163 { uchar temp;
164 1 static bit flag_inte=0,flag_dec=0; //整数部分和小数部分的标志
165 1 temp=SBUF;
166 1 if(flag_dec==1)
167 1 {
168 2 dec=temp; //接收小数部分
169 2 flag_dec=0; // 清除小数标志
170 2 }
171 1 if(flag_inte==1)
172 1 {inte=temp; //接收整数部分
173 2 flag_inte=0; // 清除整数标志
174 2 }
175 1
176 1 if(temp==1) flag_dec=1; //表示下面发送的是小数部分
177 1 if(temp==0) flag_inte=1; //表示下面发送的是整数部分
178 1
179 1
C51 COMPILER V8.02 RECEIVE 08/18/2007 13:32:16 PAGE 4
180 1
181 1 RI=0; //清除中断标志
182 1 }
183
184
185
186 serial_init() //串口初始化
187 {
188 1
189 1
190 1 SCON=0X50; /* SCON: 串口方式1, 8位异步通信,接收使能*/
191 1 TMOD=0x20; /*波特率发生需用定时器1:TMOD: 定时器1, 8位自动重装 */
192 1 PCON= 0x80; //双倍时钟
193 1 TH1=0xfd; /* TH1:自动重装值,19200baud ,晶振11.0592MHz */
194 1 TL1=0xfd;
195 1 TR1=1; /* TR1:启动定时器1 */
196 1 ES=1;
197 1 EA=1;
198 1 }
199
200
201
202 void tempdisplay(void)
203 {
204 1 uchar i,r=0,j,iii;
205 1 uchar stra[3];
206 1 uchar xiaoshu[4];
207 1 lcd_wrcmd(0x0f);
208 1 lcd_wrcmd(0x81);
209 1 for(j=0;j<16;j++)lcd_wrdata(str1[j]);
210 1 while(1)
211 1
212 1 { if(inte<TLL||inte>=THH)
213 2 beep=1;
214 2 else beep=0;
215 2 detemp=dec*625;
216 2 xiaoshu[0]=detemp/1000+'0';
217 2 xiaoshu[1]=detemp%1000/100+'0';
218 2 xiaoshu[2]=detemp%100/10+'0';
219 2 xiaoshu[3]=detemp%10+'0';
220 2
221 2 stra[0]=inte/100+'0';
222 2 stra[1]=inte%100/10+'0';
223 2 stra[2]=inte%10+'0';
224 2 if(stra[0]=='0')
225 2 r=1;
226 2 lcd_wrcmd(0xc2+r);
227 2 for(i=r;i<3;i++)
228 2 lcd_wrdata(stra[i]);
229 2 lcd_wrdata('.');
230 2 for(i=0;i<4;i++)
231 2 lcd_wrdata(xiaoshu[i]);
232 2 delay(100);
233 2 lcd_wrdata(2);
234 2 lcd_wrdata(0x43);
235 2 for(i=0;i<4;i++)
236 2 lcd_wrdata(' ');
237 2 iii=getkey();
238 2 if(iii==13)
239 2 {
240 3 state=1;
241 3 lcd_wrcmd(0x0c);
C51 COMPILER V8.02 RECEIVE 08/18/2007 13:32:16 PAGE 5
242 3 lcd_wrcmd(1);
243 3 lcd_wrcmd(0x80);
244 3 break;
245 3 }
246 2 }
247 1
248 1 }
249
250 welcome()
251 {
252 1
253 1 uchar temp=0x12,w;
254 1 lcd_wrcmd(0x0c);
255 1 lcd_wrcmd(0x82);
256 1
257 1 for(w=0;w<strlen(str2);w++)
258 1 lcd_wrdata(str2[w]);
259 1 lcd_h();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -