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