📄 1302.lst
字号:
C51 COMPILER V7.50 1302 07/27/2007 22:38:52 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 1302
OBJECT MODULE PLACED IN 1302.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE 1302.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*********************************************************************
2
3 公司名称:
4 模块名称:DS1302.c
5 功 能:实时时钟模块 时钟芯片型号:DS1302
6 说 明:
7 程序设计:zhaojunjie
8 设计时间:2002.03.02
9 版 本 号: 20020302
10 *********************************************************************/
11 //#include <jyh.h>
12 #include <intrins.h>
13 #include "me.h"
14 #define uchar unsigned char
15 unsigned int XMS;
16 //sbit T_CLK = P2^7; /*实时时钟时钟线引脚 */
17 //sbit T_IO = P1^4; /*实时时钟数据线引脚 */
18 //sbit T_RST = P1^5; /*实时时钟复位线引脚 */
19 sbit T_CLK = P1^2; /*实时时钟时钟线引脚 */
20 sbit T_IO = P1^3; /*实时时钟数据线引脚 */
21 sbit T_RST = P3^4; /*实时时钟复位线引脚 */
22
23 sbit ACC0 = ACC^0;
24 sbit ACC7 = ACC^7;
25
26 //此处定义数码管各段位置
27 #define a 0x01 //D7
28 #define b 0x02 //D6
29 #define c 0x04 //D4
30 #define d 0x08 //D3
31 #define e 0x10 //D2
32 #define f 0x20 //D0
33 #define g 0x40 //D1
34 #define dot 0x80 //D5
35 //////////////////////////////
36
37 // ~(a+b+c+d+e+f), // 共阳极
38 // (a+b+c+d+e+f), // 共阴极
39 //定义特殊符号
40 //数码管显示时用的编码
41 unsigned char code seg[] =
42 {
43 ~(a+b+c+d+e+f), // 0
44 ~(b+c), // 1
45 ~(a+b+d+e+g), // 2
46 ~(a+b+c+d+g), // 3
47 ~(b+c+f+g), // 4
48 ~(a+c+d+f+g), // 5
49 ~(a+c+d+e+f+g), // 6
50 ~(a+b+c), // 7
51 ~(a+b+c+d+e+f+g), // 8
52 ~(a+b+c+d+f+g), // 9
53 ~(a+b+c+e+f+g), //A
54 ~(c+d+e+f+g), //b
55 ~(a+d+e+f), //C
C51 COMPILER V7.50 1302 07/27/2007 22:38:52 PAGE 2
56 ~(b+c+d+e+g), //d
57 ~(a+d+e+f+g), //E
58 ~(a+e+f+g) //F
59 };
60 char dispbuf[]={0,1,2,3,4,5};
61 char low[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
62 unsigned char stacode=0; //进入设置位数状态
63 void RTInputByte(uchar); /* 输入 1Byte */
64 uchar RTOutputByte(void); /* 输出?1Byte */
65 void W1302(uchar, uchar);
66 uchar R1302(uchar);
67 void Set1302(uchar *); /* 设置时间 */
68 void Bcd2asc(uchar,uchar *);
69 void Get1302(uchar curtime[]); /* 读取1302当前时间 */
70
71 /********************************************************************
72
73 函 数 名:RTInputByte()
74 功 能:实时时钟写入一字节
75 说 明:往DS1302写入1Byte数据 (内部函数)
76 入口参数:d 写入的数据
77 返 回 值:无
78 设 计:zhaojunjie 日 期:2002-03-19
79 修 改: 日 期:
80 ***********************************************************************/
81 void RTInputByte(uchar dat)
82 {
83 1 uchar i;
84 1 ACC = dat;
85 1 for(i=8; i>0; i--)
86 1 {
87 2 T_IO = ACC0; /*相当于汇编中的 RRC */
88 2 T_CLK = 1;
89 2 T_CLK = 0;
90 2 ACC = ACC >> 1;
91 2 }
92 1 }
93 /********************************************************************
94
95 函 数 名:RTOutputByte()
96 功 能:实时时钟读取一字节
97 说 明:从DS1302读取1Byte数据 (内部函数)
98 入口参数:无
99 返 回 值:ACC
100 设 计:zhaojunjie 日 期:2002-03-19
101 修 改: 日 期:
102 ***********************************************************************/
103 uchar RTOutputByte(void)
104 {
105 1 uchar i;
106 1 for(i=8; i>0; i--)
107 1 {
108 2 ACC = ACC >>1; /*相当于汇编中的 RRC */
109 2 ACC7 = T_IO;
110 2 T_CLK = 1;
111 2 T_CLK = 0;
112 2 }
113 1 return(ACC);
114 1 }
115 /********************************************************************
116
117 函 数 名:W1302()
C51 COMPILER V7.50 1302 07/27/2007 22:38:52 PAGE 3
118 功 能:往DS1302写入数据
119 说 明:先写地址,后写命令/数据 (内部函数)
120 调 用:RTInputByte() , RTOutputByte()
121 入口参数:ucAddr: DS1302地址, ucData: 要写的数据
122 返 回 值:无
123 设 计:zhaojunjie 日 期:2002-03-19
124 修 改: 日 期:
125 ***********************************************************************/
126 void W1302(uchar ucAddr, uchar ucDa)
127 {
128 1 T_RST = 0;
129 1 T_CLK = 0;
130 1 T_RST = 1;
131 1 RTInputByte(ucAddr); /* 地址,命令 */
132 1 RTInputByte(ucDa); /* 写1Byte数据*/
133 1 T_CLK = 1;
134 1 T_RST = 0;
135 1 }
136 /********************************************************************
137
138 函 数 名:R1302()
139 功 能:读取DS1302某地址的数据
140 说 明:先写地址,后读命令/数据 (内部函数)
141 调 用:RTInputByte() , RTOutputByte()
142 入口参数:ucAddr: DS1302地址
143 返 回 值:ucData :读取的数据
144 设 计:zhaojunjie 日 期:2002-03-19
145 修 改: 日 期:
146 ***********************************************************************/
147 uchar R1302(uchar ucAddr)
148 {
149 1 uchar ucData;
150 1 T_RST = 0;
151 1 T_CLK = 0;
152 1 T_RST = 1;
153 1 RTInputByte(ucAddr); /* 地址,命令 */
154 1 ucData = RTOutputByte(); /* 读1Byte数据 */
155 1 T_CLK = 1;
156 1 T_RST = 0;
157 1 return(ucData);
158 1 }
159 /********************************************************************
160
161 函 数 名:BurstW1302T()
162 功 能:往DS1302写入时钟数据(多字节方式)
163 说 明:先写地址,后写命令/数据
164 调 用:RTInputByte()
165 入口参数:pWClock: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
166 8Byte (BCD码)1B 1B 1B 1B 1B 1B 1B 1B
167 返 回 值:无
168 设 计:zhaojunjie 日 期:2002-03-19
169 修 改: 日 期:
170 ***********************************************************************/
171 void BurstW1302T(uchar *pWClock)
172 {
173 1 uchar i;
174 1 W1302(0x8e,0x00); /* 控制命令,WP=0,写操作?*/
175 1 T_RST = 0;
176 1 T_CLK = 0;
177 1 T_RST = 1;
178 1 RTInputByte(0xbe); /* 0xbe:时钟多字节写命令 */
179 1 for (i = 8; i>0; i--) /*8Byte = 7Byte 时钟数据 + 1Byte 控制*/
C51 COMPILER V7.50 1302 07/27/2007 22:38:52 PAGE 4
180 1 {
181 2 RTInputByte(*pWClock); /* 写1Byte数据*/
182 2 pWClock++;
183 2 }
184 1 T_CLK = 1;
185 1 T_RST = 0;
186 1 }
187 /********************************************************************
188
189 函 数 名:BurstR1302T()
190 功 能:读取DS1302时钟数据
191 说 明:先写地址/命令,后读数据(时钟多字节方式)
192 调 用:RTInputByte() , RTOutputByte()
193 入口参数:pRClock: 读取时钟数据地址 格式为: 秒 分 时 日 月 星期 年
194 7Byte (BCD码)1B 1B 1B 1B 1B 1B 1B
195 返 回 值:无
196 设 计:zhaojunjie 日 期:2002-03-19
197 修 改: 日 期:
198 ***********************************************************************/
199 void BurstR1302T(uchar *pRClock)
200 {
201 1 uchar i;
202 1 char j;
203 1 T_RST = 0;
204 1 T_CLK = 0;
205 1 T_RST = 1;
206 1 RTInputByte(0xbf); /* 0xbf:时钟多字节读命令 */
207 1 for (i=8; i>0; i--)
208 1 {
209 2 j = RTOutputByte(); /* 读1Byte数据 */
210 2 if (j>=0)
211 2 *pRClock =j; /* 读1Byte数据 */
212 2 pRClock++;
213 2 }
214 1 T_CLK = 1;
215 1 T_RST = 0;
216 1 }
217 /********************************************************************
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -