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