📄 时钟ds1302lcd.lst
字号:
C51 COMPILER V7.50 时钟DS1302LCD 04/10/2009 19:42:50 PAGE 1
C51 COMPILER V7.50, COMPILATION OF MODULE 时钟DS1302LCD
OBJECT MODULE PLACED IN 时钟DS1302LCD.OBJ
COMPILER INVOKED BY: E:\Program Files\Keil\C51\BIN\C51.EXE 时钟DS1302LCD.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /********************************************************************
2 * 文件名 : 时钟DS1302LCD.c
3 * 描述 : 该文件实现用DS1302来实现日历和时钟功能,液晶1602上显示出来。
4 * 创建人 : 东流,2009年4月10日
5 * 版本号 : 2.0
6 * 技术支持论坛:www.zidh.com/bbs(请进入“赞助商板块”中的“东流电子工作室”)
7 * 感谢“中国自动化资讯网”对本工作室的大力支持。
8 ***********************************************************************/
9 #include<reg52.h>
10 #include<intrins.h>
11
12 #define uchar unsigned char
13 #define uint unsigned int
14
15 sbit ACC0 = ACC^0;
16 sbit ACC7 = ACC^7;
17 sbit P3_2 = P3^2;
18 sbit P3_5 = P3^4;
19
20 sbit T_CLK = P1^2; /*实时时钟时钟线引脚 */
21 sbit T_IO = P1^3; /*实时时钟数据线引脚 */
22 sbit T_RST = P1^4; /*实时时钟复位线引脚 */
23
24 //这三个引脚参考资料
25 sbit E=P2^7; //1602使能引脚
26 sbit RW=P2^6; //1602读写引脚
27 sbit RS=P2^5; //1602数据/命令选择引脚
28
29 /********************************************************************
30 * 名称 : delay()
31 * 功能 : 延时,延时时间大概为140US。
32 * 输入 : 无
33 * 输出 : 无
34 ***********************************************************************/
35
36 void delay()
37 {
38 1 int i,j;
39 1 for(i=0; i<=10; i++)
40 1 for(j=0; j<=2; j++)
41 1 ;
42 1 }
43
44 /********************************************************************
45 * 名称 : Convert(uchar In_Date)
46 * 功能 : 因为电路设计时,P0.0--P0.7接法刚好了资料中的相反,所以设计该函数。
47 * 输入 : 1602资料上的值
48 * 输出 : 送到1602的值
49 ***********************************************************************/
50 uchar Convert(uchar In_Date)
51 {
52 1 uchar i, Out_Date = 0, temp = 0;
53 1 for(i=0; i<8; i++)
54 1 {
55 2 temp = (In_Date >> i) & 0x01;
C51 COMPILER V7.50 时钟DS1302LCD 04/10/2009 19:42:50 PAGE 2
56 2 Out_Date |= (temp << (7 - i));
57 2 }
58 1 return Out_Date;
59 1 }
60 /********************************************************************
61 * 名称 : enable(uchar del)
62 * 功能 : 1602命令函数
63 * 输入 : 输入的命令值
64 * 输出 : 无
65 ***********************************************************************/
66
67 void enable(uchar del)
68 {
69 1 P0 = Convert(del);
70 1 RS = 0;
71 1 RW = 0;
72 1 E = 0;
73 1 delay();
74 1 E = 1;
75 1 delay();
76 1 }
77
78 /********************************************************************
79 * 名称 : write(uchar del)
80 * 功能 : 1602写数据函数
81 * 输入 : 需要写入1602的数据
82 * 输出 : 无
83 ***********************************************************************/
84
85 void write(uchar del)
86 {
87 1 P0 = Convert(del);
88 1 RS = 1;
89 1 RW = 0;
90 1 E = 0;
91 1 delay();
92 1 E = 1;
93 1 delay();
94 1 }
95
96 /********************************************************************
97 * 名称 : L1602_init()
98 * 功能 : 1602初始化,请参考1602的资料
99 * 输入 : 无
100 * 输出 : 无
101 ***********************************************************************/
102 void L1602_init(void)
103 {
104 1 enable(0x01);
105 1 enable(0x38);
106 1 enable(0x0c);
107 1 enable(0x06);
108 1 enable(0xd0);
109 1 }
110
111 /********************************************************************
112 * 名称 : L1602_char(uchar hang,uchar lie,char sign)
113 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符显示"b" ,调用该函数如下
114 L1602_char(1,5,'b')
115 * 输入 : 行,列,需要输入1602的数据
116 * 输出 : 无
117 ***********************************************************************/
C51 COMPILER V7.50 时钟DS1302LCD 04/10/2009 19:42:50 PAGE 3
118 void L1602_char(uchar hang,uchar lie,char sign)
119 {
120 1 uchar a;
121 1 if(hang == 1) a = 0x80;
122 1 if(hang == 2) a = 0xc0;
123 1 a = a + lie - 1;
124 1 enable(a);
125 1 write(sign);
126 1 }
127
128 /********************************************************************
129 * 名称 : L1602_string(uchar hang,uchar lie,uchar *p)
130 * 功能 : 改变液晶中某位的值,如果要让第一行,第五个字符开始显示"ab cd ef" ,调用该函数如下
131 L1602_string(1,5,"ab cd ef;")
132 * 输入 : 行,列,需要输入1602的数据
133 * 输出 : 无
134 ***********************************************************************/
135 void L1602_string(uchar hang,uchar lie,uchar *p)
136 {
137 1 uchar a;
138 1 if(hang == 1) a = 0x80;
139 1 if(hang == 2) a = 0xc0;
140 1 a = a + lie - 1;
141 1 enable(a);
142 1 while(1)
143 1 {
144 2 if(*p == '\0') break;
145 2 write(*p);
146 2 p++;
147 2 }
148 1 }
149
150 /********************************************************************
151 * 名称 : v_RTInputByte()
152 * 功能 : 往DS1302写入1Byte数据
153 * 输入 : ucDa 写入的数据
154 * 输出 : 无
155 ***********************************************************************/
156 void v_RTInputByte(uchar ucDa)
157 {
158 1 uchar i;
159 1 ACC = ucDa;
160 1 T_RST = 1;
161 1 for(i=8; i>0; i--)
162 1 {
163 2 T_IO = ACC0;
164 2 T_CLK = 1;
165 2 T_CLK = 0;
166 2 ACC = ACC >> 1;
167 2 }
168 1 }
169
170 /********************************************************************
171 * 名称 : uc_RTOutputByte()
172 * 功能 : 从DS1302读取1Byte数据
173 * 输入 : 无
174 * 返回值: ACC
175 ***********************************************************************/
176 uchar uc_RTOutputByte(void)
177 {
178 1 uchar i;
179 1 T_RST = 1;
C51 COMPILER V7.50 时钟DS1302LCD 04/10/2009 19:42:50 PAGE 4
180 1 for(i=8; i>0; i--)
181 1 {
182 2 ACC = ACC >>1;
183 2 T_IO=1;
184 2 ACC7 = T_IO;
185 2 T_CLK = 1;
186 2 T_CLK = 0;
187 2 }
188 1 return(ACC);
189 1 }
190
191 /********************************************************************
192 * 名称 : v_W1302(uchar ucAddr, uchar ucDa)
193 * 功能 : 往DS1302写入数据
194 * 输入 : ucAddr: DS1302地址, ucDa: 要写的数据
195 * 返回值 : 无
196 ***********************************************************************/
197 void v_W1302(uchar ucAddr, uchar ucDa)
198 {
199 1 T_RST = 0;
200 1 T_CLK = 0;
201 1 T_RST = 1;
202 1 v_RTInputByte(ucAddr); // 写地址
203 1 _nop_();
204 1 _nop_();
205 1 v_RTInputByte(ucDa); // 写1Byte数据
206 1 T_CLK = 1;
207 1 T_RST = 0;
208 1 }
209
210 /********************************************************************
211 * 名称 : uc_R1302(uchar ucAddr)
212 * 功能 : 读取DS1302某地址的数据
213 * 输入 : ucAddr: DS1302地址
214 * 返回值 : ucDa :读取的数据
215 ***********************************************************************/
216 uchar uc_R1302(uchar ucAddr)
217 {
218 1 uchar ucDa;
219 1 T_RST = 0;
220 1 T_CLK = 0;
221 1 T_RST = 1;
222 1 v_RTInputByte(ucAddr); //写地址,命令
223 1 _nop_();
224 1 _nop_();
225 1 ucDa = uc_RTOutputByte(); //读1Byte数据
226 1 T_CLK = 1;
227 1 T_RST = 0;
228 1 return(ucDa);
229 1 }
230
231 /********************************************************************
232 * 名称 : v_BurstW1302T
233 * 功能 : 往DS1302写入时钟数据(多字节方式)
234 * 输入 : pSecDa: 时钟数据地址 格式为: 秒 分 时 日 月 星期 年 控制
235 * 8Byte (BCD码) 1B 1B 1B 1B 1B 1B 1B 1B
236 * 返回值 : 无
237 ***********************************************************************/
238 void v_BurstW1302T(uchar *pSecDa)
239 {
240 1 uchar i;
241 1 v_W1302(0x8e, 0x00); //控制命令,WP=0,写操作
C51 COMPILER V7.50 时钟DS1302LCD 04/10/2009 19:42:50 PAGE 5
242 1 T_RST = 0;
243 1 T_CLK = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -