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