📄 ledls.lst
字号:
C51 COMPILER V6.12 LEDLS 08/30/2007 18:15:26 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE LEDLS
OBJECT MODULE PLACED IN .\LEDLS.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE .\LEDLS.c DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2 #include <intrins.h>
3 #define uchar unsigned char //8位
4
5 typedef unsigned char BYTE;
6 typedef unsigned int WORD;
7 typedef bit BOOL ;
8
9 sbit rs = P2^0; //寄存器选择
10 sbit rw = P2^1; //读写控制
11 sbit ep = P2^2; //使能端,由高电平跳变到低电平时,液晶执行命令
12 sbit right = P2^6;
13 BYTE dis1[]; //unsigned char code 放一些固定的数据,一般查表用,这样可以少占用ram
14 BYTE code dis2[] = {"0x0179"};
15
16 BYTE k,n;
17
18 sbit TMDAT = P3^3; //根据实实际情况设定,对应1820的DQ引脚
19 uchar TMP; //读取后温度值存于TMP中,将其除以2即可得出实际温度;
20 uchar f; //结果是否为负温,“0”为正温,“1”为负温。
21
22 ////////////////////////////////////////延时部分//////////////////////////
23 void dmsec (unsigned int count) //
24 { //
25 1 unsigned int i; //
26 1 while (count) //
27 1 { //
28 2 i = 115; //
29 2 while (i>0) i--; //
30 2 count--; //
31 2 } //
32 1 } //
33 //////////////////////////////////////////////////////////////////////////
34
35
36
37 /////////////////////////////////////// 发送复位//////////////////////////
38 void tmreset (void) // 初始化1820
39 { //
40 1 unsigned int i; //
41 1 TMDAT = 0; //
42 1 i = 103; //
43 1 while (i>0) i--; // 将信号线置为低电平,延时 900 uS(11.0592Mhz时) //
44 1 TMDAT = 1; //
45 1 i = 4; // 将信号线置为高电平,延时 35 uS
46 1 while (i>0) i--; //
47 1 } //
48 //////////////////////////////////////////////////////////////////////////
49
50
51
52 //判断DS1820是否存在的子程序。最好不要用,因为当器件不存在时将会进入死循环
53
54 ////////////////////////////////////// 等待存在脉冲///////////////////////
55 void tmpre (void) //判断器件是否存在 //
C51 COMPILER V6.12 LEDLS 08/30/2007 18:15:26 PAGE 2
56 { //
57 1 unsigned int i; //
58 1 while (TMDAT); //
59 1 while (~TMDAT); //
60 1 i = 4; while (i>0) i--; //
61 1 } //
62 //////////////////////////////////////////////////////////////////////////
63
64
65 ///////////////////////////////////// 读一位//////////////////////////////
66 bit tmrbit (void) //
67 { //
68 1 unsigned int i; //
69 1 bit dat; //
70 1 TMDAT = 0; i++; //
71 1 TMDAT = 1; i++; i++; //微量延时 //
72 1 dat = TMDAT; //
73 1 i = 8; while (i>0) i--; // 延时 //
74 1 return (dat); //
75 1 } //
76 //////////////////////////////////////////////////////////////////////////
77
78
79 //////////////////////////////////////// 读一个字节///////////////////////
80 unsigned char tmrbyte (void) //
81 { //
82 1 unsigned char i,j,dat; //
83 1 dat = 0; //
84 1 for (i=1;i<=8;i++) //
85 1 { //
86 2 j = tmrbit (); //
87 2 dat = (j << 7) | (dat >> 1); //
88 2 } //
89 1 return (dat); //
90 1 } //
91 //////////////////////////////////////////////////////////////////////////
92
93
94 /////////////////////////////////////// 写一个字节////////////////////////
95 void tmwbyte (unsigned char dat) //
96 { //
97 1 unsigned int i; //
98 1 unsigned char j; //
99 1 bit testb; //
100 1 for (j=1;j<=8;j++) //
101 1 { //
102 2 testb = dat & 0x01; // 检测最低位是1还是0
103 2 dat = dat >> 1; // 并转串,共8位
104 2 if (testb) // 如果是1
105 2 { //
106 3 TMDAT = 0; // 写0 //
107 3 i++; i++; //
108 3 TMDAT = 1; //
109 3 i = 8; while (i>0) i--; //
110 3 } //
111 2 else //
112 2 { //
113 3 TMDAT = 0; // 写0 //
114 3 i = 8; while (i>0) i--; //
115 3 TMDAT = 1; //
116 3 i++; i++; //
117 3 } //
C51 COMPILER V6.12 LEDLS 08/30/2007 18:15:26 PAGE 3
118 2 } //
119 1 } //
120 //////////////////////////////////////////////////////////////////////////
121
122 /////////////////////////////////发送ds1820 开始转换//////////////////////
123 void tmstart (void) //
124 { //
125 1 tmreset (); //复位 //
126 1 //tmpre (); //等待存在脉冲 //
127 1 dmsec (1); //延时 //
128 1 tmwbyte (0xcc); //跳过序列号命令 //
129 1 tmwbyte (0x44); //发转换命令 44H, //
130 1 } //
131 //////////////////////////////////////////////////////////////////////////
132
133
134 /////////////////////////////////// 读取温度//////////////////////////////
135 void tmrtemp (void) //
136 { //
137 1 unsigned char a,b; //
138 1 tmreset (); //复位 //
139 1 //tmpre (); //等待存在脉冲 //
140 1 dmsec (1); //延时 //
141 1 tmwbyte (0xcc); //跳过序列号命令 //
142 1 tmwbyte (0xbe); //发送读取命令 //
143 1 a = tmrbyte (); //读取低位温度 //
144 1 b = tmrbyte (); //读取高位温度 //
145 1 f=b; //若b为1则为负温 //
146 1 if(f) //
147 1 { //
148 2 TMP=~a+1; //如果为负温则去除其补码 //
149 2 } //
150 1 else //
151 1 { //
152 2 TMP=a; //
153 2 } //
154 1 } //
155 //////////////////////////////////////////////////////////////////////////
156
157 /////////////////////////////////////////////////////////////////////////
158 /////////////////////////////////////////////////////////////////////////
159 ////////////////////////////////////////////////////////////////////////
160
161
162
163 delay(BYTE ms)
164 { // 延时子程序
165 1 BYTE k;
166 1 while(ms--)
167 1 {
168 2 for(k = 0; k< 250; k++)
169 2 {
170 3 _nop_(); //NOP不执行任何操作,但占用一个字节存储单元,空耗一个指令执行周期
171 3 _nop_();
172 3 _nop_();
173 3 _nop_();
174 3 }
175 2 }
176 1 }
177
178 BOOL lcd_bz()
179 { // 测试LCD忙碌状态
C51 COMPILER V6.12 LEDLS 08/30/2007 18:15:26 PAGE 4
180 1 BOOL result;
181 1 rs = 0;
182 1 rw = 1;
183 1 ep = 1; //读数据口状态字
184 1 _nop_();
185 1 _nop_();
186 1 _nop_();
187 1 _nop_();
188 1 result = (BOOL)(P0 & 0x80); //D7为0才能进行读写操作
189 1 ep = 0;
190 1 return result;
191 1 }
192
193 lcd_wcmd(BYTE cmd)
194 { // 写入指令数据到LCD
195 1 while(lcd_bz());
196 1 rs = 0;
197 1 rw = 0;
198 1 ep = 0;
199 1 _nop_();
200 1 _nop_();
201 1 P0 = cmd;
202 1 _nop_();
203 1 _nop_();
204 1 _nop_();
205 1 _nop_();
206 1 ep = 1; //////
207 1 _nop_();
208 1 _nop_();
209 1 _nop_(); //高变低,液晶模块执行命令
210 1 _nop_();
211 1 ep = 0; //////
212 1 }
213
214 lcd_pos(BYTE pos)
215 { //设定显示位置
216 1 lcd_wcmd(pos | 0x80);
217 1 }
218
219 lcd_wdat(BYTE dat)
220 { //写入字符显示数据到LCD
221 1 while(lcd_bz());
222 1 rs = 1;
223 1 rw = 0;
224 1 ep = 0;
225 1 P0 = dat;
226 1 _nop_();
227 1 _nop_();
228 1 _nop_();
229 1 _nop_();
230 1 ep = 1;
231 1 _nop_();
232 1 _nop_();
233 1 _nop_();
234 1 _nop_();
235 1 ep = 0;
236 1 }
237
238 lcd_init()
239 { //LCD初始化设定
240 1 lcd_wcmd(0x38); //显示模式设定 00111000(0x38),设置16*2显示,5*7点阵,8位数据接口
241 1 delay(1);
C51 COMPILER V6.12 LEDLS 08/30/2007 18:15:26 PAGE 5
242 1 lcd_wcmd(0x0c); //显示开关及光标位置 0000 1100(0x0c),开显示,不显示光标
243 1 delay(1);
244 1 lcd_wcmd(0x06); // 0000 0110(0x06),当读写一个字符后,地址指针加1,且光标加1
245 1 delay(1);
246 1 lcd_wcmd(0x01); //清除LCD的显示内容
247 1 delay(1);
248 1 }
249
250
251
252
253 //////////////////////////////////////////////////////////////////////////
254 main() //
255 { //
256 1 do{ //
257 2 tmstart(); //
258 2 dmsec(1000); //如果是不断地读取的话可以不延时 //
259 2 tmrtemp(); //读取温度,执行完毕温度将存于TMP中 //
260 2 //P0=TMP;
261 2 //right=0;
262 2 lcd_init(); // 初始化LCD
263 2 delay(10);
264 2 // dis1=TMP;
265 2 for (n=1;n<=8;n++) //
266 2 { //
267 3 dis1[n] = TMP & 0x01; //
268 3 TMP = TMP >> 1;
269 3 }
270 2 lcd_pos(4); // 设置显示位置为第一行的第5个字符
271 2 k = 0;
272 2 // while(dis1[k] != '\0') // 显示第一句话 "hificat.com"
273 2 for (k=1;k<=8;k++)
274 2 { // 显示字符
275 3 lcd_wdat(dis1[k]);
276 3 k++;
277 3
278 3 }
279 2
280 2 lcd_pos(0x41); // 设置显示位置为第二行第二个字符
281 2 k = 0;
282 2 while(dis2[k] != '\0') // 显示第二句话 "0571-85956028"
283 2 {
284 3 lcd_wdat(dis2[k]); // 显示字符
285 3 k++;
286 3 }
287 2
288 2
289 2 }while(1); //
290 1 } //
291 //////////////////////////////////////////////////////////////////////////
292
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 517 ----
CONSTANT SIZE = 7 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 ----
IDATA SIZE = ---- ----
BIT SIZE = ---- 3
END OF MODULE INFORMATION.
C51 COMPILER V6.12 LEDLS 08/30/2007 18:15:26 PAGE 6
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -