📄 ds1302.lst
字号:
C51 COMPILER V7.06 DS1302 02/28/2009 00:12:56 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE DS1302.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 /***********************************************************
2 实验名称:带有温度显示的数字钟(LCD12864显示)示例程序
3 程序说明:不能用STC89C52,因为容量不足。把程序烧到STC89C58上,然后正确插上12864,关闭点阵管显示,如果USB供
-电不足请用外部变压器供电。
4 作者:RF-X1开发板团队
5 日期:2008-08-01
6 ***********************************************************/
7
8 #include <REG51.H>
9 #include <intrins.h>
10 #define uint unsigned int
11 #define uchar unsigned char
12 sbit DS1302_CLK = P3^2; //实时时钟时钟线引脚
13 sbit DS1302_IO = P3^3; //实时时钟数据线引脚
14 sbit DS1302_RST = P3^4; //实时时钟复位线引脚
15 sbit DQ = P3^5; //温度传送数据IO口
16 sbit ACC0 = ACC^0;
17 sbit ACC7 = ACC^7;
18 uchar hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
19 sbit Set = P3^5; //模式切换键 对应实验板S4
20 sbit Up = P3^6; //加法按钮 对应实验板S2
21 sbit Down= P3^7; //减法按钮 对应实验板S5
22 //sbit out = P3^4; //立刻跳出调整模式按钮 对应实验板S1
23 uchar done,count,temp,up_flag,down_flag;
24 uchar temp_value,temp1_value; //temp_value温度值正数部分 temp1_value温度值小数部分
25 uchar TempBuffer[8],week_value[3];
26 void show_time(); //液晶显示程序
27
28 //****************************************
29 //12864液晶显示部分子程序模块
30 //****************************************
31 sbit rs = P2^0;
32 sbit rw = P2^1;
33 sbit e = P2^2;
34 #define lcddata P1
35 sbit busy=P1^7; //lcd busy bit
36 void wr_d_lcd(uchar content);
37 void wr_i_lcd(uchar content);
38 void clrram_lcd (void);
39 void init_lcd(void);
40 void busy_lcd(void);
41 void rev_row_lcd(uchar row);
42 void rev_co_lcd(uchar row,uchar col,uchar mode);
43 void clr_lcd(void);
44 void wr_co_lcd(uchar row,uchar col,uchar lcddata1,uchar lcddtta2);
45 void wr_row_lcd(uchar row,char *p);
46
47 //**********************************
48 //液晶初始化
49 //**********************************
50 void init_lcd(void)
51 {
52 1 wr_i_lcd(0x06); /*光标的移动方向*/
53 1 wr_i_lcd(0x0c); /*开显示,关游标*/
54 1 }
C51 COMPILER V7.06 DS1302 02/28/2009 00:12:56 PAGE 2
55
56 //***********************************
57 //填充液晶DDRAM全为空格
58 //**********************************
59 void clrram_lcd (void)
60 {
61 1 wr_i_lcd(0x30);
62 1 wr_i_lcd(0x01);
63 1 }
64
65 //***********************************
66 //对液晶写数据
67 //content为要写入的数据
68 //***********************************
69 void wr_d_lcd(uchar content)
70 {
71 1 busy_lcd();
72 1 rs=1;
73 1 rw=0;
74 1 lcddata=content;
75 1 e=1;
76 1 ;
77 1 e=0;
78 1 }
79
80 //********************************
81 //对液晶写指令
82 //content为要写入的指令代码
83 //*****************************
84 void wr_i_lcd(uchar content)
85 {
86 1 busy_lcd();
87 1 rs=0;
88 1 rw=0;
89 1 lcddata=content;
90 1 e=1;
91 1 ;
92 1 e=0;
93 1 }
94
95 //********************************
96 //液晶检测忙状态
97 //在写入之前必须执行
98 //********************************
99 void busy_lcd(void)
100 {
101 1 lcddata=0xff;
102 1 rs=0;
103 1 rw=1;
104 1 e =1;
105 1 while(busy==1);
106 1 e =0;
107 1 }
108
109 //********************************
110 //指定要显示字符的坐标
111 //*******************************
112
113 void gotoxy(unsigned char y, unsigned char x)
114 {
115 1 if(y==1)
116 1 wr_i_lcd(0x80|x);
C51 COMPILER V7.06 DS1302 02/28/2009 00:12:56 PAGE 3
117 1 if(y==2)
118 1 wr_i_lcd(0x90|x);
119 1 if(y==3)
120 1 wr_i_lcd((0x80|x)+8);
121 1 if(y==4)
122 1 wr_i_lcd((0x90|x)+8);
123 1 }
124
125 //**********************************
126 //液晶显示字符串程序
127 //**********************************
128 void print(uchar *str)
129 {
130 1 while(*str!='\0')
131 1 {
132 2 wr_d_lcd(*str);
133 2 str++;
134 2 }
135 1 }
136
137 //***********************************
138 //DS1302时钟部分子程序模块
139 //***********************************
140 typedef struct __SYSTEMTIME__
141 {
142 uchar Second;
143 uchar Minute;
144 uchar Hour;
145 uchar Week;
146 uchar Day;
147 uchar Month;
148 uchar Year;
149 uchar DateString[11];
150 uchar TimeString[9];
151 }SYSTEMTIME; //定义的时间类型
152 SYSTEMTIME CurrentTime;
153
154
155 #define AM(X) X
156 #define PM(X) (X+12) // 转成24小时制
157 #define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
158 #define DS1302_MINUTE 0x82
159 #define DS1302_HOUR 0x84
160 #define DS1302_WEEK 0x8A
161 #define DS1302_DAY 0x86
162 #define DS1302_MONTH 0x88
163 #define DS1302_YEAR 0x8C
164
165 //**********************************
166 //实时时钟写入一字节(内部函数)
167 //**********************************
168 void DS1302InputByte(uchar d)
169 {
170 1 uchar i;
171 1 ACC = d;
172 1 for(i=8; i>0; i--)
173 1 {
174 2 DS1302_IO = ACC0; //相当于汇编中的 RRC
175 2 DS1302_CLK = 1;
176 2 DS1302_CLK = 0;
177 2 ACC = ACC >> 1;
178 2 }
C51 COMPILER V7.06 DS1302 02/28/2009 00:12:56 PAGE 4
179 1 }
180
181 //*************************************
182 //实时时钟读取一字节(内部函数)
183 //*************************************
184 uchar DS1302OutputByte(void)
185 {
186 1 uchar i;
187 1 for(i=8; i>0; i--)
188 1 {
189 2 ACC = ACC >>1; //相当于汇编中的 RRC
190 2 ACC7 = DS1302_IO;
191 2 DS1302_CLK = 1;
192 2 DS1302_CLK = 0;
193 2 }
194 1 return(ACC);
195 1 }
196
197 //**************************************
198 //ucAddr: DS1302地址, ucData: 要写的数据
199 //**************************************
200 void Write1302(uchar ucAddr, uchar ucDa)
201 {
202 1 DS1302_RST = 0;
203 1 DS1302_CLK = 0;
204 1 DS1302_RST = 1;
205 1 DS1302InputByte(ucAddr); // 地址,命令
206 1 DS1302InputByte(ucDa); // 写1Byte数据
207 1 DS1302_CLK = 1;
208 1 DS1302_RST = 0;
209 1 }
210
211 //**************************************
212 //读取DS1302某地址的数据
213 //**************************************
214 uchar Read1302(uchar ucAddr)
215 {
216 1 uchar ucData;
217 1 DS1302_RST = 0;
218 1 DS1302_CLK = 0;
219 1 DS1302_RST = 1;
220 1 DS1302InputByte(ucAddr|0x01); // 地址,命令
221 1 ucData = DS1302OutputByte(); // 读1Byte数据
222 1 DS1302_CLK = 1;
223 1 DS1302_RST = 0;
224 1 return(ucData);
225 1 }
226
227 //******************************************
228 //获取时钟芯片的时钟数据到自定义的结构型数组
229 //******************************************
230 void DS1302_GetTime(SYSTEMTIME *Time)
231 {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -