📄 pcf8563-01.lst
字号:
C51 COMPILER V7.06 PCF8563_01 05/05/2005 00:25:59 PAGE 1
C51 COMPILER V7.06, COMPILATION OF MODULE PCF8563_01
OBJECT MODULE PLACED IN PCF8563-01.OBJ
COMPILER INVOKED BY: D:\Program Files\Keil20\C51\BIN\C51.EXE PCF8563-01.c BROWSE DEBUG OBJECTEXTEND
stmt level source
1 #include <reg51.h>
2 #include <intrins.h>
3 sbit SDA=P1^0; // 将p1.0口模拟数据口
4 sbit SCL=P1^1; // 将p1.1口模拟时钟口
5 #define MIN 0x02 //秒寄存器
6 #define SEC 0x03 //分寄存器
7 #define HOUR 0x04 //时寄存器
8 #define DAY 0x05 //日寄存器
9 #define WEEK 0x06 //周寄存器
10 #define MONTH 0x07 //月寄存器
11 #define YEAR 0x08 //年寄存器
12 #define read_ADD 0xA3 //写器件地址
13 #define write_ADD 0xA2 //读器件地址
14 #define delayNOP(); {_nop_();_nop_();_nop_();_nop_();};
15 unsigned char g8563_Store[4]; /*时间交换区,全局变量声明*/
16 unsigned char code c8563_Store[4]={0x00,0x59,0x07,0x01}; /*写入时间初值:星期一 07:59:00*/
17
18 bit bdata SystemError; // 从机错误标志位
19 //--------------------------------------------------------------------------------------------------
20 // 函数名称: iic_start()
21 // 函数功能: 启动I2C总线子程序
22 //--------------------------------------------------------------------------------------------------
23 void iic_start(void)
24 { EA=0; //时钟保持高,数据线从高到低一次跳变,I2C通信开始
25 1 SDA = 1;
26 1 SCL = 1;
27 1 delayNOP(); // 延时5us
28 1 SDA = 0;
29 1 delayNOP();
30 1 SCL = 0;
31 1 }
32 //--------------------------------------------------------------------------------------------------
33 // 函数名称: iic_stop()
34 // 函数功能: 停止I2C总线数据传送子程序
35 //--------------------------------------------------------------------------------------------------
36 void iic_stop(void)
37 {
38 1 SDA = 0; //时钟保持高,数据线从低到高一次跳变,I2C通信停止
39 1 SCL = 1;
40 1 delayNOP();
41 1 SDA = 1;
42 1 delayNOP();
43 1 SCL = 0;
44 1 }
45 //--------------------------------------------------------------------------------------------------
46 // 函数名称: slave_ACK
47 // 函数功能: 从机发送应答位子程序
48 //--------------------------------------------------------------------------------------------------
49 void slave_ACK(void)
50 {
51 1 SDA = 0;
52 1 SCL = 1;
53 1 delayNOP();
54 1 SDA = 1;
55 1 SCL = 0;
C51 COMPILER V7.06 PCF8563_01 05/05/2005 00:25:59 PAGE 2
56 1 }
57 //--------------------------------------------------------------------------------------------------
58 // 函数名称: slave_NOACK
59 // 函数功能: 从机发送非应答位子程序,迫使数据传输过程结束
60 //--------------------------------------------------------------------------------------------------
61 void slave_NOACK(void)
62 {
63 1 SDA = 1;
64 1 SCL = 1;
65 1 delayNOP();
66 1 SDA = 0;
67 1 SCL = 0;
68 1 }
69 //--------------------------------------------------------------------------------------------------
70 // 函数名称: check_ACK
71 // 函数功能: 主机应答位检查子程序,迫使数据传输过程结束
72 //--------------------------------------------------------------------------------------------------
73 void check_ACK(void)
74 {
75 1 SDA = 1; // 将p1.0设置成输入,必须先向端口写1
76 1 SCL = 1;
77 1 F0 = 0;
78 1 if(SDA == 1) // 若SDA=1表明非应答,置位非应答标志F0
79 1 F0 = 1;
80 1 SCL = 0;
81 1 }
82
83 //--------------------------------------------------------------------------------------------------
84 // 函数名称: IICSendByte
85 // 入口参数: ch
86 // 函数功能: 发送一个字节
87 //--------------------------------------------------------------------------------------------------
88 void IICSendByte(unsigned char ch)
89 {
90 1 unsigned char idata n=8; // 向SDA上发送一位数据字节,共八位
91 1 while(n--)
92 1 {
93 2 if((ch&0x80) == 0x80) // 若要发送的数据最高位为1则发送位1
94 2 {
95 3 SDA = 1; // 传送位1
96 3 SCL = 1;
97 3 delayNOP();
98 3 SDA = 0;
99 3 SCL = 0;
100 3 }
101 2 else
102 2 {
103 3 SDA = 0; // 否则传送位0
104 3 SCL = 1;
105 3 delayNOP();
106 3 SCL = 0;
107 3 }
108 2 ch = ch<<1; // 数据左移一位
109 2 }
110 1 }
111 //--------------------------------------------------------------------------------------------------
112 // 函数名称: IICreceiveByte
113 // 返回接收的数据
114 // 函数功能: 接收一字节子程序
115 //--------------------------------------------------------------------------------------------------
116 unsigned char IICreceiveByte(void)
117 {
C51 COMPILER V7.06 PCF8563_01 05/05/2005 00:25:59 PAGE 3
118 1 unsigned char idata n=8; // 从SDA线上读取一上数据字节,共八位
119 1 unsigned char tdata;
120 1 while(n--)
121 1 {
122 2 SDA = 1;
123 2 SCL = 1;
124 2 tdata = tdata<<1; // 左移一位,或_crol_(temp,1)
125 2 if(SDA == 1)
126 2 tdata = tdata|0x01; // 若接收到的位为1,则数据的最后一位置1
127 2 else
128 2 tdata = tdata&0xfe; // 否则数据的最后一位置0
129 2 SCL=0;
130 2 }
131 1 return(tdata);
132 1 }
133 //--------------------------------------------------------------------------------------------------
134 // 用户调用子程序
135 // 函数名称: write_CFGbyte
136 // 入口参数: CFG_add寄存器地址,CFG_data要写入寄存器的数值
137 // 函数功能: 发送n位数据子程序
138 //--------------------------------------------------------------------------------------------------
139 void write_CFGbyte(unsigned char CFG_add,unsigned char CFG_data)
140 {
141 1 //unsigned char idata send_da,i=0;
142 1 iic_start(); // 启动I2C
143 1 IICSendByte(write_ADD); // 发送器件写地址
144 1 check_ACK(); // 检查应答位
145 1 if(F0 == 1)
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -