📄 newds1302.lst
字号:
C51 COMPILER V6.12 NEWDS1302 09/27/2008 14:21:13 PAGE 1
C51 COMPILER V6.12, COMPILATION OF MODULE NEWDS1302
OBJECT MODULE PLACED IN .\Newds1302.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE .\Newds1302.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include<reg52.h>
2 #define uint unsigned int
3 #define uchar unsigned char
4 /*lcd管脚定义*/
5 sbit lcdrs=P2^0;
6 sbit lcden=P2^1;
7 sbit lcdrw=P3^2;
8 bit lcdzt;
9
10 /*ds1302管脚定义*/
11 sbit dsce=P2^2;
12 sbit dsclk=P2^3;
13 sbit dsdata=P2^4;
14 /*ACC的定义*/
15 sbit a0=ACC^0;
16 sbit a7=ACC^7;
17
18 sbit key1=P2^5;
19 sbit key2=P2^6;
20 sbit key3=P2^7;
21
22 uchar kk=0,adda=0,yueb;
23 uchar *weekda[]={"","777","111","222","333","444","555","666"};
24
25
26 uchar ds_time[]={0,0,0,0,0,0,0};
27
28 uchar code ds_data_init[]={0x08,0x08,0x8,0x01,0x08,0x01,0x08};
29
30 //uchar code ds_write_add[]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c};
31
32 void delay(uchar); //延时,C最少=90 a=5
33 //void delay1(uint a); //长时间延时用于键盘检测
34 /**ds1302的驱动*/
35 void ds_write(uchar); //往ds1302中写入一字节的数据或地址 ,aa=数据或地址
36 void ds_write_b(uchar,uchar); //往ds1302中写一字节数据
37 void ds_write_bs(uchar *time); //写字令,多字节
38 void ds_write_reg(uchar ,uchar *pwrite); //写寄存器指令,多字节
39
40 uchar ds_read(); //往ds1302中读取一字节数据,放在ACC中
41 uchar ds_read_b(uchar); //往ds1302中读取一字节数据, 地址为cc 读出的数据放在ee中
42 void ds_read_bs(uchar *time1); //读字令,多字节
43 void dsread_reg(uchar ,uchar *preg); //读寄存器 ,多字节
44
45 //void ds_bcdzh(); //把BCD码转换成十六进制的
46 void ds_bcdzh(uchar *p); //把BCD码转换成十六进制的
47 uchar dectobcd(uchar);//bcd转十六进,
48 void time_dec_bcd();//把ds_time数组里的值转换成bcd码并放在数组里
49 void runyear();//判断是否润年,并返回相应的月份天数
50 /*LCD的驱动*/
51 void lcd_com(uchar); //向lcd发指令
52 void lcd_data(uchar); //向lcd发送数据
53 void lcd_init(); //lcd初始化
54
55 /*关于显示*/
C51 COMPILER V6.12 NEWDS1302 09/27/2008 14:21:13 PAGE 2
56 void lcd_dfs(uchar,uchar);// 用来刷新分秒天 aa=数据 bb=LCD地址
57 void lcd_yydw(); //显示年月日天星期
58 void week(uchar); //星期的处理
59
60 void jbsm(uchar *p2); //键盘扫描
61 /*结构体typedef
62 struct sys
63 {
64 uchar miao;
65 uchar fen;
66 uchar shi;
67 uchar day;
68 uchar yue;
69 uchar week;
70 uchar year;
71 }dssj,dssja={0x05,0x05,0x22,0x25,0x11,0x01,0x08}; */
72
73
74
75 void delay(uchar a) //延时,C最少=90 a=5
76 {
77 1 uchar b,c;
78 1 for(b=a;b>0;b--)
79 1 for(c=90;c>0;c--);
80 1 }
81
82 void delay1(uint a) //长时间延时用于键盘检测
83 {
84 1 uint b,c;
85 1 for(b=a;b>0;b--)
86 1 for(c=150;c>0;c--);
87 1 }
88
89 void ds_write(uchar aa) //往ds1302中写入一字节的数据或地址 ,aa=数据或地址
90 {
91 1 uchar i;
92 1 ACC = aa;
93 1 for(i=8; i>0; i--)
94 1 {
95 2 dsdata = a0;//相当于汇编中的 RRC
96 2 dsclk = 1;
97 2 dsclk = 0;
98 2 ACC=ACC>>1;
99 2 }
100 1 }
101
102 uchar ds_read() //往ds1302中读取一字节数据,放在ACC中
103 {
104 1 uchar i;
105 1 for(i=8; i>0; i--)
106 1 {
107 2 ACC = ACC >>1;//相当于汇编中的 RRC
108 2 a7 = dsdata;
109 2 dsclk = 1;
110 2 dsclk = 0;
111 2 }
112 1 return(ACC);
113 1 }
114
115 uchar ds_read_b(uchar cc) //往ds1302中读取一字节数据, 地址为cc 读出的数据放在ee中
116 {
117 1 uchar ee;
C51 COMPILER V6.12 NEWDS1302 09/27/2008 14:21:13 PAGE 3
118 1 dsce=0;
119 1 dsclk=0;
120 1 dsce=1;
121 1
122 1 ds_write(cc);
123 1 ee=ds_read();
124 1
125 1 dsclk=1;
126 1 dsce=0;
127 1 return ee;
128 1 }
129
130 void ds_write_b(uchar ff ,uchar gg) //往ds1302中写一字节数据, 地址为ff 要写入的数据放在gg中
131 {
132 1 dsce=0;
133 1 dsclk=0;
134 1 dsce=1;
135 1
136 1 ds_write(ff);
137 1 ds_write(gg);
138 1
139 1 dsclk=1;
140 1 dsce=0;
141 1 }
142
143 void ds_write_bs(uchar *time) //写字令,多字节 ,格式为: 秒 分 时 日 月 星期 年
144 {
145 1 uchar i;
146 1 ds_write_b(0x8e,0x00);// 控制命令,WP=0,写操作
147 1 dsce = 0;
148 1 dsclk = 0;
149 1 dsce = 1;
150 1 ds_write(0xbe);//0xbe:时钟多字节写命令
151 1
152 1 for (i = 8; i>0; i--)//8Byte = 7Byte 时钟数据 + 1Byte 控制
153 1 {
154 2 ds_write(*time); // 写1Byte数据
155 2 time++;
156 2 }
157 1
158 1 dsclk = 1;
159 1 dsce = 0;
160 1 }
161
162 void ds_read_bs(uchar *time1) //读字令,多字节,格式为: 秒 分 时 日 月 星期 年
163 {
164 1 uchar i;
165 1 dsce = 0;
166 1 dsclk = 0;
167 1 dsce = 1;
168 1 ds_write(0xbf);// 0xbf:时钟多字节读命令
169 1 for (i=8; i>0; i--)
170 1 {
171 2 *time1 = ds_read();//读1Byte数据
172 2 time1++;
173 2 }
174 1 dsclk = 1;
175 1 dsce = 0;
176 1 }
177
178
179 void lcd_com(uchar aa) //向lcd发指令
C51 COMPILER V6.12 NEWDS1302 09/27/2008 14:21:13 PAGE 4
180 {
181 1 lcdrs=0;
182 1 P0=aa;
183 1 delay(5);
184 1 lcden=1;
185 1 delay(5);
186 1 lcden=0;
187 1 delay(1);
188 1 lcdrs=1;
189 1 }
190
191 void lcd_readzt() //LCD读状态
192 {
193 1 uchar lcdzta;
194 1 lcdrs=0;
195 1 lcdrw=1;
196 1 lcden=1;
197 1 P0=0xff;
198 1 lcdzta=P0;
199 1 lcdzta<<1;
*** WARNING C275 IN LINE 199 OF .\NEWDS1302.C: expression with possibly no effect
200 1 lcdzt=CY;
201 1 }
202
203 void lcd_init() //lcd初始化
204 {
205 1 lcden=0;
206 1 lcd_com(0x38);
207 1 lcd_com(0x0c);
208 1 lcd_com(0x06);
209 1 lcd_com(0x01);
210 1 lcd_com(0x80);
211 1
212 1 ds_write_bs(&ds_data_init); //往ds1302中写入多字节
213 1 ds_read_bs(&ds_time); //往ds1302中读出多字节
214 1 ds_bcdzh(&ds_time); //把BCD码转换成十六进制的
215 1
216 1 lcd_dfs(ds_time[2],0xc4); //时
217 1 lcd_data(':');
218 1 lcd_dfs(ds_time[1],0xc7); //分
219 1 lcd_data(':');
220 1 lcd_dfs(ds_time[0],0xca); //秒
221 1
222 1 lcd_com(0x80);
223 1 lcd_data('2');
224 1 lcd_data('0');
225 1 lcd_dfs(ds_time[6],0x82); //年
226 1 lcd_data('-');
227 1 lcd_dfs(ds_time[4],0x85); //月
228 1 lcd_data('-');
229 1 lcd_dfs(ds_time[3],0x88); //天
230 1 lcd_com(0x8b);
231 1 week(ds_time[5]); //星期
232 1 }
233
234 void lcd_data(uchar bb) //向lcd发送数据
235 {
236 1 lcdrs=1;
237 1 P0=bb;
238 1 delay(5);
239 1 lcden=1;
240 1 delay(5);
C51 COMPILER V6.12 NEWDS1302 09/27/2008 14:21:13 PAGE 5
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -