📄 pcf8563.lst
字号:
C51 COMPILER V7.08 PCF8563 03/23/2009 21:41:05 PAGE 1
C51 COMPILER V7.08, COMPILATION OF MODULE PCF8563
OBJECT MODULE PLACED IN pcf8563.OBJ
COMPILER INVOKED BY: D:\Keil\C51\BIN\C51.EXE pcf8563.c BROWSE DEBUG OBJECTEXTEND
line level source
1 /*---------------PCF8563修改历史----------------
2 2008.5.4 添加启动停止函数
3 2008.5.8 添加键值管理和识别函数
4 2008.5.8 添加时间显示函数year_display()等
5 2008.5.9 添加部分调节时间的代码
6 2008.5.11 添加闹钟显示部分
7 2008.5.14 添加时钟关闭程序
8 -----------------------------------------------*/
9 #include <reg52.h>
10 #include <intrins.h>
11 #include "lcd.h"
12 #include "IIC.h"
13 #include "common.h"
14
15
16
17 //开始PCF8563T驱动程序
18
19 /*--------------------------------------------------------------------------------
20 调用方式:void GetPCF8563(uchar firsttype,uchar count,uchar *buff) ﹫2001/08/0 7
21 函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取
22 的字节数,则会一次把时间读取到buff中。顺序是:
23 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
24 ---------------------------------------------------------------------------------*/
25 void GetPCF8563(uchar firsttype,uchar count,uchar *buff)
26 {
27 1 uchar i;
28 1 start();
29 1 sendbyte(0xA2);
30 1 WaitAck();
31 1 sendbyte(firsttype);
32 1 WaitAck();
33 1
34 1 start();
35 1 sendbyte(0xA3);
36 1 WaitAck();
37 1
38 1 for (i=0;i<count;i++)
39 1 {
40 2 buff[i]=receivebyte();
41 2 if (i!=count-1) ack();//除最后一个字节外,其他都要从MASTER发应答。
42 2 }
43 1 n_ack();
44 1 stop();
45 1 }
46
47
48
49 //---------------------------------------------------------------------------------
50 //调用方式:void SetPCF8563(uchar timetype,uchar value) ﹫2001/08/0 7
51 //函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
52 //0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
53 //---------------------------------------------------------------------------------*/
54 void SetPCF8563(uchar timetype,uchar value)
55 {
C51 COMPILER V7.08 PCF8563 03/23/2009 21:41:05 PAGE 2
56 1 start();
57 1 sendbyte(0xA2);
58 1 WaitAck();
59 1 sendbyte(timetype);
60 1 WaitAck();
61 1 sendbyte(value);
62 1 WaitAck();
63 1 stop();
64 1 }
65
66 //---------------------PCF8563启动停止函数------------------------------------------
67 void pcf8563start(void)
68 {
69 1 SetPCF8563(ctrl1,0x00);
70 1 }
71
72 void pcf8563stop(void)
73 {
74 1 SetPCF8563(ctrl1,0x20);
75 1 }
76 //---------------------PCF8563出始时间设定------------------------------------------
77 void setime(void)
78 {
79 1 /*SetPCF8563(year,0x08);
80 1 SetPCF8563(month,0x03);
81 1 SetPCF8563(week,0x01);
82 1 SetPCF8563(day,0x03);
83 1 SetPCF8563(hour,0x12);
84 1 SetPCF8563(minute,0x00);*/
85 1 GetPCF8563(minute,6,rbuf);
86 1 time_display(rbuf);
87 1 return;
88 1 }
89 /********************* 键盘识别程序 **********************/
90 uint getch(void)
91 { uchar X,Y,Z;
92 1 uint k;
93 1 P1=0xff;
94 1 P1=0x0f; //先对P3置数 行扫描
95 1 if(P1!=0x0f) //判断是否有键按下
96 1 {delay(10); //延时,软件去干扰
97 2 if(P1!=0x0f) //确认按键按下X = P3;
98 2 {
99 3 X=P1; //保存行扫描时有键按下时状态
100 3 P1=0xf0; //列扫描
101 3 Y=P1; //保存列扫描时有键按下时状态
102 3 Z=X|Y; //取出键值
103 3
104 3 switch ( Z ) //判断键值(那一个键按下)
105 3 {
106 4 case 0xee: k=13; break; //对键值赋值
107 4 case 0xde: k=11; break;
108 4 case 0xbe: k=0; break;
109 4 case 0x7e: k=10; break;
110 4 case 0xed: k=12; break;
111 4 case 0xdd: k=9; break;
112 4 case 0xbd: k=8; break;
113 4 case 0x7d: k=7; break;
114 4 case 0xeb: k=14; break;
115 4 case 0xdb: k=6; break;
116 4 case 0xbb: k=5;break;
117 4 case 0x7b: k=4;break;
C51 COMPILER V7.08 PCF8563 03/23/2009 21:41:05 PAGE 3
118 4 case 0xe7: k=15;break;
119 4 case 0xd7: k=3;break;
120 4 case 0xb7: k=2;break;
121 4 case 0x77: k=1;break;
122 4 default : k=16;break;
123 4 }
124 3 }
125 2 }
126 1 return k;
127 1 }
128
129 /********************* 键值判断程序**********************/
130 void keyscan(void)
131 { uint key;
132 1 uchar gw,sw;
133 1 key=getch();
134 1 delay(50);
135 1 switch(key) //不同的键值做不同的处理
136 1 {case 15: count++; //mode 功能键
137 2 if((count>=1)&&(count<=6))
138 2 char_display(0x00,LabelCount++);
139 2 else
140 2 {count=0;
141 3 LabelCount=0x3e;
142 3 char_display(0x00,0x20);
143 3 }
144 2 break;
145 2 case 14: GetPCF8563(second,1,vbuf);
146 2 if(vbuf[0]&0x80)
147 2 {lcd_init();
148 3 lcd_display(0x41,battery_low);
149 3 delay(1500);
150 3 lcd_init();
151 3 vbuf[0]=vbuf[0]&0x7f;
152 3 SetPCF8563(second,vbuf[0]); count=0;
153 3 }
154 2 else
155 2 {lcd_init();
156 3 lcd_display(0x01,battery_ok);
157 3 delay(1500);
158 3 lcd_init();
159 3 }
160 2 count=0;
161 2 EnterCount=0;
162 2 AlarmCount=0;
163 2 DataCount=0;
164 2 LightCount=0;
165 2 break;
166 2 case 12: if(count==1) //相加键,递增键为1是调节年寄存器中的数值!
167 2 {
168 3 gw=rbuf[5]&0x0f; //年的个位十位分离
169 3 sw=(rbuf[5]>>4)&0x0f;
170 3 if(gw==0x09) //判断个位和十位是否为9
171 3 {
172 4 if(sw==0x09)
173 4 {gw=0;
174 5 sw=0;
175 5 }
176 4 else
177 4 { gw=0;
178 5 sw+=1;
179 5 }
C51 COMPILER V7.08 PCF8563 03/23/2009 21:41:05 PAGE 4
180 4 }
181 3 else
182 3 gw+=1;
183 3
184 3 rbuf[5]=(sw<<4)+gw;
185 3 SetPCF8563(year,rbuf[5]);
186 3 }
187 2 else if(count==2) //调节月寄存器中的数值!
188 2 {
189 3 rbuf[4]=rbuf[4]&0x1f;
190 3 if(rbuf[4]==0x09)
191 3 rbuf[4]=0x10;
192 3 else if(rbuf[4]==0x12)
193 3 rbuf[4]=0x01;
194 3 else
195 3 rbuf[4]+=1;
196 3 SetPCF8563(month,rbuf[4]);
197 3 }
198 2 else if(count==4)
199 2 {
200 3 rbuf[3]=rbuf[3]&0x07;
201 3 if(rbuf[3]==0x06)
202 3 rbuf[3]=0x00;
203 3 else
204 3 rbuf[3]=rbuf[3]+1;
205 3 SetPCF8563(week,rbuf[3]);
206 3 }
207 2 else if(count==3)
208 2 {
209 3 rbuf[2]=rbuf[2]&0x3f;
210 3 gw=rbuf[2]&0x0f;
211 3 sw=(rbuf[2]>>4)&0x0f;
212 3 if(rbuf[2]==0x31) //判断个位和十位是否为9
213 3 {gw=1;
214 4 sw=0;
215 4 }
216 3 else if(gw==0x09)
217 3 {gw=0;
218 4 sw+=1;
219 4 }
220 3 else
221 3 gw+=1;
222 3 rbuf[2]=(sw<<4)+gw;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -