?? 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 + -