📄 18b20_1602.lst
字号:
C51 COMPILER V8.02 18B20_1602 06/16/2007 18:49:50 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE 18B20_1602
OBJECT MODULE PLACED IN 18b20_1602.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 18b20_1602.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include <at89x52.h>
2 #include <absacc.h>
3 #include <intrins.h>
4 #include <math.h>
5 #include <stdio.h>
6
7 #define uchar unsigned char
8 #define uint unsigned int
9
10 #define LCD_COMMAND 0 //1602写命令或数据参数
11 #define LCD_DATA 1
12
13 #define RS P2_0 //1602控制端口
14 #define RW P2_1
15 #define EN P2_2
16
17 #define DBport P0 //1602数据命令口
18
19 #define DO P1_0 //18b20总线接口
20
21
22 uchar temp_l = 0; //温度值存储低位字节
23 uchar temp_h = 0; //温度值存储高位字节
24
25 uchar tempsign = 0; //温度值符号位
26 uchar temp_integer[4]; //温度整数存储数组
27 uchar temp_dicimal[5]; //温度小数存储数组
28
29 /*延时以ms为单位的t时间*/
30 void Delay(uint t)
31 {
32 1 uint i;
33 1 while(t--)
34 1 {
35 2 for(i=0; i<125; i++)
36 2 { }
37 2 }
38 1 }
39
40 /**********************************************************
41
42 等待程序
43
44 **********************************************************/
45 uchar LCD_Wait(void)
46 {
47 1 RS = 0;
48 1 RW = 1; _nop_();
49 1 EN = 1; _nop_();
50 1 //while(DBport & 0x80); _nop_();
51 1 EN = 0; _nop_();
52 1
53 1 return DBport;
54 1 }
55
C51 COMPILER V8.02 18B20_1602 06/16/2007 18:49:50 PAGE 2
56 /**********************************************************
57
58 写指令/数据
59
60 **********************************************************/
61 LCD_Write(bit style, uchar input)
62 {
63 1 RW = 0;
64 1 RS = style;
65 1 EN = 0; _nop_();
66 1 DBport = input; _nop_();
67 1 EN = 1; _nop_();
68 1 EN = 0; _nop_();
69 1
70 1 LCD_Wait();
71 1 }
72
73
74 /**********************************************************
75
76 设置屏幕初始模式
77
78 **********************************************************/
79 #define LCD_SHOW 0x0C //显示开
80 #define LCD_HIDE 0x08 //显示关
81
82 #define LCD_CURSOR 0x0A //显示光标
83 #define LCD_NO_CURSOR 0x08 //无光标
84
85 #define LCD_FLASH 0x09 //光标闪动
86 #define LCD_NO_FLASH 0x08 //光标不闪动
87
88 void LCD_SetDisplay(unsigned char DisplayMode)
89 {
90 1 LCD_Write(LCD_COMMAND, DisplayMode);
91 1 }
92
93
94 /**********************************************************
95
96 设置写完1byte数据后显示模式(输入每个字符后屏幕变化)
97
98 **********************************************************/
99 #define LCD_CURSOR_LEFT 0x04 //每写完一个字节光标左移,且AC减1
100 #define LCD_CURSOR_RIGHT 0x06 //每写完一个字节光标右移,且AC加1
101
102 #define LCD_CHAR_RIGHT 0x05 //每写完一个字节字符右移
103 #define LCD_CHAR_LEFT 0x07 //每写完一个字节字符左移
104
105 void LCD_Setinput(unsigned char InputMode)
106 {
107 1 LCD_Write(LCD_COMMAND, InputMode);
108 1 }
109
110
111 /**********************************************************
112
113 设定显示功能
114
115 **********************************************************/
116 #define LCD_DISPLAY_FUNCTION 0x38 //8位两行显示,5×7字型
117
C51 COMPILER V8.02 18B20_1602 06/16/2007 18:49:50 PAGE 3
118 void LCD_Setfunction(unsigned char Display_function)
119 {
120 1 LCD_Write(LCD_COMMAND, Display_function);
121 1 }
122
123 /**********************************************************
124
125 做完上面的设置,现在可以初始化LCD了
126
127 **********************************************************/
128 #define LCD_SCREEN_CLEAR 0x01
129
130 void Initial_LCD(void)
131 {
132 1 EN = 0;
133 1
134 1 LCD_Setfunction(LCD_DISPLAY_FUNCTION);
135 1 LCD_Setfunction(LCD_DISPLAY_FUNCTION);
136 1 //这几句顺序很重要,我随便改变了一下,竟然就没有显示了
137 1 LCD_SetDisplay(LCD_SHOW | LCD_NO_CURSOR);
138 1 LCD_Write(LCD_COMMAND, LCD_SCREEN_CLEAR);
139 1 LCD_Setinput(LCD_CURSOR_RIGHT);
140 1
141 1 }
142
143
144 /**********************************************************
145
146 令字符左移
147
148 *********************************************************
149 #define SCREEN_RIGHT_MOVE 0x18
150 #define SCREEN_LEFT_MOVE 0x1C
151 void LCD_SCREEN_MOVE(uchar Move_Director)
152 {
153 LCD_Write(LCD_COMMAND, Move_Director);
154 }*/
155
156
157 /**********************************************************
158
159 设定显示位置程序(即字符在什么位置显示出来)
160
161 **********************************************************/
162 void GotoXY(uchar x, uchar y)
163 {
164 1 if(y == 0)
165 1 {LCD_Write(LCD_COMMAND, 0x80|x);} //1602地址为第一行00H~0FH,第二行为40H~4FH,
166 1 if(y == 1) //而且写入地址命令格式为1xxx xxxx,
167 1 {LCD_Write(LCD_COMMAND, 0x80|(x-0x40));} //所以这里的0x80|(x-0x40)就是如此得出
168 1 }
169
170
171 /**********************************************************
172
173 写字符程序
174
175 **********************************************************/
176 void Print(uchar *str, uchar j)
177 {
178 1 uchar i = 0;
179 1 for(i=0; i<j; i++)
C51 COMPILER V8.02 18B20_1602 06/16/2007 18:49:50 PAGE 4
180 1 {
181 2 LCD_Write(LCD_DATA, *str);
182 2 str++;
183 2 }
184 1 }
185
186
187 /*us级延时,延时时间约4+2*i*/
188 void Delayus(uchar i)
189 {
190 1 while(--i);
191 1 }
192
193 /*产生复位脉冲,等待应答信号*/
194 bit Resetpaulse()
195 {
196 1
197 1 DO = 0; //拉低约600us
198 1 Delayus(150);
199 1 Delayus(150);
200 1
201 1 DO = 1;//产生上升沿,延时约15~60us
202 1 Delayus(30);
203 1
204 1 return(~DO); //等待应答信号
205 1
206 1 }
207
208 /*读取数据一位*/
209 bit Readbit()
210 {
211 1 uint i = 0;
212 1 bit b = 0;
213 1
214 1 DO = 0; //产生读时隙
215 1 i++; //维持低电平至少1us
216 1
217 1 DO = 1; //1us以上后拉高
218 1 Delayus(2); //延时8us,DO下降沿15内ds18b20输出的数据才有效
219 1
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -