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