ds1302.lst
来自「自己做的单片机Proteus仿真实例」· LST 代码 · 共 482 行 · 第 1/2 页
LST
482 行
C51 COMPILER V9.00 DS1302 07/29/2012 18:04:57 PAGE 1
C51 COMPILER V9.00, 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 #define uchar unsigned char
3 #define uint unsigned int
4 sbit lcden=P2^3;
5 sbit lcdrs=P2^4;
6 sbit reset=P2^5;
7 sbit io=P2^6;
8 sbit scl=P2^7;
9 sbit s1=P1^3;
10 sbit s2=P1^5;
11 sbit s3=P1^7;
12 #define DS1302_SECOND 0x80
13 #define DS1302_MINUTE 0x82
14 #define DS1302_HOUR 0x84
15 #define DS1302_WEEK 0x8A
16 #define DS1302_DAY 0x86
17 #define DS1302_MONTH 0x88
18 #define DS1302_YEAR 0x8C
19 char Second,Minute,Hour,Week,Day,Month,Year,flag;
20 uchar code table1[]="20 - - ";
21 uchar code table2[]=" : : ";
22 void delay(uint z)
23 {
24 1 uint x,y;
25 1 for(x=z;x>0;x--)
26 1 for(y=110;y>0;y--);
27 1 }
28 ///////////////DS1302//////////////////////////////////////////////////////////////////
29 void write_byte(uchar date) //实时时钟写入一字节(内部函数)
30 {
31 1 uchar i,j;
32 1 j=date;
33 1 scl=0;
34 1 for(i=8;i>0;i--)
35 1 {
36 2 j=j>>1;
37 2 io=CY; //相当于汇编中的 RRC
38 2 scl=1;
39 2 scl=0;
40 2 }
41 1 }
42
43 uchar read_byte() //实时时钟读取一字节(内部函数)
44 {
45 1 uchar i,j;
46 1 for(i=8;i>0;i--)
47 1 {
48 2 j=j>>1;
49 2 if(io==1)
50 2 j|=0x80; //相当于汇编中的 RRC
51 2 scl=1;
52 2 scl=0;
53 2 }
54 1 return(j);
55 1 }
C51 COMPILER V9.00 DS1302 07/29/2012 18:04:57 PAGE 2
56
57 void write1302(uchar addr,uchar date) //addr: DS1302地址, date 要写的数据
58 {
59 1 reset=0;
60 1 scl=0;
61 1 reset=1;
62 1 write_byte(addr);
63 1 write_byte(date); // 写1Byte数据
64 1 scl=1;
65 1 reset=0;
66 1 }
67
68 uchar read1302(uchar addr) //读取DS1302某地址的数据
69 {
70 1 uchar date;
71 1 reset=0;
72 1 scl=0;
73 1 reset=1;
74 1 write_byte(addr|0x01); // 地址,命令
75 1 date=read_byte(); // 读1Byte数据
76 1 scl=1;
77 1 reset=0;
78 1 return(date);
79 1 }
80 void gettime()
81 {
82 1
83 1 uchar value;
84 1 value=read1302(DS1302_SECOND);
85 1 Second=((value&0x70)>>4)*10+(value&0x0F);
86 1
87 1 value=read1302(DS1302_MINUTE);
88 1 Minute=((value&0x70)>>4)*10+(value&0x0F);
89 1
90 1 value=read1302(DS1302_HOUR);
91 1 Hour=((value&0x70)>>4)*10+(value&0x0F);
92 1
93 1 value=read1302(DS1302_DAY);
94 1 Day=((value&0x70)>>4)*10+(value&0x0F);
95 1
96 1 value=read1302(DS1302_WEEK);
97 1 Week=((value&0x70)>>4)*10+(value&0x0F);
98 1
99 1 value=read1302(DS1302_MONTH);
100 1 Month=((value&0x70)>>4)*10+(value&0x0F);
101 1
102 1 value=read1302(DS1302_YEAR);
103 1 Year=((value&0x70)>>4)*10+(value&0x0F);
104 1
105 1 }
106 ///////////1602显示部分///////////////////////////////////////////////////////////////////////////////////
-/
107 void write_com(uchar com)
108 {
109 1 lcdrs=0;
110 1 P0=com;
111 1 delay(5);
112 1 lcden=1;
113 1 lcden=0;
114 1 }
115 void write_data(uchar date)
116 {
C51 COMPILER V9.00 DS1302 07/29/2012 18:04:57 PAGE 3
117 1 lcdrs=1;
118 1 P0=date;
119 1 delay(5);
120 1 lcden=1;
121 1 lcden=0;
122 1 }
123 void write_sfm(uchar add,uchar date)
124 {
125 1 uchar shi,ge;
126 1 shi=date/10;
127 1 ge=date%10;
128 1 write_com(0x80+0x40+add);
129 1 write_data(0x30+shi);
130 1 write_data(0x30+ge);
131 1 }
132 void write_nyr(uchar add,uchar date)
133 {
134 1 uchar shi,ge;
135 1 shi=date/10;
136 1 ge=date%10;
137 1 write_com(0x80+add);
138 1 write_data(0x30+shi);
139 1 write_data(0x30+ge);
140 1 }
141 void write_week(uchar Week)
142 {
143 1 write_com(0x80+12);
144 1 switch(Week)
145 1 {
146 2 case 1: write_data('M');
147 2 delay(5);
148 2 write_data('O');
149 2 delay(5);
150 2 write_data('N');
151 2 break;
152 2 case 2: write_data('T');
153 2 delay(5);
154 2 write_data('H');
155 2 delay(5);
156 2 write_data('U');
157 2 break;
158 2 case 3: write_data('W');
159 2 delay(5);
160 2 write_data('E');
161 2 delay(5);
162 2 write_data('D');
163 2 break;
164 2 case 4: write_data('T');
165 2 delay(5);
166 2 write_data('H');
167 2 delay(5);
168 2 write_data('U');
169 2 break;
170 2 case 5: write_data('F');
171 2 delay(5);
172 2 write_data('R');
173 2 delay(5);
174 2 write_data('I');
175 2 break;
176 2 case 6: write_data('S');
177 2 delay(5);
178 2 write_data('A');
C51 COMPILER V9.00 DS1302 07/29/2012 18:04:57 PAGE 4
179 2 delay(5);
180 2 write_data('T');
181 2 break;
182 2 case 7: write_data('S');
183 2 delay(5);
184 2 write_data('U');
185 2 delay(5);
186 2 write_data('N');
187 2 break;
188 2 }
189 1 }
190 void display()
191 {
192 1 write_sfm(10,Second);
193 1 write_sfm(7,Minute);
194 1 write_sfm(4,Hour);
195 1 write_week(Week);
196 1 write_nyr(3,Year);
197 1 write_nyr(6,Month);
198 1 write_nyr(9,Day);
199 1 }
200 ///////////扫描键盘////////////////////////////////////////////////////////////////////////////////////
201 void keyscan()
202 {
203 1 uchar s1num;
204 1 if(s1==0)
205 1 {
206 2 delay(5);
207 2 if(s1==0)
208 2 {
209 3 s1num++;
210 3 flag=1;
211 3 while(!s1);
212 3 switch(s1num)
213 3 {
214 4 case 1:write_com(0x80+0x40+10);
215 4 write_com(0x0f);
216 4 break;
217 4 case 2:write_com(0x80+0x40+7);
218 4
219 4 break;
220 4 case 3:write_com(0x80+0x40+4);
221 4
222 4 break;
223 4 case 4:write_com(0x80+12);
224 4
225 4 break;
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?