📄 ds1302beta0.lst
字号:
C51 COMPILER V7.06 DS1302BETA0 09/06/2008 18:49:08 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE DS1302BETA0
OBJECT MODULE PLACED IN DS1302Beta0.OBJ
COMPILER INVOKED BY: D:\Program Files\keil\C51\BIN\C51.EXE DS1302Beta0.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg52.h>
2
3 sbit DS_CLK=P3^5;
4 sbit DS_IO=P3^6;
5 sbit DS_RST=P3^7;
6 sbit BIT7=ACC^7;
7 sbit BIT0=ACC^0;
8 char curtime[7];
9 unsigned char code num[10]={0x3F,0x06,0x5B,0x4F,0x66,
10 0x6D,0x7D,0x07,0x7F,0x6F
11 };//0~9编码
12 unsigned char key;
13
14 //八位数据写入函数
15 void InputByte(unsigned char ucData)
16 {
17 1 unsigned char i;
18 1 ACC=ucData;
19 1 DS_RST=1;
20 1
21 1 for (i=8;i>0;i--)
22 1 {
23 2 DS_IO=BIT0;
24 2 DS_CLK=0;
25 2 DS_CLK=1;
26 2 ACC=ACC>>1;
27 2 }
28 1 }
29
30 //八位数据读出函数
31 unsigned char OutputByte(void)
32 {
33 1 unsigned char i;
34 1 DS_RST=1;
35 1
36 1 for (i=8;i>0;i--)
37 1 {
38 2 ACC=ACC>>1;
39 2 DS_IO=1;
40 2 DS_CLK=1;
41 2 DS_CLK=0;
42 2 BIT7=DS_IO;
43 2 }
44 1
45 1 return(ACC);
46 1 }
47
48 //将指令或数据写入指定寄存器
49 void Write_1302(unsigned char add,unsigned char ucData)
50 {
51 1 DS_RST=0;
52 1 DS_CLK=0;
53 1 DS_RST=1;
54 1 InputByte(add);
55 1 InputByte(ucData);
C51 COMPILER V7.06 DS1302BETA0 09/06/2008 18:49:08 PAGE 2
56 1 DS_RST=0;
57 1 //DS_IO=1;////???没用
58 1 }
59
60 //读出对应寄存器数据
61 unsigned char Read_1302(unsigned char add)
62 {
63 1 unsigned char ucData;
64 1
65 1 DS_RST=0;
66 1 DS_CLK=0;
67 1 DS_RST=1;
68 1 InputByte(add);
69 1 ucData=OutputByte();
70 1 DS_RST=0;
71 1 return(ucData);
72 1 }
73
74 //设置时间初值
75 void SetTime(unsigned char *time)
76 {
77 1 unsigned char i;
78 1 unsigned char add=0x80;
79 1
80 1 Write_1302(0x8E,0x00);//禁止写保护
81 1 for (i=7;i>0;i--)
82 1 {
83 2 Write_1302(add,*time);
84 2 time++;
85 2 add+=2;
86 2 }
87 1 Write_1302(0x8E,0x80);//写保护
88 1 }
89
90 //获取时间值
91 void GetTime(void)
92 {
93 1 unsigned char i,j;
94 1 unsigned char add=0x81;
95 1 unsigned char temp;
96 1
97 1 for (i=0;i<7;i++)
98 1 {
99 2 curtime[i]=Read_1302(add);
100 2 temp=curtime[i];
101 2 j=temp>>4;
102 2 j*=10;
103 2 temp=temp&0x0F;
104 2 temp+=j;
105 2 curtime[i]=temp;
106 2 add+=2;
107 2 }
108 1 }
109
110 //十进制时间转化成BCD码
111 void convert(unsigned char *p)
112 {
113 1 unsigned char i;
114 1 unsigned char temp;
115 1
116 1 for (i=0;i<7;i++)
117 1 {
C51 COMPILER V7.06 DS1302BETA0 09/06/2008 18:49:08 PAGE 3
118 2 temp=(*p)/10;
119 2 temp=temp<<4;
120 2 temp+=(*p)%10;
121 2 *p=temp;
122 2 p++;
123 2 }
124 1 }
125
126 /*****判断键盘是否按下*****/
127 bit JudgeKey(void)
128 {
129 1 unsigned char i;
130 1 P2=0xF0;
131 1 if ((P2&0xF0)!=0xF0)
132 1 {
133 2 for (i=100;i>0;i--); //延时,消抖
134 2 if ((P2&0xF0)!=0xF0)
135 2 {
136 3 return 1;//确实有键按下
137 3 }
138 2 else
139 2 {
140 3 return 0;//实际无键按下
141 3 }
142 2 }
143 1 else
144 1 {
145 2 return 0; //无键按下
146 2 }
147 1 }
148
149 /*判断具体按下的是哪一个键*/
150 void WhichKey(void)
151 {
152 1 unsigned char col;
153 1 unsigned char row;
154 1 switch(P2)
155 1 {
156 2 case 0x70:
157 2 col=1; break;
158 2 case 0xB0:
159 2 col=2; break;
160 2 case 0xD0:
161 2 col=3; break;
162 2 case 0xE0:
163 2 col=4; break;
164 2 default:
165 2 break;
166 2 }
167 1 P2=0x0F;
168 1 switch(P2)
169 1 {
170 2 case 0x07:
171 2 row=1; break;
172 2 case 0x0B:
173 2 row=2; break;
174 2 case 0x0D:
175 2 row=3; break;
176 2 case 0x0E:
177 2 row=4; break;
178 2 default:
179 2 break;
C51 COMPILER V7.06 DS1302BETA0 09/06/2008 18:49:08 PAGE 4
180 2 }
181 1 key=4*(col-1)+row;
182 1 }
183
184
185 /*LED显示时间*/
186 void Display(void)
187 {
188 1 unsigned int i;
189 1 unsigned char Dspbuf[6]; //时间显示缓存数组
190 1 unsigned char temp; //临时变量,用于存编码的下标
191 1 char k;
192 1 for (i=0;i<3;i++)
193 1 {
194 2 temp=curtime[i]%10;
195 2 Dspbuf[2*i]=num[temp];//Dspbuf[2*i+0]
196 2 temp=curtime[i]/10;
197 2 Dspbuf[2*i+1]=num[temp];
198 2 }
199 1 for (k=0;k<=5;k++) //动态显示
200 1 {
201 2 P0=Dspbuf[k];
202 2 for (i=300;i>0;i--); //延时
203 2 if (P1&0x20) //位选循环左移
204 2 P1=(P1<<1)+1;
205 2 else
206 2 {
207 3 P1=P1<<1;
208 3 P0=Dspbuf[0];
209 3 }
210 2 }
211 1 }
212
213 /*键盘动作*/
214 void Keyscan(void)
215 {
216 1 bit flag;
217 1 unsigned char *p;
218 1
219 1 if(JudgeKey())
220 1 {
221 2 WhichKey();
222 2 if (key==4)
223 2 {
224 3 Write_1302(0x80,0x80);
225 3 flag=1;
226 3 }
227 2 while (flag==1)
228 2 {
229 3 if (JudgeKey())
230 3 {
231 4 do
232 4 {
233 5 WhichKey();
234 5 Display();
235 5 }
236 4 while(JudgeKey());//等待按键释放
237 4
238 4 switch (key)
239 4 {
240 5 case 1:
241 5 curtime[2]++;
C51 COMPILER V7.06 DS1302BETA0 09/06/2008 18:49:08 PAGE 5
242 5 if (curtime[2]==24)
243 5 curtime[2]=0;
244 5 break;
245 5 case 2:
246 5 curtime[1]++;
247 5 if (curtime[1]==60)
248 5 curtime[1]=0;
249 5 break;
250 5 case 3:
251 5 curtime[0]++;
252 5 if (curtime[0]==60)
253 5 curtime[0]=0;
254 5 break;
255 5 case 5:
256 5 curtime[2]--;
257 5 if (curtime[2]<0)
258 5 curtime[2]=23;
259 5 break;
260 5 case 6:
261 5 curtime[1]--;
262 5 if (curtime[1]<0)
263 5 curtime[1]=59;
264 5 break;
265 5 case 7:
266 5 curtime[0]--;
267 5 if (curtime[0]<0)
268 5 curtime[0]=59;
269 5 break;
270 5 case 8:
271 5 Write_1302(0x80,0x00);
272 5 flag=0;
273 5 p=&curtime[0];
274 5 convert(p);
275 5 p=&curtime[0];
276 5 SetTime(p);
277 5 break;
278 5 default:
279 5 break;
280 5 }
281 4 }
282 3 Display();
283 3 }
284 2 }
285 1 }
286
287 void main()
288 {
289 1 unsigned char *p;
290 1 unsigned char settime[7]={0,0,0,0,0,0,0};
291 1
292 1 P0=0xFF;
293 1 P1=0xFE;
294 1 p=&settime[0];
295 1 convert(p);
296 1 p=&settime[0];
297 1 SetTime(p);
298 1 do{
299 2 GetTime();
300 2 Display();
301 2 Keyscan();
302 2 }while(1);
303 1 }
C51 COMPILER V7.06 DS1302BETA0 09/06/2008 18:49:08 PAGE 6
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 694 ----
CONSTANT SIZE = 17 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 8 16
IDATA SIZE = ---- ----
BIT SIZE = ---- 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -