📄 main.lst
字号:
C51 COMPILER V6.12 MAIN 08/31/2007 19:10:34 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE MAIN
OBJECT MODULE PLACED IN main.OBJ
COMPILER INVOKED BY: E:\Keil\C51\BIN\C51.EXE main.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<reg51.h>
2 #include<intrins.h>
3 #define uchar unsigned char
4 #define uint unsigned int
5 sbit rs=P3^3;
6 sbit rw=P3^4;
7 sbit en=P3^5;
8 sbit bflag=P2^7;
9 sbit reset=P3^0;
10 sbit sclk=P3^1;
11 sbit io=P3^2;
12 uchar str1[]="date of today is:";
13 //uchar str2[]="i will kill you lj";
14 uchar init[]={0x00,0x00,0x21,0x21,0x10,0x01,0x04};//秒,分,时,日,月,星期,年
15 //
16 void delay()
17 {
18 1 uchar j;
19 1 for(j=250;j>0;j--);
20 1 }
21
22 //-------------------液晶模块-----------------//
23 void en_toggle()
24 {
25 1 en=0;
26 1 //_nop_();
27 1 delay();
28 1 en=1;
29 1 delay();
30 1 // _nop_();
31 1 en=0;
32 1 }
33 //注意必须加延时,否则会出问题的
34 void is_ready()
35 {
36 1 P2=0x00;//设置为输入口
37 1 rs=0;
38 1 rw=1;
39 1 en=1;
40 1 while(bflag);
41 1 en=0;
42 1 }
43
44 void write_cmd(uchar cmd)
45 {
46 1 is_ready();
47 1 rs=0;
48 1 rw=0;
49 1 P2=cmd;
50 1 en_toggle();
51 1 }
52
53 void write_data(uchar indata)
54 {
55 1 is_ready();
C51 COMPILER V6.12 MAIN 08/31/2007 19:10:34 PAGE 2
56 1 rs=1;
57 1 rw=0;
58 1 P2=indata;
59 1 en_toggle();
60 1 _nop_();
61 1 }
62
63 void write_str(uchar addr,uchar *p)
64 {
65 1 uchar i;
66 1 write_cmd(addr);
67 1 while(p[i]!='\0')
68 1 {
69 2 write_data(p[i]);
70 2 i++;
71 2 }
72 1 }
73
74 void write_position(uchar row,uchar col)
75 {
76 1 uchar p;
77 1 if(row==1)
78 1 {
79 2 p=0x80+col-1;
80 2 write_cmd(p);
81 2 }
82 1 else
83 1 {
84 2 p=0xc0+col-1;
85 2 write_cmd(p);
86 2 }
87 1 }
88 void init_lcd()
89 {
90 1 write_cmd(0x38);
91 1 write_cmd(0x0c);
92 1 write_cmd(0x06);
93 1 write_cmd(0x01);//清屏幕
94 1 delay();
95 1 }
96 //------------液晶模块结束---------------------
97
98 //-----------ds1302模块开始-------------------
99 //注意点:sclk的上升沿输入数据,sclk的下跳沿输出数据
100 //读写时都是从第0位开始
101 void write_byte(uchar inbyte)
102 {
103 1 uchar i;
104 1 for(i=8;i>0;i--)
105 1 {
106 2 sclk=0;
107 2 if(inbyte&0x01)
108 2 io=1;
109 2 else
110 2 io=0;
111 2 sclk=1;
112 2 _nop_();
113 2 inbyte=inbyte>>1;
114 2 }
115 1 }
116
117 uchar read_byte() //sclk的下跳沿读数据
C51 COMPILER V6.12 MAIN 08/31/2007 19:10:34 PAGE 3
118 {
119 1 uchar i,temp=0;
120 1 io=1; //设置为输入口
121 1 for(i=7;i>0;i--)
122 1 {
123 2 sclk=0;
124 2 if(io==1)
125 2 temp=temp|0x80;
126 2 else
127 2 temp=temp&0x7f;
128 2 sclk=1;
129 2 temp=temp>>1;
130 2 }
131 1 //sclk=0;
132 1 return (temp);
133 1 }
134
135 //----------往ds1302的某个地址写入数据-------------
136 void write_ds1302(uchar cmd,uchar indata)
137 {
138 1 reset=1;
139 1 write_byte(cmd);
140 1 write_byte(indata);
141 1 reset=0;
142 1 sclk=0;
143 1 }
144
145 //----------读ds1302某地址的的数据-----------------
146 uchar read_ds1302(uchar addr)
147 {
148 1 uchar backdata;
149 1 reset=1;
150 1 write_byte(addr);
151 1 backdata=read_byte();//先写地址,然后读数据
152 1 reset=0;
153 1 //sclk=0;
154 1 return (backdata);
155 1 }
156
157 //------------设置初始时间-------------------
158 void set_ds1302(uchar addr,uchar *p,uchar n)//写入n个数据
159 {
160 1 write_ds1302(0x8e,0x00);//写控制字,允许写操作
161 1 for(;n>0;n--)
162 1 {
163 2 write_ds1302(addr,*p);
164 2 p++;
165 2 addr=addr+2;
166 2 }
167 1 write_ds1302(0x8e,0x80);//写保护,不允许写
168 1 }
169
170 //----------- 读取当前时间-------------------
171 void read_nowtime(uchar addr,uchar *p,uchar n)
172 {
173 1 for(;n>0;n--)
174 1 {
175 2 *p=read_ds1302(addr);
176 2 p++;
177 2 addr=addr+2;
178 2 }
179 1 }
C51 COMPILER V6.12 MAIN 08/31/2007 19:10:34 PAGE 4
180 void init_ds1302()
181 {
182 1 reset=0;
183 1 sclk=0;
184 1 write_ds1302(0x80,0x00);//写控制字,允许写
185 1 write_ds1302(0x90,0x00);//禁止涡流充电
186 1 }
187
188 //-----------ds1302模块结束-------------------
189 void main()
190 {
191 1 init_lcd(); //初始化LCD
192 1 write_str(0x80,str1); //液晶显示提示信息
193 1 init_ds1302(); //初始化ds1302
194 1 set_ds1302(0x80,init,7);//设置初始时间,日期,年月
195 1 while(1)
196 1 {
197 2 read_nowtime(0x81,init,7); //读出当前时间
198 2 write_position(2,1);
199 2 write_data('0'+((init[2]&0xf0)>>4));
200 2 write_position(2,2);
201 2 write_data('0'+(init[2]&0x0f)); //读小时
202 2
203 2 write_position(2,3);
204 2 write_data(':');
205 2
206 2 write_position(2,4);
207 2 write_data('0'+((init[1]&0xf0)>>4));
208 2
209 2 write_position(2,5);
210 2 write_data('0'+(init[1]&0x0f)); //读分钟
211 2
212 2 write_position(2,6);
213 2 write_data(':');
214 2
215 2 write_position(2,7);
216 2 write_data('0'+((init[0]&0xf0)>>4));
217 2
218 2 write_position(2,8);
219 2 write_data('0'+(init[0]&0x0f)); //读秒
220 2 }
221 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 456 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 25 14
IDATA SIZE = ---- ----
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -