📄 ds1302.lst
字号:
C51 COMPILER V7.06 DS1302 12/20/2008 10:29:42 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN ds1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ds1302.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <at89x51.h>
2 sbit T_CLK = P2^5; //实时时钟时钟线引脚
3 sbit T_IO = P2^6; //实时时钟数据线引脚
4 sbit T_RST = P2^7; //实时时钟复位线引脚
5 sbit ACC0=ACC^0;
6 sbit ACC7=ACC^7;
7 sbit rs=P1^2;
8 sbit rw=P1^3;
9 sbit e=P1^4;
10 sbit set=P3^4; //设置
11 sbit add=P3^5; //加
12 sbit dec=P3^6; //减
13 void show();
14 void keyscan();
15 void inishow();
16 unsigned char hex_bcd(unsigned char hex_data);
17 unsigned char bcd_hex(unsigned char bcd_data);
18 unsigned char code tab[]={0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39};
19 unsigned char code buf[7]={0x00,0x00,0x0c,0x0d,0x0a,0x01,0x0a};//初始时间格式为: 秒 分 时 日 月 星期 年
20 unsigned char data ucCurtime[7];
21 unsigned char a,yearh,yearl,monh,monl,dah,dal,hoh,hol,wekl,mih,mil,seh,sel;
22 unsigned char Addr;
23 //延时
24 void delay()
25 {
26 1 unsigned char y;
27 1 for(y=0;y<75;y++);
28 1 }
29 /********************************************************************
30 * 名称: InputByte
31 * 功能: 向1302写数据
32 ***********************************************************************/
33 void InputByte(unsigned char ucDa)
34 {
35 1 unsigned char i;
36 1 ACC = ucDa;
37 1 for(i=8; i>0; i--)
38 1 {
39 2 T_IO = ACC0; //相当于汇编中的 RRC
40 2 T_CLK = 1;
41 2 T_CLK = 0;
42 2 ACC = ACC >> 1;
43 2 }
44 1 }
45 /********************************************************************
46 * 名称: OutputByte
47 * 功能: 从1302读数据
48 ***********************************************************************/
49 unsigned char OutputByte(void)
50 {
51 1 unsigned char i;
52 1 for(i=8; i>0; i--)
53 1 {
54 2 ACC = ACC >>1; //相当于汇编中的 RRC
55 2 ACC7 = T_IO;
C51 COMPILER V7.06 DS1302 12/20/2008 10:29:42 PAGE 2
56 2 T_CLK = 1;
57 2 T_CLK = 0;
58 2 }
59 1 return(ACC);
60 1 }
61 /********************************************************************
62 * 名称: W1302
63 * 功能: 向1302写数据
64 ***********************************************************************/
65 void W1302(unsigned char ucAddr, unsigned char ucDa)
66 {
67 1 T_RST = 0;
68 1 T_CLK = 0;
69 1 T_RST = 1;
70 1 InputByte(ucAddr); // 地址,命令
71 1 InputByte(ucDa); // 写1Byte数据
72 1 T_CLK = 1;
73 1 T_RST =0;
74 1 }
75 /********************************************************************
76 * 名称: R1302
77 * 功能: 从1302读数据
78 ***********************************************************************/
79 unsigned char R1302(unsigned char ucAddr)
80 {
81 1 unsigned char ucDa,a;
82 1 T_RST = 0;
83 1 T_CLK = 0;
84 1 T_RST = 1;
85 1 InputByte(ucAddr); // 地址,命令
86 1 a = OutputByte(); // 读1Byte数据
87 1 ucDa=bcd_hex(a);
88 1 T_CLK = 1;
89 1 T_RST =0;
90 1 return(ucDa);
91 1 }
92 /********************************************************************
93 * 名称: Set1302
94 * 功能: 设置初始时间
95 * 调用: W1302()
96 * 输入: pSecDa: 初始时间地址。初始时间格式为: 秒 分 时 日 月 星期 年
97 * 7Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B
98 * 返回值: 无
99 ***********************************************************************/
100 void set1302(unsigned char *pSecDa)
101 {
102 1 unsigned char i;
103 1 unsigned char ucAddr = 0x80;
104 1 W1302(0x8e,0x00); // 控制命令,WP=0,写操作?
105 1 for(i=0;i<7;i++)
106 1 {
107 2 W1302(ucAddr,hex_bcd(*pSecDa)); // 秒 分 时 日 月 星期 年
108 2 pSecDa++;
109 2 ucAddr +=2;
110 2 }
111 1 W1302(0x8e,0x80); // 控制命令,WP=1,写保护?
112 1 }
113 /********************************************************************
114 * 名称: write_com
115 * 功能: 写命令到1602
116 * 返回值: 无
117 ***********************************************************************/
C51 COMPILER V7.06 DS1302 12/20/2008 10:29:42 PAGE 3
118 void write_com(unsigned char j)//写命令
119 {
120 1 e=0;
121 1 rs=0;
122 1 rw=0;
123 1 e=1;
124 1 P0=j;
125 1 e=0;
126 1 delay();
127 1 }
128 /********************************************************************
129 * 名称: write_dat
130 * 功能: 写数据到1602
131 * 返回值: 无
132 ***********************************************************************/
133 void write_dat(unsigned char dat)//写数据
134 {
135 1 e=0;
136 1 rs=1;
137 1 rw=0;
138 1 e=1;
139 1 P0=dat;
140 1 e=0;
141 1 delay();
142 1 }
143 /********************************************************************
144 * 名称: init
145 * 功能: 初始化1602
146 * 返回值: 无
147 ***********************************************************************/
148 void init()//初始化lcd
149 {
150 1 write_com(0x01);
151 1 write_com(0x38);
152 1 write_com(0x38);
153 1 write_com(0x0e);
154 1 write_com(0x06);
155 1 write_com(0x0c);
156 1 }
157 /********************************************************************
158 * 名称: write1602
159 * 功能: 向1602指定地址写数据
160 * 返回值: 无
161 ***********************************************************************/
162 void write1602(unsigned char add,unsigned char dat)//写入显示数据
163 {
164 1 write_com(add);
165 1 write_dat(dat);
166 1 }
167 /********************************************************************
168 * 名称: hex_bcd
169 * 功能: 将16进制转成bcd码
170 * 返回值: bcd_data
171 ***********************************************************************/
172 unsigned char hex_bcd(unsigned char hex_data)
173 {
174 1 unsigned char temp=0,bcd_data=0;
175 1 temp=hex_data%100;
176 1 bcd_data=bcd_data|temp/10<<4;
177 1 bcd_data=bcd_data|temp%10;
178 1 return bcd_data;
179 1 }
C51 COMPILER V7.06 DS1302 12/20/2008 10:29:42 PAGE 4
180 /********************************************************************
181 * 名称: bcd_hex
182 * 功能: 将bcd码转成16进制
183 * 返回值: temp
184 ***********************************************************************/
185 unsigned char bcd_hex(unsigned char bcd_data)
186 {
187 1 unsigned char temp=0;
188 1 temp=((bcd_data>>4)*10)+(bcd_data&0x0f);
189 1 return temp;
190 1 }
191 /********************************************************************
192 * 名称: keyscan
193 * 功能: 键盘扫描程序
194 * 返回值: 无
195 ***********************************************************************/
196 void keyscan()
197 {
198 1 unsigned char keynum;
199 1 if(set==0);
200 1 delay();
201 1 if(set==0)
202 1 {
203 2 while(!set);
204 2 delay();
205 2 while(!set);
206 2 keynum++;
207 2 if(keynum==1)
208 2 {
209 3 TR0=0;
210 3 write_com(0x0f);
211 3 write_com(0xce);
212 3 }
213 2 if(keynum==2)
214 2 {
215 3 write_com(0xc8);
216 3 }
217 2 if(keynum==3)
218 2 {
219 3 write_com(0xc5);
220 3 }
221 2 if(keynum==4)
222 2 {
223 3 write_com(0x8b);
224 3 }
225 2 if(keynum==5)
226 2 {
227 3 write_com(0x88);
228 3 }
229 2 if(keynum==6)
230 2 {
231 3 write_com(0x85);
232 3 }
233 2 if(keynum==7)
234 2 {
235 3 keynum=0;
236 3 write_com(0x0c);
237 3 set1302(ucCurtime);
238 3 TR0=1;
239 3 }
240 2
241 2 }
C51 COMPILER V7.06 DS1302 12/20/2008 10:29:42 PAGE 5
242 1
243 1 if(keynum!=0)
244 1 {
245 2 if(add==0)
246 2 delay();
247 2 if(add==0)
248 2 {
249 3 while(!add);
250 3 delay();
251 3 while(!add);
252 3 if(keynum==1)
253 3 {
254 4 ucCurtime[5]++;
255 4 if(ucCurtime[5]>7)
256 4 ucCurtime[5]=1;
257 4 write_com(0xce);
258 4 write_dat(tab[ucCurtime[5]%10]);
259 4 write_com(0xce);
260 4 }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -