📄 password.lst
字号:
C51 COMPILER V8.02 PASSWORD 05/22/2009 23:15:40 PAGE 1
C51 COMPILER V8.02, COMPILATION OF MODULE PASSWORD
OBJECT MODULE PLACED IN password.OBJ
COMPILER INVOKED BY: d:\Keil\C51\BIN\C51.EXE password.C BROWSE DEBUG OBJECTEXTEND
line level source
1 /*======================================*/
2 /* 名称:PCF8563时钟 */
3 /* 建立时间:2008.4.3 */
4 /* 程序功能:实现年月日时分秒显示 */
5 /* 修改时间:2008.4.6 */
6 /*======================================*/
7
8 #include <reg52.h> //文件包含
9 #include "intrins.h"
10
11 #define uchar unsigned char //宏定义
12 #define uint unsigned int
13 #define Nop() _nop_() //定义空指令
14
15 #define I2C_DeviceAddress 0xa2 /* 定义器件在I2C总线中的地址 */
16
17
18 uchar code LED[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40};//共阴LED段码表--不带小数点
19 uchar code display[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90}; //共阳数码管
20 //uchar data reg_set;
21 uchar data time_set[5]={0x55,0x59,0x23,0xD6,0x88}; //初始时间03年8月16日21时59分25秒,星期4
22 uchar data time_show[13]={0,0,0,0,0,0}; //显示时间
23 uchar data time_disp[5];
24 /*8583端口位定义*/
25
26 sbit SCL=P3^0; //模拟I2C时钟控制位
27 sbit SDA=P3^1; //模拟I2C数据传送位,串行双向数据输入/输出线
28
29
30 sbit ge=P2^0; //位选
31 sbit shi=P2^1;
32 sbit bai=P2^2;
33 sbit qian=P2^3;
34
35 uchar second,minute,hour,day,month,year,week;
36 uchar data x,y,count,i,sel,sele;
37 /*状态标志*/
38 bit ack; //应答标志位 或bit bdata ack(定义可位寻址区);
39
40
41 /*延时1ms/10程序*/
42 void delay(int x)
43 { int i,j;
44 1 for(j=0;j<x;j++)
45 1 { for(i=0;i<10;i++);} //空循环产生延时
46 1 }
47
48
49
50 /********************************************************************/
51 void Start_I2C()
52 {
53 1 SDA=1; //数据线高电平
54 1 SCL=1; //时钟线高电平
55 1 Nop();Nop();Nop();Nop();Nop(); //起始条件建立时间大于4.7μs
C51 COMPILER V8.02 PASSWORD 05/22/2009 23:15:40 PAGE 2
56 1 SDA=0; //发送起始信号
57 1 Nop();Nop();Nop();Nop();Nop(); //起始条件锁定时间大于4μs
58 1 SCL=0; //钳住I2C总线,准备发送或接收数据
59 1 Nop();Nop();
60 1 }
61
62 /*
63 ********************************************************************/
64 void Stop_I2C()
65 { //SCL=0; 可省略
66 1 SDA=0; //发送结束条件的数据信号
67 1 Nop(); //发送结束条件的时钟信号
68 1 SCL=1; //结束条件建立时间大于4μs
69 1 Nop();Nop();Nop();Nop();
70 1 SDA=1; //数据信号由0跳变为1
71 1 Nop();Nop();Nop();Nop(); //SCL=0; 可省略
72 1 }
73
74
75 /**
76 ********************************************************************/
77 void Ack_I2C(bit a)
78 {
79 1 SDA=a; //0表示应答,1表示非应答
80 1 Nop();Nop();Nop();
81 1 SCL=1;
82 1 Nop();Nop();Nop();Nop();Nop(); //时钟低电平周期大于4μs
83 1 SCL=0; //清时钟线,钳住I2C总线以便继续接收
84 1 Nop();Nop();
85 1 }
86
87 /**
88 ********************************************************************/
89 bit checkAck_I2C()
90 {
91 1 SDA=1; Nop(); Nop(); //8位发送完后释放数据线,准备接收应答位
92 1 SCL=1; Nop(); Nop(); Nop();
93 1 if(SDA==1)ack=0;
94 1 else ack=1; //判断是否接收到应答信号,SDA=1表示无应答,SDA=0表示有应答
95 1 SCL=0; Nop(); Nop();
96 1 return(ack);
97 1 }
98 /**
99 ********************************************************************/
100 void Write_8bit(uchar input)
101 {
102 1 uchar i;
103 1 for(i=0;i<8;i++) //要传送的数据长度为8位(一个字节)
104 1 {
105 2 if((input<<i)&0x80) //判断发送位,并发送,先发高位
106 2 SDA=1;
107 2 else
108 2 SDA=0;
109 2 Nop();
110 2 SCL=1; //置时钟线为高,通知被控器开始接收数据位
111 2 Nop(); Nop(); Nop(); Nop(); Nop(); //保证时钟高电平周期大于4μs
112 2 SCL=0;
113 2 }
114 1 }
115
116 /*********************************************************************/
117 uchar Read_8bit()
C51 COMPILER V8.02 PASSWORD 05/22/2009 23:15:40 PAGE 3
118 {
119 1 uchar temp=0,i;
120 1 SDA=1; //置数据线为输入方式
121 1 for(i=0;i<8;i++)
122 1 {
123 2 //SCL=0; //*置时钟线为低,准备接收数据位
124 2 //Nop(); Nop(); Nop(); Nop(); Nop(); //*时钟低电平周期大于4.7μs
125 2 SDA=1;
126 2 SCL=1; Nop(); Nop(); //置时钟线为高使数据线上数据有效
127 2 temp=temp<<1; //临时存放接收的数据,先接受的是最高位
128 2 if(SDA==1)temp=temp+1; //读数据位,接收的数据位放入temp中,temp=temp|0x01;
129 2 Nop(); Nop();
130 2 SCL=0;
131 2 Nop(); Nop();
132 2 }
133 1 return(temp);
134 1 }
135
136 /********************************************************************/
137 I2C_SendByte(uchar addr,uchar n)
138 {
139 1 uchar i;
140 1 Start_I2C(); //启动总线
141 1 Write_8bit(I2C_DeviceAddress);
142 1 if(checkAck_I2C()==0)return(0);
143 1 Write_8bit(addr); //发送写入地址
144 1 if(checkAck_I2C()==0)return(0);
145 1
146 1 for(i=0;i<n;i++)
147 1 {
148 2 Write_8bit(time_set[i]);
149 2 if(checkAck_I2C()==0)return(0);
150 2 }
151 1 Stop_I2C(); //结束总线
152 1 }
153
154 /**********************************************************************/
155 I2C_SendByte1(uchar addr,uchar reg_set)
156 {
157 1 //uchar i;
158 1 Start_I2C();
159 1 Write_8bit(I2C_DeviceAddress);
160 1 if(checkAck_I2C()==0)return(0);
161 1 Write_8bit(addr);
162 1 if(checkAck_I2C()==0)return(0);
163 1
164 1 Write_8bit(reg_set);
165 1 if(checkAck_I2C()==0)return(0);
166 1
167 1 Stop_I2C(); //结束总线
168 1 }
169
170 /*********************************************************************/
171 I2C_RcvByte(uchar addr,uchar n)
172 {
173 1 uchar i;
174 1 Start_I2C(); //启动总线
175 1 Write_8bit(I2C_DeviceAddress); //发送读控制字
176 1 if(checkAck_I2C()==0)return(0);
177 1 Write_8bit(addr); //发送要读取的寻址单元地址
178 1 if(checkAck_I2C()==0)return(0);
179 1
C51 COMPILER V8.02 PASSWORD 05/22/2009 23:15:40 PAGE 4
180 1 Start_I2C(); //启动总线
181 1 Write_8bit(I2C_DeviceAddress+1); //发送读控制字——1010+从器件地址信息+1
182 1 if(checkAck_I2C()==0)return(0);
183 1 for(i=0;i<n;i++)
184 1 {
185 2 time_disp[i]=Read_8bit();
186 2 if(i!=n-1)Ack_I2C(0);
187 2 else Ack_I2C(1);
188 2 }
189 1
190 1 Stop_I2C(); //结束总线
191 1 }
192
193
194 display_led() //共阳数码管显示
195 {
196 1 sel=0X01;
197 1 for(i=0;i<8;i++)
198 1 {
199 2 P2=sel;
200 2 P0=display[time_show[i]];delay(1);
201 2 sel=sel<<1;
202 2 }
203 1
204 1 P2=0;
205 1 sel=0X01;
206 1 for(i=8;i<13;i++)
207 1 {
208 2 P1=sel;
209 2 P0=display[time_show[i]];delay(1);
210 2 sel=sel<<1;
211 2 }
212 1 P1=0;
213 1 }
214
215 main()
216 {
217 1 SDA=1;
218 1 SCL=1;
219 1
220 1
221 1 I2C_SendByte1(0x00,0x20); // 向地址00H单元写入0x20,停止计时
222 1 I2C_SendByte(0x02,5); // 向地址02H单元和03H单元分别写入秒和分两个字节
223 1 I2C_SendByte1(0x00,0x00); // 向地址00H单元写入0x00,起动计时
224 1
225 1
226 1 delay(10);
227 1
228 1 while(1)
229 1 {
230 2 I2C_RcvByte(2,5); //将02单元开始的秒分时读出
231 2 second=time_disp[0]&0x7F;
232 2 minute=time_disp[1]&0x7F;
233 2 hour=time_disp[2]&0x3F;
234 2 day=time_disp[3]&0x3F;
235 2 month=time_disp[4]&0x1F;
236 2 year=time_disp[3]&0xC0;
237 2 week=time_disp[4]&0xE0;
238 2
239 2 time_show[0]=second&0x0F; //秒低位
240 2 time_show[1]=(second&0xF0)>>4; //秒高位
241 2
C51 COMPILER V8.02 PASSWORD 05/22/2009 23:15:40 PAGE 5
242 2 time_show[2]=minute&0x0F; //分低位
243 2 time_show[3]=(minute>>4)&0x0F; //分高位
244 2
245 2 time_show[4]=hour&0x0F; //时低位
246 2 time_show[5]=(hour>>4)&0x0F; //时高位
247 2
248 2 time_show[6]=day&0x0F; //日低位
249 2 time_show[7]=(day>>4)&0x0F; //日高位
250 2
251 2 time_show[8]=month&0x0F; //月低位
252 2 time_show[9]=(month>>4)&0x0F; //月高位
253 2
254 2 time_show[10]=(year>>6)&0x03; //年低位
255 2 time_show[11]=0x00; //年高位
256 2
257 2 time_show[12]=(week>>5)&0x07; //星期位
258 2
259 2
260 2
261 2 display_led();
262 2
263 2 }
264 1 }
265
266
267
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 607 ----
CONSTANT SIZE = 22 ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = 36 ----
IDATA SIZE = ---- ----
BIT SIZE = 1 1
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -