📄 text1.lst
字号:
C51 COMPILER V7.20 TEXT1 08/11/2007 15:23:53 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE Text1.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2 #include<intrins.h>
3 #define uint unsigned int
4 #define uchar unsigned char
5 //数据口定义
6 #define lcd1602_bus P0
7
8 //引脚定义
9 sbit rs_1602=P2^5;
10 sbit rw_1602=P2^6;
11 sbit e_1602=P2^7;
12 sbit alarm=P0^0;
13
14 uchar tplsb,tpmsb;
15 uint temp,tempx;
16 sbit DQ=P2^0;
17
18
19
20 uchar state;
21 uchar bdata adc_549;
22 sbit adc_549low=adc_549^0;
23 uchar s;
24 uchar mea,m[2];
25 uint in[2];
26
27
28
29 /*********延时子程序**********/
30 void delay(uchar t)
31 {
32 1 uchar i;
33 1 while(t--)
34 1 {
35 2 /* 对于11.0592M时钟,约延时1ms */
36 2 for (i=0;i<125;i++)
37 2 {}
38 2 }
39 1 }
40
41
42 /*****************启动总线**********************/
43
44
45 /*****************停止IIC总线****************/
46
47
48 /**************检查应答位*******************/
49
50
51 /*****************不对IIC总线产生应答***************/
52
53 /*******************向IIC总线写数据*********************/
54
55
C51 COMPILER V7.20 TEXT1 08/11/2007 15:23:53 PAGE 2
56
57
58 /***********忙判断标志,返回一个位BF********************/
59 bit lcd1602_busy(void)
60 {
61 1 uchar busy_flag;
62 1 rs_1602=0;
63 1 rw_1602=1;
64 1 _nop_();
65 1 e_1602=1;
66 1 _nop_();
67 1 lcd1602_bus=0xff;
68 1 busy_flag=lcd1602_bus; //e在高电平时读
69 1 e_1602=0;
70 1 return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
71 1 }
72
73
74 /********写命令,有两个参数,一个是要写的命令控制字,
75 第二个是用来控制是否进行忙标志的判断。
76 busyflag=1;
77 判断: 为0
78 ***************/
79 void lcd1602_wrcmd(unsigned char lcdcmd)
80 {
81 1 while(lcd1602_busy()); //等待空闲
82 1 lcd1602_bus=lcdcmd;
83 1 rs_1602=0;
84 1 rw_1602=0;
85 1 _nop_();
86 1 e_1602=1;
87 1 _nop_();
88 1 _nop_();
89 1 e_1602=0; //产生一个下沿
90 1 }
91
92
93
94 /***************向液晶写数据******************/
95 void lcd1602_wrdata(uchar lcddata)
96 {
97 1 while(lcd1602_busy()); //等待空闲
98 1 lcd1602_bus=lcddata; //在下沿的时候写数据
99 1 rs_1602=1;
100 1 rw_1602=0;
101 1 _nop_();
102 1 e_1602=1;
103 1 _nop_();
104 1 _nop_();
105 1 e_1602=0;
106 1 //lcd_bus=0xff;
107 1 }
108
109
110 /************液晶的清屏************/
111 void lcd1602_clear(void)
112 {
113 1 lcd1602_wrcmd(0x01); //液晶清屏控制字 并延时>40us
114 1 delay(1);
115 1 }
116
117 /***********1602液晶的初始化***************/
C51 COMPILER V7.20 TEXT1 08/11/2007 15:23:53 PAGE 3
118 void lcd1602_init(void)
119 {
120 1 lcd1602_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
121 1 delay(1);
122 1 lcd1602_wrcmd(0x0e); //显示开关控制----显示开关开,光标开关关,闪烁开关关
123 1 delay(1);
124 1 lcd1602_wrcmd(0x06); //输入方式设置,AC自增1, S=0;
125 1 delay(1);
126 1 lcd1602_wrcmd(0x01); //清屏
127 1 delay(1);
128 1 }
129
130
131 /**********4*4矩阵键盘****************/
132 /************
133 矩阵键盘
134 D---------P1.0
135 C---------P1.1
136 B---------P1.2
137 A---------P1.3
138 1---------P1.4
139 2---------P1.5
140 3---------P1.6
141 4---------P1.7
142 按键值的分布
143 D C B A
144 1〔15 14 13 12〕
145 2〔11 10 9 8〕
146 3〔 7 6 5 4〕
147 4〔 3 2 1 0〕
148 利用已有的那个按键程序
149 *************/
150
151 void TxReset(void)
152 {
153 1 uint i;
154 1 DQ = 0;
155 1
156 1 /* 拉低约900us */
157 1 i = 100;
158 1 while (i>0) i--;
159 1
160 1 DQ = 1; // 产生上升沿
161 1 i = 4;
162 1 while (i>0) i--;
163 1 }
164
165 /* 等待应答脉冲 */
166 void RxWait(void)
167 {
168 1 uint i;
169 1 while(DQ);
170 1 while(~DQ); // 检测到应答脉冲
171 1 i = 4;
172 1 while (i>0) i--;
173 1 }
174
175 /* 读取数据的一位,满足读时隙要求 */
176 bit RdBit(void)
177 {
178 1 uint i;
179 1 bit b;
C51 COMPILER V7.20 TEXT1 08/11/2007 15:23:53 PAGE 4
180 1 DQ = 0;
181 1 i++;
182 1 DQ = 1;
183 1 i++;i++; // 延时15us以上,读时隙下降沿后15us,DS18B20输出数据才有效
184 1 b = DQ;
185 1 i = 8;
186 1 while(i>0) i--;
187 1 return (b);
188 1 }
189
190 /* 读取数据的一个字节 */
191 uchar RdByte(void)
192 {
193 1 uchar i,j,b;
194 1 b = 0;
195 1 for (i=1;i<=8;i++)
196 1 {
197 2 j = RdBit();
198 2 b = (j<<7)|(b>>1);
199 2 }
200 1 return(b);
201 1 }
202
203 /* 写数据的一个字节,满足写1和写0的时隙要求 */
204 void WrByte(uchar b)
205 {
206 1 uint i;
207 1 uchar j;
208 1 bit btmp;
209 1 for(j=1;j<=8;j++)
210 1 {
211 2 btmp = b&0x01;
212 2 b = b>>1; // 取下一位(由低位向高位)
213 2 if (btmp)
214 2 {
215 3 /* 写1 */
216 3 DQ = 0;
217 3 i++;i++; // 延时,使得15us以内拉高
218 3 DQ = 1;
219 3 i = 8;
220 3 while(i>0) i--; // 整个写1时隙不低于60us
221 3 }
222 2 else
223 2 {
224 3 /* 写0 */
225 3 DQ = 0;
226 3 i = 8;
227 3 while(i>0) i--; // 保持低在60us到120us之间
228 3 DQ = 1;
229 3 i++;
230 3 i++;
231 3 }
232 2 }
233 1 }
234
235 /* 启动温度转换 */
236 void convert(void)
237 {
238 1 TxReset(); // 产生复位脉冲,初始化DS18B20
239 1 RxWait(); // 等待DS18B20给出应答脉冲
240 1 delay(1); // 延时
241 1 WrByte(0xcc); // skip rom 命令
C51 COMPILER V7.20 TEXT1 08/11/2007 15:23:53 PAGE 5
242 1 WrByte(0x44); // convert T 命令
243 1 }
244
245 /* 读取温度值 */
246 void RdTemp(void)
247 {
248 1 TxReset(); // 产生复位脉冲,初始化DS18B20
249 1 RxWait(); // 等待DS18B20给出应答脉冲
250 1 delay(1); // 延时
251 1 WrByte(0xcc); // skip rom 命令
252 1 WrByte(0xbe); // read scratchpad 命令
253 1 tplsb = RdByte(); // 温度值低位字节(其中低4位为二进制的“小数”部分)
254 1 tpmsb = RdByte(); // 高位值高位字节(其中高5位为符号位)
255 1 }
256
257
258
259 void gettemp()
260 {
261 1 delay(1); // 延时1ms
262 1 convert(); // 启动温度转换,需要750ms
263 1 delay(100); // 延时1s
264 1 RdTemp();
265 1 temp=(tpmsb&0x07)*16+((tplsb&0xf0)>>4);
266 1 tempx=tplsb&0x0f;
267 1 }
268
269
270
271
272 uchar getkey_ii()
273
274 {
275 1 unsigned char keycode=0xff,temp,i;
276 1 P1=0x0f;
277 1 temp=P1&0x0f;
278 1 if(temp!=0x0f) //判是否有键按下
279 1 {
280 2 // beep=0;
281 2 P1=0xef; //自第0行开始扫描输出,自列读入键值
282 2 for(i=0;i<4;i++)
283 2 {
284 3 temp=P1&0x0f;
285 3 if(temp==0x07) //判断第0列是否有键按下
286 3 {
287 4 keycode=i*4+0;
288 4 break;
289 4 }
290 3 else if(temp==0x0b)//判断第1列是否有键按下
291 3 {
292 4 keycode=i*4+1;
293 4 break;
294 4 }
295 3 else if(temp==0x0d)//判断第2列是否有键按下
296 3 {
297 4 keycode=i*4+2;
298 4 break;
299 4 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -