📄 ptf8563.lst
字号:
C51 COMPILER V7.06 PTF8563 12/18/2007 11:18:08 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PTF8563
OBJECT MODULE PLACED IN ptf8563.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE ptf8563.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1
2 #include "c51base.h"
3
4
5
6 static void SomeNOP()
7 {
8 1 uchar idata i=3;
9 1 while(i)
10 1 i--;
11 1 }
12
13 /**--------------------------------------------------------------------------------
14 调用方式:void I2CStart(void) ﹫2001/07/0 4
15 函数说明:私有函数,I2C专用
16 --------------------------------------------------------------------------------*/
17 static void I2CStart(void)
18 {
19 1 EA=0;
20 1 SDA=1; SCL=1; SomeNOP();//INI
21 1 SDA=0; SomeNOP(); //START
22 1 SCL=0;
23 1 }
24
25 /**--------------------------------------------------------------------------------
26 调用方式:void I2CStop(void) ﹫2001/07/0 4
27 函数说明:私有函数,I2C专用
28 ---------------------------------------------------------------------------------*/
29 static void I2CStop(void)
30 {
31 1 SCL=0; SDA=0; SomeNOP(); //INI
32 1 SCL=1; SomeNOP(); SDA=1; //STOP
33 1 EA=1;
34 1 }
35
36 /**--------------------------------------------------------------------------------
37 53 调用方式:bit I2CAck(void) ﹫2001/07/0 4
38 54 函数说明:私有函数,I2C专用,等待从器件接收方的应答
39 55 ---------------------------------------------------------------------------------*/
40 static bit WaitAck(void)
41 {
42 1 uchar idata errtime=255;//因故障接收方无ACK,超时值为255。
43 1 SDA=1;SomeNOP();
44 1 SCL=1;SomeNOP();
45 1 while(SDA)
46 1 {
47 2 errtime--;
48 2 if (!errtime)
49 2 {
50 3 I2CStop();
51 3 return false;
52 3 }
53 2 }
54 1 SCL=0;
55 1 return true;
C51 COMPILER V7.06 PTF8563 12/18/2007 11:18:08 PAGE 2
56 1 }
57
58 /**--------------------------------------------------------------------------------
59 调用方式:void SendAck(void) ﹫2001/07/0 4
60 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,应答信号。
61 ---------------------------------------------------------------------------------*/
62 static void SendAck(void)
63 {
64 1 SDA=0; SomeNOP();
65 1 SCL=1; SomeNOP();
66 1 SCL=0;
67 1 }
68
69 /**--------------------------------------------------------------------------------
70 调用方式:void SendAck(void) ﹫2001/07/0 4
71 函数说明:私有函数,I2C专用,主器件为接收方,从器件为发送方时,非应答信号。
72 -------------------------------------------------------------------------------*/
73 static void SendNotAck(void)
74 {
75 1 SDA=1; SomeNOP();
76 1 SCL=1; SomeNOP();
77 1 SCL=0;
78 1 }
79
80 /**--------------------------------------------------------------------------------
81 调用方式:void I2CSend(uchar ch) ﹫2001/07/0 5
82 函数说明:私有函数,I2C专用
83 ---------------------------------------------------------------------------------*/
84 static void I2CSendByte(uchar ch)
85 {
86 1 uchar idata i=8;
87 1 while (i--)
88 1 {
89 2 SCL=0;
90 2 ;
91 2 SDA=(bit)(ch&0x80); ch<<=1; SomeNOP();
92 2 SCL=1; SomeNOP();
93 2 }
94 1 SCL=0;
95 1 }
96
97 /**--------------------------------------------------------------------------------
98 调用方式:uchar I2CReceive(void) ﹫2001/07/0 5
99 函数说明:私有函数,I2C专用
100 ---------------------------------------------------------------------------------*/
101 static uchar I2CReceiveByte(void)
102 {
103 1 uchar idata i=8;
104 1 uchar idata ddata=0;
105 1 SDA=1;
106 1 while (i--)
107 1 {
108 2 ddata<<=1;
109 2 SCL=0;SomeNOP();
110 2 SCL=1;SomeNOP();
111 2 ddata|=SDA;
112 2 }
113 1 SCL=0;
114 1 return ddata;
115 1 }
116
117 //---------------------------------------------------------------------------
C51 COMPILER V7.06 PTF8563 12/18/2007 11:18:08 PAGE 3
118 //开始PCF8563T驱动程序
119 /**--------------------------------------------------------------------------------
120 调用方式:void GetPCF8563(uchar firsttype,uchar count,uchar *buff) ﹫2001/08/0 7
121 函数说明:读取时钟芯片PCF8563的时间,设置要读的第一个时间类型firsttype,并设置读取
122 的字节数,则会一次把时间读取到buff中。顺序是:
123 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
124 ---------------------------------------------------------------------------------*/
125 static void GetPCF8563(uchar firsttype,uchar count,uchar *buff)
126 {
127 1 uchar idata i;
128 1 I2CStart();
129 1 I2CSendByte(0xA2);
130 1 WaitAck();
131 1 I2CSendByte(firsttype);
132 1 WaitAck();
133 1 I2CStart();
134 1 I2CSendByte(0xA3);
135 1 WaitAck();
136 1
137 1 for (i=0;i<count;i++)
138 1 {
139 2 buff[i]=I2CReceiveByte();
140 2 if (i!=count-1)
141 2 SendAck();//除最后一个字节外,其他都要从MASTER发应答。
142 2 }
143 1
144 1 SendNotAck();
145 1 I2CStop();
146 1 }
147
148 /**--------------------------------------------------------------------------------
149 调用方式:void SetPCF8563(uchar timetype,uchar value) ﹫2001/08/0 7
150 函数说明:调整时钟。timetype是要改的时间类型,value是新设置的时间值(BCD格式)。
151 0x02:秒/0x03:分/0x04:小时/0x05:日/0x06:星期/0x07:月(世纪)/0x08:年
152 ---------------------------------------------------------------------------------*/
153 static void SetPCF8563(uchar firsttype,uchar count,uchar *buff)
154 {
155 1 uchar idata i;
156 1 I2CStart();
157 1 I2CSendByte(0xA2);
158 1 WaitAck();
159 1 I2CSendByte(firsttype);
160 1 WaitAck();
161 1 for (i=0;i<count;i++)
162 1 {
163 2 I2CSendByte(buff[i]);
164 2 if (i!=count-1)
165 2 SendAck();//除最后一个字节外,其他都要从MASTER发应答。
166 2 }
167 1 WaitAck();
168 1 I2CStop();
169 1 }
170
171
172 /*******************************************
173 时间格式转换:
174 由于pcf8563取出来的时间是BCD码,
175 因此为了在程序中操作方便,把时间转换成HEX格式。
176 同时为了在设置时间时以BCD码写入pcf8563,所
177 以还需要HEX转换成BCD码再写入pcf8563。
178 *******************************************/
179 void GetTime(uchar len,uchar *temp)
C51 COMPILER V7.06 PTF8563 12/18/2007 11:18:08 PAGE 4
180 {
181 1 uchar idata time[7];
182 1 uchar idata i;
183 1 uchar idata temp_value;
184 1 GetPCF8563(0x02,7,temp);
185 1 temp[0] &= 0x7f;
186 1 temp[1] &= 0x7f;
187 1 temp[2] &= 0x3f;
188 1 temp[3] &= 0x3f;
189 1 temp[4] &= 0x07;
190 1 temp[5] &= 0x1f;
191 1 for(i=0;i<len;i++)
192 1 {
193 2 temp_value = temp[i]>>4;
194 2 time[i] = (temp_value*10)+(temp[i]&0x0f);
195 2 }
196 1 temp[0] = time[6];
197 1 temp[1] = time[5];
198 1 temp[2] = time[3];
199 1 temp[3] = time[4];
200 1 temp[4] = time[2];
201 1 temp[5] = time[1];
202 1 temp[6] = time[0];
203 1 }
204
205
206 void SetTime(uchar len,uchar *time)
207 {
208 1 uchar idata temp[7];
209 1 uchar idata i;
210 1 uchar idata temp_value;
211 1 temp[6] = time[0];
212 1 temp[5] = time[1];
213 1 temp[3] = time[2];
214 1 temp[4] = time[3];
215 1 temp[2] = time[4];
216 1 temp[1] = time[5];
217 1 temp[0] = time[6];
218 1 for(i=0;i<len;i++)
219 1 {
220 2 temp_value = (temp[i]%100)/10;
221 2 time[i] = (temp_value*16)+temp[i]%10;
222 2 }
223 1 SetPCF8563(0x02,7,time);
224 1 }
225
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 745 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 12
IDATA SIZE = ---- 25
BIT SIZE = ---- ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -