📄 pcf8574.lst
字号:
C51 COMPILER V8.01 PCF8574 10/16/2007 15:30:38 PAGE 1
C51 COMPILER V8.01, COMPILATION OF MODULE PCF8574
OBJECT MODULE PLACED IN Pcf8574.OBJ
COMPILER INVOKED BY: C:\Keil\C51\BIN\C51.EXE Pcf8574.c BROWSE DEBUG OBJECTEXTEND TABS(8)
line level source
1 //......................................
2 //名称: PCF8574(A).c I2C扩展8位I/O芯片的接口程序
3 //编程: 机灵小老鼠(QQ: 879381753)
4 //日期: 20071016
5 //
6 //发现问题请指点,谢谢!
7 //......................................
8 //CPU: 89C52 11.0592MHz
9 //环境: Keil C51 V8.01
10 //引脚定义:
11 // CPU_P2.0 --- PCF8574X_SCL 时钟
12 // CPU_P2.1 --- PCF8574X_SDA 数据
13 // CPU_P2.2 --- PCF8574X_INT 中断
14 //......................................
15 #include <Public.h>
16 #include <Intrins.h>
17 #include "delay_s.h"
18 #include "pcf8574.h"
19
20
21 //内部函数
22 static void i2c_start_cond(void);
23 static void i2c_stop_cond(void);
24 static uchar i2c_read_byte(void);
25 static uchar i2c_read_byte_nack(void);
26 static void i2c_write_byte(uchar da);
27
28 //=============================================================================
29 //接口调用函数部分
30 //*******************************************************
31 //序号:
32 // HD_PCF8574X_S01
33 //功能:
34 // 读出芯片的复位状态
35 //输入:
36 // is_pcf8574a =1 是A芯片
37 // add_of_part 器件的子地址 0~3
38 //输出:
39 // 端口的数据
40 //********************************************************
41 uchar PCF8574X_read_io(uchar is_pcf8574a, uchar add_of_part)
42 {
43 1 uchar i;
44 1 i2c_start_cond();
45 1 if(is_pcf8574a !=0)
46 1 {
47 2 i2c_write_byte(PCF8574A_READ |((add_of_part <<1) &0x0E));//器件地址=0111 A2 A1 A0 r/w
48 2 }
49 1 else
50 1 {
51 2 i2c_write_byte(PCF8574_READ |((add_of_part <<1) &0x0E));//器件地址=0100 A2 A1 A0 r/w
52 2 }
53 1 i =i2c_read_byte_nack(); //顺序读的方式读出一个字节
54 1 i2c_stop_cond();
55 1 return(i);
C51 COMPILER V8.01 PCF8574 10/16/2007 15:30:38 PAGE 2
56 1 }
57
58 //*******************************************************
59 //序号:
60 // HD_PCF8574X_S02
61 //功能:
62 // 写数据到I/O端口
63 //输入:
64 // is_pcf8574a =1 是A芯片
65 // add_of_part: 器件的子地址 0~7
66 // dat: 写入的字节
67 //输出:
68 // 无
69 //********************************************************
70 void PCF8574X_write_io(uchar is_pcf8574a, uchar add_of_part, uchar dat)
71 {
72 1 i2c_start_cond();
73 1 if(is_pcf8574a !=0)
74 1 {
75 2 i2c_write_byte(PCF8574A_WRITE |((add_of_part <<1) &0x0E)); //器件地址=0111 A2 A1 A0 r/w
76 2 }
77 1 else
78 1 {
79 2 i2c_write_byte(PCF8574_WRITE |((add_of_part <<1) &0x0E)); //器件地址=0100 A2 A1 A0 r/w
80 2 }
81 1 i2c_write_byte(dat);
82 1 i2c_stop_cond();
83 1 }
84
85 //==============
86 //内部调用函数部分
87 //==============
88
89 //----------------------------------------------
90 //I2C 发启始条件:时钟线为高时数据线发生下降沿跳变
91 //----------------------------------------------
92 static void i2c_start_cond(void)
93 {
94 1 CODE_SCL_LOW;
95 1 _DELAY_NOP3;
96 1 CODE_SDA_HIGH;
97 1 _DELAY_NOP3;
98 1 CODE_SCL_HIGH;
99 1 _DELAY_NOP3;
100 1 CODE_SDA_LOW;
101 1 _DELAY_NOP3;
102 1 }
103
104 //----------------------------------------
105 //I2C 发结束条件:时钟线为高时数据线发生上升沿跳变
106 //----------------------------------------
107 static void i2c_stop_cond(void)
108 {
109 1 CODE_SCL_LOW;
110 1 _DELAY_NOP3;
111 1 CODE_SDA_LOW;
112 1 _DELAY_NOP3;
113 1 CODE_SCL_HIGH;
114 1 _DELAY_NOP3;
115 1 CODE_SDA_HIGH;
116 1 _DELAY_NOP3;
117 1 }
C51 COMPILER V8.01 PCF8574 10/16/2007 15:30:38 PAGE 3
118
119 //----------------------------------------
120 // I2C 读取一个中间字节的数据
121 //----------------------------------------
122 /*
123 static uchar i2c_read_byte(void)
124 {
125 uchar i;
126 uchar da=0;
127 for(i =0; i<8; i++)
128 {
129 da <<=1; //传输的数据高位在前
130 CODE_SCL_LOW;
131 _DELAY_NOP3;
132 CODE_SCL_HIGH; //时钟为高时读数据
133 //NOP3;
134 if (JUDGE_PCF8574X_SDA) da++;
135 }
136 CODE_SCL_LOW;
137 _DELAY_NOP3;
138 CODE_SDA_LOW; //发送应答位
139 _DELAY_NOP3;
140 CODE_SCL_HIGH;
141 _DELAY_NOP3;
142 CODE_SCL_LOW;
143 _DELAY_NOP3;
144 CODE_SDA_HIGH;
145 return(da);
146 }
147 */
148 //----------------------------------------
149 // I2C 读取一个结尾字节的数据
150 //----------------------------------------
151 static uchar i2c_read_byte_nack(void)
152 {
153 1 uchar i;
154 1 uchar da =0;
155 1 for (i =0; i<8; i++)
156 1 {
157 2 da <<=1;
158 2 CODE_SCL_LOW;
159 2 _DELAY_NOP3;
160 2 CODE_SCL_HIGH;
161 2 //NOP3;
162 2 if(JUDGE_PCF8574X_SDA) da++;
163 2 }
164 1 CODE_SCL_LOW;
165 1 _DELAY_NOP3;
166 1 CODE_SDA_HIGH;
167 1 _DELAY_NOP3;
168 1 CODE_SCL_HIGH;
169 1 _DELAY_NOP3;
170 1 CODE_SCL_LOW;
171 1 return( da );
172 1 }
173
174 //----------------------------------------
175 // I2C 写入一个字节的数据
176 //----------------------------------------
177 static void i2c_write_byte(uchar da )
178 {
179 1 uchar i;
C51 COMPILER V8.01 PCF8574 10/16/2007 15:30:38 PAGE 4
180 1 for(i =0; i<8; i++)
181 1 {
182 2 CODE_SCL_LOW;
183 2 if(da&0x80)
184 2 {
185 3 CODE_SDA_HIGH;
186 3 }
187 2 else
188 2 {
189 3 CODE_SDA_LOW;
190 3 }
191 2 CODE_SCL_HIGH;
192 2 da <<=1;
193 2 }
194 1 CODE_SCL_LOW; //第8个SCL下降沿,写入8位数据
195 1 _DELAY_NOP3;
196 1 CODE_SDA_HIGH;
197 1 _DELAY_NOP3;
198 1 CODE_SCL_HIGH;
199 1 }
200
201 //=============================================================================
202
203 //End Of File
MODULE INFORMATION: STATIC OVERLAYABLE
CODE SIZE = 206 ----
CONSTANT SIZE = ---- ----
XDATA SIZE = ---- ----
PDATA SIZE = ---- ----
DATA SIZE = ---- 6
IDATA SIZE = ---- ----
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 + -