?? wpcf8574.lst
字號:
C51 COMPILER V7.05 WPCF8574 02/14/2006 11:53:43 PAGE 1
C51 COMPILER V7.05, COMPILATION OF MODULE WPCF8574
OBJECT MODULE PLACED IN WPCF8574.OBJ
COMPILER INVOKED BY: C:\SiLabs\MCU\IDEfiles\C51\BIN\C51.exe WPCF8574.C DB OE
stmt level source
1 //參考程序A: WPCF8574.C
2 //程序功能:PCF8574是帶SUMBUS總線的串口轉并口的數據轉換芯片.8位輸入口連結8個//開關(K1-K8)作輸入,二個8位輸出
-鎖存口分別連結8個LED燈,作二個8位輸出..
3 // 程序安排二個8位輸出口鎖存的數據電平相反.
4 #include <c8051f020.h> // SFR declarations
5 #include <intrins.h>
6 #define WRITE 0x00 // 寫位標志
7 #define READ 0x01 // 讀位標致
8 #define CHIP_B 0x70
9 #define SMB_START 0x08 // (MT & MR)主收發器發送起始位成功.再將從機寫地
10 //址送SMBUS
11 #define SMB_RP_START 0x10 // (MT & MR)主收發器重復發送起始位成功,再將從機
12 //讀地址送SMB0DAT
13 #define SMB_MTADDACK 0x18 // (MT) 主收發器發送從地址+W成功;收到 //ACK(從機應答)
14 #define SMB_MTDBACK 0x28 // (MT)主收發器發送數據字節成功;收到ACK(從機//應答)
15 #define SMB_MRADDACK 0x40 // (MR) 主收發器發送從地址+R成功;收到 //ACK(從機應答)
16 #define SMB_MRDBNACK 0x58 // (MR) 主收發器接收數據成功;主機發送NACK
17 char COMMAND; // 保存從地址用與中斷程序
18 char WORD; // 保存接收到的數據并把他發送出去.
19 unsigned char xdata SENDMODE;
20 bit SM_BUSY; // 在收/發數據時該位置1,中斷完成后被清另.
21 void SYSCLK_Init (void);
22 char SLA_READ(char chip_select);
23 void SLA_SEND(char chip_select, char wr_data);
24 void sleep_ms(unsigned int count)
25 {
26 1 unsigned char ii,jj;
27 1 for(ii=0;ii<count;ii++)
28 1 {
29 2 for(jj=0;jj<250;jj++)
30 2 _nop_();
31 2 }
32 1 }
33 void MAIN (void)
34 {
35 1 unsigned char i,temp;
36 1 WDTCN = 0xde; // 禁止看們狗
37 1 WDTCN = 0xad;
38 1 SYSCLK_Init(); // 開外部晶振
39 1 XBR0 = 0x01; // 設置交叉開關,配置IO口
40 1 XBR2 = 0x40; // 使能交叉開關和弱上拉.
41 1 SMB0CN = 0x44; // 使能SMBus帶低電平響應 (AA = 1)
42 1 SMB0CR = 0xc9; // 設置SMBus 速率= 100 kHz,系統時鐘為11.0582MHZ
43 1 EIE1 |= 2; // SMBus 中斷使能
44 1 EA = 1; // 全局中斷使能
45 1 SM_BUSY = 0; // 釋放總線,用于第一次數據傳送
46 1 SI = 0;
47 1 while(1){
48 2 for(i=0;i<40;i++){ //延時
49 3 sleep_ms(200);
50 3 }
51 2 temp = SLA_READ(0x70); //芯片U1讀取開關狀態
52 2 sleep_ms(200);
53 2 SLA_SEND(0x72,temp); //芯片U2輸出開關狀態
54 2 sleep_ms(200);
C51 COMPILER V7.05 WPCF8574 02/14/2006 11:53:43 PAGE 2
55 2 sleep_ms(200);
56 2 SLA_SEND(0x74,~temp); //芯片U3輸出開關狀態的反碼
57 2 sleep_ms(200);
58 2 sleep_ms(200);
59 2 sleep_ms(200);
60 2 sleep_ms(200);
61 2 }
62 1
63 1 }
64 void SYSCLK_Init (void) //時鐘初始化
65 {
66 1 int i; // 延時計數器 i
67 1 OSCXCN = 0x67; // 起動外部時鐘(11.0592MHZ)
68 1 for (i=0; i < 256; i++) ; // 時間間隔 (>1ms)
69 1 while (!(OSCXCN & 0x80)) ; // 等待時鐘丟失允許位(MSCLKE)位置1
70 1 OSCICN = 0x88; // 選擇外部晶振作系統時鐘
71 1 // 允許時鐘丟失檢測
72 1 }
73 //數據輸出到從器件的函數:
74 // chip_select = 器件從地址
75 void SLA_SEND(char chip_select, char wr_data)
76 {
77 1 SENDMODE=0x01;
78 1 while(SM_BUSY); // 當總線忙碌的時后就等待
79 1 SM_BUSY = 1; // SMBus忙碌標志位置1 .
80 1 SMB0CN = 0x44; // SMBus 使能, 響應信號為低電平
81 1 COMMAND = (chip_select | WRITE); // COMMAND = 7位地址加"寫"位
82 1 WORD = wr_data; // 輸出數據在WORD中
83 1 STO = 0;
84 1 STA = 1; // 起動數據傳輸
85 1 while(SM_BUSY); // 等待中斷結束
86 1 }
87 //讀取從器件輸出數據的函數:
88 char SLA_READ(char chip_select){
89 1 SENDMODE=0;
90 1 while(SM_BUSY); // 總線忙碌時要等待
91 1 SM_BUSY = 1; // 總線忙碌標志位置1.
92 1 SMB0CN = 0x44; // SMBus 使能, 響應信號為低電平
93 1 COMMAND = (chip_select | READ); // COMMAND = 7位地址加"讀"位
94 1 STO = 0;
95 1 STA = 1; // 開始傳送
96 1 while(SM_BUSY); // 等待傳送完成
97 1 return WORD; // 返回接收到的數據
98 1 }
99 // SMBus中斷服務程序
100 void SMBUS_ISR (void) interrupt 7
101 {
102 1 switch (SMB0STA){ // SMBus中斷狀態 SMB0STA register)
103 2 //SMB_START ; (SMB0STA =08H)
104 2 //主發送器/接收器發送起始位成功.再將從機寫地址送SMB0DAT并清除START位.
105 2 case SMB_START: //0x08
106 2 SMB0DAT = COMMAND ;
107 2 STA = 0; // 人工清除STA
108 2 SI = 0; // 人工清除SI
109 2 break;
110 2 //SMB_RP_START ;(SMB0STA =10H)
111 2 //主發送器/接收器發送重復起始位成功.再將從機讀地址送SMB0DAT并清除START位.
112 2 case SMB_RP_START: //0x10
113 2 SMB0DAT = COMMAND;
114 2 STA = 0; // 人工清除STA
115 2 SI = 0;
116 2 break;
C51 COMPILER V7.05 WPCF8574 02/14/2006 11:53:43 PAGE 3
117 2 //SMB_MTADDACK (SMB0STA =18H)
118 2 //主發送器(MT)發送從地址+W成功;收到 ACK(從機應答),再將要發的子地址送入SMB0DAT.
119 2 case SMB_MTADDACK: //0x18
120 2 SMB0DAT = WORD;
121 2 SI = 0; // 清除中斷標志
122 2 break;
123 2 //SMB_MTDBACK SMB0STA =28H)
124 2 //主發送器(MT)發送數據字節成功;收到ACK(從機應答)
125 2 //檢查BYTE_SENT:如果為1,說明剛發出的是存儲器地址;為0,剛發出的是數據字節
126 2 case SMB_MTDBACK: //0x28
127 2 STO = 1;
128 2 SM_BUSY=0;
129 2 SI = 0;
130 2 break;
131 2 //SMB_MRADDACK ;(SMB0STA =40H)
132 2 //(MR)主收發器發送從地址+R成功;收到 ACK(從機應答).主機發送NACK.
133 2 case SMB_MRADDACK: //0x40
134 2 AA = 0; // 主機在在回應周期發送NACK
135 2 SI = 0;
136 2 break;
137 2 //SMB_MRDBNACK ;(SMB0STA =58H)
138 2 //(MR)主收發器接收數據成功;主機發送NACK
139 2 //讀操作完成。讀數據寄存器并發送STOP
140 2 case SMB_MRDBNACK: //0x58
141 2 WORD= SMB0DAT;
142 2 STO = 1;
143 2 SM_BUSY = 0;
144 2 AA = 1; // 主機發送ACK,準備下一次傳輸
145 2 SI = 0;
146 2 break;
147 2 }
148 1 }
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 280 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = 1 ----
PDATA SIZE = ---- ----
DATA SIZE = 2 1
IDATA SIZE = ---- ----
BIT SIZE = 1 ----
END OF MODULE INFORMATION.
C51 COMPILATION COMPLETE. 0 WARNING(S), 0 ERROR(S)
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -