📄 test.lst
字号:
C51 COMPILER V7.50 TEST 07/29/2006 20:52:24 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE TEST
OBJECT MODULE PLACED IN test.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE test.c BROWSE DEBUG OBJECTEXTEND
line level source
1 #include<reg51.h>
2
3 #define uint unsigned int
4 #define uchar unsigned char
5
6 #define delaylcd 1
7 #define LCD_Data P1
8 #define HIGH 1
9 #define LOW 0
10 uchar tmp[4] ;
11 sbit RS = P2^0 ;
12 sbit RW = P2^1 ;
13 sbit EN = P2^2 ;
14
15 sbit SDA=P2^3;
16 sbit SCL=P2^4;
17
18 void Delay_nms(uint Delay); // f = 4 MHZ
19
20 void WRiteData(unsigned char WDLCM);
21
22 void WRiteCommand(unsigned char WCLCM);
23
24 void LCDInit(void);
25
26 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);
27
28 void DisplayOnedata(unsigned char X, unsigned char Y, unsigned int DData);
29
30 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char const *DData);
31
32
33
34 void delay( uint a) //100<->2.424ms
35 {
36 1 uint K;
37 1 for( K=0;K<a;K++)
38 1 ;
39 1 }
40
41 ////////////////////////////////I2C///////////////////////////////////////
42 //提供I2C总线工作时序中的起始位
43 void I_start(void)
44 {
45 1 SDA = HIGH;
46 1 delay(4);
47 1 SCL = HIGH;
48 1 delay(4);
49 1 SDA = LOW;//当SCL为高时,SDA的一个下降沿作为起始位
50 1 delay(4);
51 1 SCL = LOW;
52 1 delay(4);
53 1 }
54 //提供I2C总线工作时序中的停止位
55 void I_stop(void)
C51 COMPILER V7.50 TEST 07/29/2006 20:52:24 PAGE 2
56 {
57 1 SDA = LOW;
58 1 delay(4);
59 1 SCL = HIGH;
60 1 delay(4);
61 1 SDA = HIGH;//当SCL为高时,SDA的一个上升沿作为停止位
62 1 delay(4);
63 1 SCL = LOW;
64 1 delay(4);
65 1 }
66
67 //提供I2C总线的时钟信号,并返回时钟电平为高期间SDA信号线上状态
68 bit I_clock(void)
69 {
70 1 bit sample;
71 1 SCL = HIGH;
72 1 delay(4);
73 1 sample = SDA;
74 1 SCL = LOW;
75 1 delay(4);
76 1 return (sample);
77 1 }
78 //向I2C总线发送8位数据,并请求一个应答信号ACK。如果收到ACK应答,则返回1,否则返回0。
79 bit I_send(uchar I_data)
80 {
81 1 register uchar i;
82 1 /*发送8位数据*/
83 1
84 1 for(i=0;i<8;i++)
85 1 {
86 2 SDA = (bit)(I_data & 0x80);
87 2 I_data <<= 1;
88 2 I_clock();
89 2 }
90 1 /*请求应答信号ACK*/
91 1 SDA = HIGH;
92 1 delay(4);
93 1 return(~I_clock());
94 1 }
95 //从I2C总线上接收8位数据信号,并将接收到的8位数据作为一个字节返回,不回送应答信号。
96 //主函数在调用本函数之前应保证SDA信号线处于浮置状态,SDA=1.
97 uchar I_receive(void)
98 {
99 1 uchar I_data = 0;
100 1 register uchar i;
101 1 for(i=0;i<8;i++)
102 1 {
103 2 I_data*=2;
104 2 if(I_clock())I_data++;
105 2 }
106 1 return (I_data);
107 1 }
108
109 uchar readI2c ( uchar address )
110 {
111 1 uchar ibuf = 0 ;
112 1 I_start() ;
113 1 I_send(0xa0);
114 1 Delay_nms(5);
115 1 I_send(0x00);
116 1 Delay_nms(5);
117 1 I_send( address );
C51 COMPILER V7.50 TEST 07/29/2006 20:52:24 PAGE 3
118 1 Delay_nms(5);
119 1 I_start() ;
120 1 Delay_nms(5);
121 1 I_send(0xa1);
122 1 ibuf = I_receive() ;
123 1 I_stop( ) ;
124 1 return ibuf ;
125 1 }
126
127
128
129 void writeI2c ( ) // 首地址 秒/分/时/天
130 {
131 1
132 1 I_start() ;
133 1 I_send(0xa0);
134 1 Delay_nms(5);
135 1 I_send(0x00);
136 1 Delay_nms(5);
137 1 I_send(0x00);
138 1 Delay_nms(5);
139 1 I_send(0x01);
140 1 Delay_nms(5);
141 1 I_send(0x02);
142 1 Delay_nms(5);
143 1 I_send(0x03);
144 1 Delay_nms(5);
145 1 I_send(0x04);
146 1 Delay_nms(5);
147 1 I_stop( ) ;
148 1 Delay_nms(5);
149 1 }
150
151
152 void main(void)
153 {
154 1 uchar buf = 0 ;
155 1 LCDInit() ;
156 1 DisplayOnedata(0,0,123 ) ;
157 1
158 1 writeI2c() ;
159 1 DisplayOnedata(0,1,readI2c(0)) ;
160 1 DisplayOnedata(3,1,readI2c(1)) ;
161 1 DisplayOnedata(6,1,readI2c(2)) ;
162 1 DisplayOnedata(9,1,readI2c(3)) ;
163 1
164 1 DisplayOnedata(5,0,456 ) ;
165 1 while( 1 ) ;
166 1
167 1
168 1 }
169
170 void Delay_nms(uint Delay) // f = 6MHZ
171 { uint i;
172 1 for(;Delay>0;Delay--)
173 1 { for(i=0;i<83;i++)
174 2 ;
175 2 }
176 1 }
177
178 /*----------------------------------------------------------------*/
179 /* 写数据 */
C51 COMPILER V7.50 TEST 07/29/2006 20:52:24 PAGE 4
180 /* 输入:RS=1,WR=0,E=1,D0~D7=数据,E=高脉冲 输出:无 */
181 /*----------------------------------------------------------------*/
182
183 void WRiteData(unsigned char WDLCM)
184 {
185 1 Delay_nms( delaylcd ) ;
186 1 //check_busy() ;
187 1 LCD_Data = WDLCM;
188 1 RS=1;
189 1 RW=0;
190 1 EN=0; //若晶振速度太高可以在这后加小的延时
191 1
192 1 EN=1;
193 1
194 1 EN=0;
195 1
196 1 }
197
198 /*----------------------------------------------------------------*/
199 /* 写指令 */
200 /* 输入:RS=0,WR=0,E=1,D0~D7=指令码,E=高脉冲 输出:无 */
201 /*----------------------------------------------------------------*/
202 void WRiteCommand(unsigned char WCLCM ) //BuysC为0时忽略忙检测
203 {
204 1 Delay_nms( delaylcd ) ;
205 1
206 1 LCD_Data = WCLCM;
207 1 RS = 0;
208 1 RW = 0;
209 1 EN=0; //若晶振速度太高可以在这后加小的延时
210 1
211 1 EN=1;
212 1
213 1 EN=0;
214 1 }
215
216
217
218
219 void LCDInit(void) //LCM初始化
220 {
221 1 LCD_Data = 0;
222 1 WRiteCommand(0x38); //三次显示模式设置,不检测忙信号
223 1 Delay_nms(delaylcd);
224 1 WRiteCommand(0x38);
225 1 Delay_nms(delaylcd);
226 1 WRiteCommand(0x38);
227 1 Delay_nms(delaylcd);
228 1
229 1 WRiteCommand(0x38); //显示模式设置,开始要求每次检测忙信号
230 1 WRiteCommand(0x08); //关闭显示
231 1 WRiteCommand(0x01); //显示清屏
232 1 WRiteCommand(0x06); // 显示光标移动设置
233 1 WRiteCommand(0x0C); // 显示开及光标设置
234 1 }
235
236 //按指定位置显示一个字符
237 void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
238 {
239 1
240 1 Y &= 0x1;
241 1 X &= 0xF; //限制X不能大于15,Y不能大于1
C51 COMPILER V7.50 TEST 07/29/2006 20:52:24 PAGE 5
242 1 if (Y)
243 1 X |= 0x40; //当要显示第二行时地址码+0x40;
244 1 X |= 0x80; // 算出指令码
245 1 WRiteCommand(X); //这里不检测忙信号,发送地址码
246 1 WRiteData(DData);
247 1
248 1 }
249
250 void DisplayOnedata(unsigned char X, unsigned char Y, unsigned int DData)
251 {
252 1 unsigned char i = 0 ;
253 1 tmp[3] = tmp[2]= tmp[1] = tmp[0]= 0 ;
254 1 while( DData )
255 1 {
256 2 tmp[i] = 0x30 + DData% 10 ;
257 2 i++;
258 2 DData /=10 ;
259 2 }
260 1 i--;
261 1 while( i !=0xff )
262 1 {
263 2 DisplayOneChar( X, Y, tmp[i] ) ;
264 2 X++ ;
265 2 i--;
266 2 }
267 1 }
268 //按指定位置显示一串字符
269 void DisplayListChar(unsigned char X, unsigned char Y, unsigned char const *DData)
270 {
271 1 unsigned char ListLength;
272 1
273 1 ListLength = 0;
274 1 Y &= 0x1;
275 1 X &= 0xF;
276 1 while ( DData[ListLength] != '\0' )
277 1 {
278 2
279 2 DisplayOneChar(X, Y, DData[ListLength]);
280 2 ListLength++;
281 2 X++;
282 2 if ( X == 16 )
283 2 { Y ++ ;
284 3 X = 0;
285 3 if( Y == 2 )
286 3 {
287 4 Y = 0 ;
288 4 Delay_nms(2000);
289 4 WRiteCommand(0x01 );
290 4 }
291 3 }
292 2 }
293 1 }
294
295
296
297
298
299
300
301
302
C51 COMPILER V7.50 TEST 07/29/2006 20:52:24 PAGE 6
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 666 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 4 11
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -