📄 text1.lst
字号:
C51 COMPILER V7.20 TEXT1 07/17/2007 07:26:06 PAGE 1
C51 COMPILER V7.20, COMPILATION OF MODULE TEXT1
OBJECT MODULE PLACED IN Text1.OBJ
COMPILER INVOKED BY: E:\软件\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
7 //数据口定义
8 #define lcd1602_bus P3
9 #define key_bus P1
10
11 //引脚定义
12 sbit rs_1602=P2^7;
13 sbit rw_1602=P2^6;
14 sbit e_1602=P2^5;
15 sbit cs_549=P0^2;
16 sbit data_549=P0^3;
17 sbit clk_549=P0^4;
18 sbit SCL=P2^0;
19 sbit SDA=P2^1;
20
21
22 uchar state;
23 uchar bdata adc_549;
24 sbit adc_549low=adc_549^0;
25 uchar s;
26 uchar mea,m[2];
27 uint in[2];
28
29 uchar code table0[]="1.mea2.dis3.plo";
30 uchar code table1[]="please measure";
31 uchar code table2[]="complete";
32 uchar code table3[]="in:";
33 uchar code asc[]="0123456789";
34 uchar code table4[]="display:";
35 uchar code table[1]=".";
36
37
38 void delay(uint t)
39 {
40 1 uint i,j;
41 1 for(i=0;i<t;i++)
42 1 for(j=0;j<10;j++);
43 1 }
44 //================IIC总线的操作子程序====================
45
46
47 /*****************启动总线**********************/
48 void IICStart(void)
49 {
50 1 SCL=0;
51 1 SDA=1;SCL=1;SCL=1;SCL=1;SCL=1;
52 1 SDA=0;SDA=0;SDA=0;SDA=0;SDA=0;
53 1 SCL=0;SCL=0;SCL=0;
54 1 SDA=1;
55 1 }
C51 COMPILER V7.20 TEXT1 07/17/2007 07:26:06 PAGE 2
56
57 /*****************停止IIC总线****************/
58 void IICStop(void)
59 {
60 1 SCL=0;SDA=0;
61 1 SCL=1;SCL=1;SCL=1;SCL=1;
62 1 SDA=1;SDA=1;SDA=1;SDA=1;
63 1 SCL=0;
64 1 }
65
66 /**************检查应答位*******************/
67 bit IICRecAck(void)
68 {
69 1 SCL=0;
70 1 SDA=1;
71 1 SCL=1;SCL=1;SCL=1;SCL=1;SCL=1;
72 1 CY=SDA; //因为返回值总是放在CY中的
73 1 SCL=0;
74 1 return(CY);
75 1 }
76
77 /*****************不对IIC总线产生应答***************/
78 void IICNoAck(void)
79 {
80 1 SDA=1;
81 1 SCL=1;SCL=1;SCL=1;SCL=1;SCL=1;SCL=0;
82 1 }
83
84 /*******************向IIC总线写数据*********************/
85 void IICSendByte(uchar sendbyte)
86 {
87 1 uchar j;
88 1 for(j=8;j>0;j--)
89 1 {
90 2 SCL=0;
91 2 sendbyte<<=1; //无论C51怎样实现这个操作,始终会使CY=sendbyte^7;
92 2 SDA=CY;
93 2 SCL=1;
94 2 }
95 1 SCL=0;
96 1 }
97
98 /**********************从IIC总线上读数据子程序**********/
99 uchar IICReceiveByte(void)
100 {
101 1 uchar receivebyte,ii;
102 1 SCL=0;
103 1 ii=8;
104 1 while(ii--)
105 1 {
106 2 SCL=1;
107 2 receivebyte=(receivebyte<<1)|SDA;
108 2 SCL=0;
109 2 }
110 1 return(receivebyte);
111 1 }
112
113
114 /**************************************************************************************************
115 *
116 *IIC总线写函数
117 *函数声明:bit IICWrite(uint address,uchar buf);
C51 COMPILER V7.20 TEXT1 07/17/2007 07:26:06 PAGE 3
118 *函数参数:address为AT24C64的地址,buf为要在这个地址写的数据
119 *函数作用:往地址写一个字节的数据
120 **************************************************************************************************/
121 bit IICWrite(uint address,uchar buf)
122 {
123 1 bit flag;
124 1 flag=1;
125 1 IICStart();
126 1 IICSendByte(0xa0);
127 1 if(IICRecAck())
128 1 flag=0;
129 1 IICSendByte((uchar)(address>>8));
130 1 if(IICRecAck())
131 1 flag=0;
132 1 IICSendByte((uchar)address);
133 1 if(IICRecAck())
134 1 flag=0;
135 1 IICSendByte(buf);
136 1 if(IICRecAck())
137 1 flag=0;
138 1 IICStop();
139 1 delay(255);
140 1 delay(255);
141 1 delay(255);
142 1 delay(255);
143 1 return(flag);
144 1 }
145
146 uchar IICRead(uint address)
147 { uchar buf;
148 1 IICStart();
149 1 IICSendByte(0xa0);
150 1 if(IICRecAck())
151 1 buf=0xff;
152 1 IICSendByte((uchar)(address>>8));
153 1 if(IICRecAck())
154 1 buf=0xff;
155 1 IICSendByte((uchar)address);
156 1 if(IICRecAck())
157 1 buf=0xff;
158 1 IICStart();
159 1 IICSendByte(0xa1);
160 1 if(IICRecAck())
161 1 buf=0xff;
162 1 buf=IICReceiveByte();
163 1 //read last byte data
164 1 IICNoAck();
165 1 IICStop();
166 1 delay(50);
167 1 return(buf);
168 1 }
169
170
171 /**************adc_549convert*******************/
172 uchar adc_549convert()
173 { unsigned char i;
174 1 cs_549=1;
175 1 cs_549=0;
176 1 clk_549=0;
177 1 for(i=0;i<8;i++)
178 1 {
179 2 data_549=1;
C51 COMPILER V7.20 TEXT1 07/17/2007 07:26:06 PAGE 4
180 2 clk_549=1;
181 2 adc_549low=data_549; //read one bit
182 2 clk_549=0;
183 2 if(i<7) adc_549=adc_549<<1;//经八次左移adc初值可以不付
184 2 }
185 1 clk_549=0;
186 1 cs_549=1;
187 1 return(adc_549);
188 1 }
189
190
191
192
193
194
195 /***********忙判断标志,返回一个位BF********************/
196 bit lcd1602_busy(void)
197 {
198 1 uchar busy_flag;
199 1 rs_1602=0;
200 1 rw_1602=1;
201 1 _nop_();
202 1 e_1602=1;
203 1 _nop_();
204 1 lcd1602_bus=0xff;
205 1 busy_flag=lcd1602_bus; //e在高电平时读
206 1 e_1602=0;
207 1 return (bit)(busy_flag&0x80); //BF=1; BUSY 返回一个位
208 1 }
209
210 /********写命令,有两个参数,一个是要写的命令控制字,
211 第二个是用来控制是否进行忙标志的判断。
212 busyflag=1;
213 判断: 为0
214 ***************/
215 void lcd1602_wrcmd(unsigned char lcdcmd)
216 {
217 1 while(lcd1602_busy()); //等待空闲
218 1 lcd1602_bus=lcdcmd;
219 1 rs_1602=0;
220 1 rw_1602=0;
221 1 _nop_();
222 1 e_1602=1;
223 1 _nop_();
224 1 _nop_();
225 1 e_1602=0; //产生一个下沿
226 1 }
227
228
229
230 /***************向液晶写数据******************/
231 void lcd1602_wrdata(uchar lcddata)
232 {
233 1 while(lcd1602_busy()); //等待空闲
234 1 lcd1602_bus=lcddata; //在下沿的时候写数据
235 1 rs_1602=1;
236 1 rw_1602=0;
237 1 _nop_();
238 1 e_1602=1;
239 1 _nop_();
240 1 _nop_();
241 1 e_1602=0;
C51 COMPILER V7.20 TEXT1 07/17/2007 07:26:06 PAGE 5
242 1 //lcd_bus=0xff;
243 1 }
244
245
246 /************液晶的清屏************/
247 void lcd1602_clear(void)
248 {
249 1 lcd1602_wrcmd(0x01); //液晶清屏控制字 并延时>40us
250 1 delay(100);
251 1 }
252
253 /***********1602液晶的初始化***************/
254 void lcd1602_init(void)
255 {
256 1 lcd1602_wrcmd(0x38); //功能设置-----8位数据接口,两行显示,5*7点阵字符显示
257 1 delay(100);
258 1 lcd1602_wrcmd(0x0e); //显示开关控制----显示开关开,光标开关关,闪烁开关关
259 1 delay(100);
260 1 lcd1602_wrcmd(0x06); //输入方式设置,AC自增1, S=0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -