📄 ds1302.lst
字号:
C51 COMPILER V8.08 DS1302 07/17/2008 11:24:54 PAGE 1
C51 COMPILER V8.08, COMPILATION OF MODULE DS1302
OBJECT MODULE PLACED IN DS1302.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil\C51\BIN\C51.EXE DS1302.c BROWSE DEBUG OBJECTEXTEND CODE
line level source
1 #include "REG51.H"
2 #include "intrins.h"
3 #define uint unsigned int
4 #define uchar unsigned char
5 sbit DS1302_CLK = P2^2; //实时时钟时钟线引脚
6 sbit DS1302_IO = P2^3; //实时时钟数据线引脚
7 sbit DS1302_RST = P2^4; //实时时钟复位线引脚
8 sbit ACC0 = ACC^0;
9 sbit ACC7 = ACC^7;
10
11 sbit Set = P1^0; //模式切换键
12 sbit Up = P1^1; //加法按钮
13 sbit Down = P1^2; //减法按钮
14 sbit out = P1^3; //立刻跳出调整模式按钮
15 sbit K1=P1^4;
16 sbit K2=P1^5;
17 sbit DQ = P2^1; //温度传送数据IO口
18 sbit voice=P2^0;
19 uchar hide_sec,hide_min,hide_hour,hide_day,hide_week,hide_month,hide_year; //秒,分,时到日,月,年位闪的计数
20 uchar done,temp,addr;
21 uchar alarm_TimeString[6]="10:01";
22 uchar temp_value,temp1_value; //温度值
23 uchar TempBuffer[5],max_temp[4],min_temp[4],week_value[2];
24
25
26 void show_time(); //液晶显示程序
27 ///////////////////////////////////////////////////
28 /***********1602液晶显示部分子程序****************/
29 ///////////////////////////////////////////////////
30
31 //Port Definitions**********************************************************
32 sbit LcdRs = P2^5;
33 sbit LcdRw = P2^6;
34 sbit LcdEn = P2^7;
35 sfr DBPort = 0x80; //P0=0x80,P1=0x90,P2=0xA0,P3=0xB0.数据端口
36 void delay_key(uint a)
37 {
38 1 uint b;
39 1 for(b=0;b<a;b++);
40 1 }
41 //向LCD写入命令或数据********************************************************
42 #define LCD_COMMAND 0 // Command
43 #define LCD_DATA 1 // Data
44 #define LCD_CLEAR_SCREEN 0x01 // 清屏
45 #define LCD_HOMING 0x02 // 光标返回原点
46 void LCD_Write(bit style, uchar input)
47 {
48 1 LcdRs=style;
49 1 LcdRw=0;
50 1 P0=input;
51 1 delay_key(10);
52 1 LcdEn=1;
53 1 delay_key(10);
54 1 LcdEn=0;
55 1 }
C51 COMPILER V8.08 DS1302 07/17/2008 11:24:54 PAGE 2
56
57 //设置显示模式************************************************************
58 #define LCD_SHOW 0x04 //显示开
59 #define LCD_HIDE 0x00 //显示关
60
61 #define LCD_CURSOR 0x02 //显示光标
62 #define LCD_NO_CURSOR 0x00 //无光标
63
64 #define LCD_FLASH 0x01 //光标闪动
65 #define LCD_NO_FLASH 0x00 //光标不闪动
66
67 void LCD_SetDisplay(unsigned char DisplayMode)
68 {
69 1 LCD_Write(LCD_COMMAND, 0x08|DisplayMode);
70 1 }
71
72 //设置输入模式************************************************************
73 #define LCD_AC_UP 0x02
74 #define LCD_AC_DOWN 0x00 // default
75
76 #define LCD_MOVE 0x01 // 画面可平移
77 #define LCD_NO_MOVE 0x00 //default
78
79 void LCD_SetInput(unsigned char InputMode)
80 {
81 1 LCD_Write(LCD_COMMAND, 0x04|InputMode);
82 1 }
83
84 //初始化LCD************************************************************
85 void LCD_Initial()
86 {
87 1 LcdEn=0;
88 1 LCD_Write(LCD_COMMAND,0x38); //8位数据端口,2行显示,5*7点阵
89 1 LCD_Write(LCD_COMMAND,0x38);
90 1 LCD_SetDisplay(LCD_SHOW|LCD_NO_CURSOR); //开启显示, 无光标
91 1 LCD_Write(LCD_COMMAND,LCD_CLEAR_SCREEN); //清屏
92 1 LCD_SetInput(LCD_AC_UP|LCD_NO_MOVE); //AC递增, 画面不动
93 1 }
94
95 //液晶字符输入的位置************************
96 void GotoXY(unsigned char x, unsigned char y)
97 {
98 1 if(y==0)
99 1 LCD_Write(LCD_COMMAND,0x80|x);
100 1 if(y==1)
101 1 LCD_Write(LCD_COMMAND,0x80|(x-0x40));
102 1 }
103
104 //将字符输出到液晶显示
105 void Print(unsigned char *str)
106 {
107 1 while(*str!='\0')
108 1 {
109 2 LCD_Write(LCD_DATA,*str);
110 2 str++;
111 2 }
112 1 }
113 ///////////////////////////////////////////////////
114 /***********DS1302时钟部分子程序******************/
115 ///////////////////////////////////////////////////
116 typedef struct __SYSTEMTIME__
117 {
C51 COMPILER V8.08 DS1302 07/17/2008 11:24:54 PAGE 3
118 unsigned char Second;
119 unsigned char Minute;
120 unsigned char Hour;
121 unsigned char Week;
122 unsigned char Day;
123 unsigned char Month;
124 unsigned char Year;
125 unsigned char DateString[11];
126 unsigned char TimeString[9];
127 }SYSTEMTIME; //定义的时间类型
128 SYSTEMTIME CurrentTime,ad_CurrentTime,*alarmtime;
129
130
131
132
133 #define AM(X) X
134 #define PM(X) (X+12) // 转成24小时制
135 #define DS1302_SECOND 0x80 //时钟芯片的寄存器位置,存放时间
136 #define DS1302_MINUTE 0x82
137 #define DS1302_HOUR 0x84
138 #define DS1302_WEEK 0x8A
139 #define DS1302_DAY 0x86
140 #define DS1302_MONTH 0x88
141 #define DS1302_YEAR 0x8C
142 #define DS1302_WRITE 0x8E
143 void DS1302InputByte(unsigned char d) //实时时钟写入一字节(内部函数)
144 {
145 1 unsigned char i;
146 1 ACC = d;
147 1 for(i=8; i>0; i--)
148 1 {
149 2 DS1302_IO = ACC0; //相当于汇编中的 RRC
150 2 DS1302_CLK = 1;
151 2 DS1302_CLK = 0;
152 2 ACC = ACC >> 1;
153 2 }
154 1 }
155
156 unsigned char DS1302OutputByte(void) //实时时钟读取一字节(内部函数)
157 {
158 1 unsigned char i;
159 1 for(i=8; i>0; i--)
160 1 {
161 2 ACC = ACC >>1; //相当于汇编中的 RRC
162 2 ACC7 = DS1302_IO;
163 2 DS1302_CLK = 1;
164 2 DS1302_CLK = 0;
165 2 }
166 1 return(ACC);
167 1 }
168
169 void Write1302(unsigned char ucAddr, unsigned char ucDa) //ucAddr: DS1302地址, ucData: 要写的数据
170 {
171 1 DS1302_RST = 0;
172 1 DS1302_CLK = 0;
173 1 DS1302_RST = 1;
174 1 DS1302InputByte(ucAddr); // 地址,命令
175 1 DS1302InputByte(ucDa); // 写1Byte数据
176 1 DS1302_CLK = 1;
177 1 DS1302_RST = 0;
178 1 }
179
C51 COMPILER V8.08 DS1302 07/17/2008 11:24:54 PAGE 4
180 unsigned char Read1302(unsigned char ucAddr) //读取DS1302某地址的数据
181 {
182 1 unsigned char ucData;
183 1 DS1302_RST = 0;
184 1 DS1302_CLK = 0;
185 1 DS1302_RST = 1;
186 1 DS1302InputByte(ucAddr|0x01); // 地址,命令
187 1 ucData = DS1302OutputByte(); // 读1Byte数据
188 1 DS1302_CLK = 1;
189 1 DS1302_RST = 0;
190 1 return(ucData);
191 1 }
192
193
194
195 void DS1302_GetTime(SYSTEMTIME *Time) //获取时钟芯片的时钟数据到自定义的结构型数组
196 {
197 1 unsigned char ReadValue;
198 1 ReadValue = Read1302(DS1302_SECOND);
199 1 Time->Second = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
200 1 ReadValue = Read1302(DS1302_MINUTE);
201 1 Time->Minute = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
202 1 ReadValue = Read1302(DS1302_HOUR);
203 1 Time->Hour = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
204 1 ReadValue = Read1302(DS1302_DAY);
205 1 Time->Day = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
206 1 ReadValue = Read1302(DS1302_WEEK);
207 1 Time->Week = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
208 1 ReadValue = Read1302(DS1302_MONTH);
209 1 Time->Month = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
210 1 ReadValue = Read1302(DS1302_YEAR);
211 1 Time->Year = ((ReadValue&0x70)>>4)*10 + (ReadValue&0x0F);
212 1 }
213
214 void DateToStr(SYSTEMTIME *Time) //将时间年,月,日,星期数据转换成液晶显示字符串,放到数组里DateString[]
215 { if(hide_year<2) //这里的if,else语句都是判断位闪烁,<2显示数据,>2就不显示
216 1 {
217 2 Time->DateString[0] = '2';
218 2 Time->DateString[1] = '0';
219 2 Time->DateString[2] = Time->Year/10 + '0';
220 2 Time->DateString[3] = Time->Year%10 + '0';
221 2 }
222 1 else
223 1 {
224 2 Time->DateString[0] = ' ';
225 2 Time->DateString[1] = ' ';
226 2 Time->DateString[2] = ' ';
227 2 Time->DateString[3] = ' ';
228 2 }
229 1 Time->DateString[4] = '/';
230 1 if(hide_month<2)
231 1 {
232 2 Time->DateString[5] = Time->Month/10 + '0';
233 2 Time->DateString[6] = Time->Month%10 + '0';
234 2 }
235 1 else
236 1 {
237 2 Time->DateString[5] = ' ';
238 2 Time->DateString[6] = ' ';
239 2 }
240 1 Time->DateString[7] = '/';
241 1 if(hide_day<2)
C51 COMPILER V8.08 DS1302 07/17/2008 11:24:54 PAGE 5
242 1 {
243 2 Time->DateString[8] = Time->Day/10 + '0';
244 2 Time->DateString[9] = Time->Day%10 + '0';
245 2 }
246 1 else
247 1 {
248 2 Time->DateString[8] = ' ';
249 2 Time->DateString[9] = ' ';
250 2 }
251 1 if(hide_week<2)
252 1 {
253 2 week_value[0] = Time->Week%10 + '0'; //星期的数据另外放到 week_value[]数组里,跟年,月,日的分开存放,因为
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -