pcf8574.c
来自「该程序用来测试89C51与IDE硬盘的接口」· C语言 代码 · 共 140 行
C
140 行
//PCF8594
#include <INTRINS.H>
#include <ABSACC.H>
#include <AT89x51.H>
#define uchar unsigned char
#define unint unsigned int
#define SDA P2_2 //PCF8574 数据引脚 //地址为111
#define SCK P2_1 //PCF8574 时钟引脚
//*************************************************
sbit ZLG_CS=P2^4; sbit ZLG_CLK=P2^3; sbit ZLG_DIO=P2^2;
//#################################################
//LCD16X2(16X80) RS-P23;RW-P24;EN-P27
//DS12887 CS-P20;$$$$$$$ PCF8574T SDA-P22;SCK-P21;
//#################################################
void Delayl(uchar T) {uchar S;while (T--) //延时子程序
{for (S=200;S>0;S--){_nop_();_nop_();_nop_();} } }
//*************************************************
void Delays (uchar t){ while (t--) {_nop_();_nop_(); } }//短时间延时子程序
//*************************************************
//************************************************* PCF8574 芯片读写子程序
void I2c_start(void) {PCF_SDA=1;_nop_();PCF_SCK=1;_nop_();_nop_();//I2C总线开始条件
_nop_();_nop_();PCF_SDA=0;_nop_();_nop_();_nop_();_nop_();PCF_SCK=0;}
//*************************************************
void I2c_stop(void) {PCF_SDA=0;_nop_();PCF_SCK=1;_nop_();_nop_();//I2C总线结束条件
_nop_();_nop_();_nop_();PCF_SDA=1;_nop_();_nop_();_nop_();_nop_();_nop_();}
//*************************************************
uchar I2c_read(bit ack){ uchar i,a; PCF_SDA=1;_nop_();PCF_SCK=0; //I2C总线读一个数据
for(i=0;i<8;i++){ PCF_SCK=0;_nop_();_nop_();_nop_();_nop_();PCF_SCK=1;
_nop_();a<<=1; if (PCF_SDA) {a|=0x01;} }
PCF_SCK=0;_nop_();_nop_();if(ack==1){PCF_SDA=1;}else{PCF_SDA=0;}_nop_();PCF_SCK=1;
_nop_();_nop_();_nop_();_nop_();PCF_SCK=0;_nop_();return(a); } //I2C总线应答
//*************************************************
void I2c_write(uchar a) { uchar i; //I2C总线写一个数据,ack为0则应答
for(i=0;i<8;i++){PCF_SDA=(bit)(a&0x80); PCF_SCK=1;_nop_();
a<<=1;_nop_();_nop_();_nop_();_nop_();PCF_SCK=0;_nop_(); }
PCF_SDA=1;_nop_();_nop_();PCF_SCK=1;_nop_();_nop_();PCF_SCK=0; } //I2C总线应答
//*************************************************
uchar Read(void){uchar dd;I2c_start(); //I2C总线指定地址读出一个字节
I2c_write(0x4f);dd=I2c_read(1);I2c_stop();return(dd);}
//*************************************************
void Write(uchar dd){ I2c_start(); //I2C总线指定地址写入一个字节
I2c_write(0x4e);I2c_write(dd);I2c_stop();}
//*************************************************
//*************************************************
uchar code key[]={ 0x00,0x01,0x02,0x03,0x0c,0x08,0x04,0x00,
0x08,0x09,0x0a,0x0b,0x0d,0x09,0x05,0x01,
0x10,0x11,0x12,0x13,0x0e,0x0a,0x06,0x02,
0x18,0x19,0x1a,0x1b,0x0f,0x0b,0x07,0x03};
//*************************************************
void ZLG_OUT(uchar a){ Bcc=a; ZLG_CS=0;ZLG_CLK=0; //向ZLG7289发一条指令
ZLG_DIO=B7;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B6;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B5;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B4;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B3;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B2;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B1;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B0;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;ZLG_CS=1;}
//*************************************************
void ZLG_D_OUT(uchar a,b){Bcc=a;ZLG_CS=0;ZLG_CLK=0;
ZLG_DIO=B7;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_(); //向ZLG7289发一条带数据的指令
ZLG_DIO=B6;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B5;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B4;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B3;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B2;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B1;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B0;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();Bcc=b;
ZLG_DIO=B7;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B6;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B5;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B4;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B3;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B2;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B1;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B0;ZLG_CLK=1;_nop_(); ZLG_CLK=0; ZLG_CS=1;}
//*************************************************
uchar ZLG_KEYB(void){ uchar a=0x15;Bcc=a;ZLG_CS=0;ZLG_CLK=0;
ZLG_DIO=B7;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_(); //从ZLG7289读取键盘数据的指令
ZLG_DIO=B6;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B5;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B4;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B3;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B2;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B1;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();
ZLG_DIO=B0;ZLG_CLK=1;_nop_();_nop_();_nop_(); ZLG_CLK=0;_nop_();_nop_();ZLG_DIO=1;
ZLG_CLK=1;_nop_();_nop_();_nop_();B7=ZLG_DIO;ZLG_CLK=0;_nop_();_nop_();_nop_();
ZLG_CLK=1;_nop_();_nop_();_nop_();B6=ZLG_DIO;ZLG_CLK=0;_nop_();_nop_();_nop_();
ZLG_CLK=1;_nop_();_nop_();_nop_();B5=ZLG_DIO;ZLG_CLK=0;_nop_();_nop_();_nop_();
ZLG_CLK=1;_nop_();_nop_();_nop_();B4=ZLG_DIO;ZLG_CLK=0;_nop_();_nop_();_nop_();
ZLG_CLK=1;_nop_();_nop_();_nop_();B3=ZLG_DIO;ZLG_CLK=0;_nop_();_nop_();_nop_();
ZLG_CLK=1;_nop_();_nop_();_nop_();B2=ZLG_DIO;ZLG_CLK=0;_nop_();_nop_();_nop_();
ZLG_CLK=1;_nop_();_nop_();_nop_();B1=ZLG_DIO;ZLG_CLK=0;_nop_();_nop_();_nop_();
ZLG_CLK=1;_nop_();_nop_();_nop_();B0=ZLG_DIO;ZLG_CLK=0;_nop_();_nop_();_nop_();
ZLG_CS=1;a=Bcc;return(a);}
//*************************************************
uchar KEY_V(uchar a){return key[a];}
//*************************************************
//************************************************* 串行口初始化、发送接收子程序
void Comstart(void){ TMOD=0X20;TL1=0xfd;TH1=0xfd; //256-11059200/384/9600=0xfd
SCON=0x40;PCON=0x00;TR1=1; //方式1,波特率不加倍,计数器开
IE=0x00;} //中断总允许,允许串行中断
//*************************************************
void Txd2(uchar z) //串口发送子程序
{ SBUF=z; while(TI==0); TI=0; }//为0等待
//*************************************************
void Pc_com(unint a){ unint m,n; uchar w;
m=a/10000;w=(uchar)(m+0x0030);Txd2(w); //万位
m=a%10000;n=m/1000;w=(uchar)(n+0x0030);Txd2(w); //千位
n=m%1000;m=n/100;w=(uchar)(m+0x0030);Txd2(w); //百位
m=n%100;n=m/10;w=(uchar)(n+0x0030);Txd2(w); //十位
n=m%10;w=(uchar)(n+0x0030);Txd2(w);Txd2(0x0d);Txd2(0x0a);}//个位 回车
//*************************************************
//************************************************* //外中断1方式键盘接口程序
void int_key(void) interrupt 2 using 1{ uchar a;a=Read();a=a&0x80;
if(a!=0x80){a=ZLG_KEYB();if(a!=0xff){ZLG_OUT(0xa2);a=KEY_V(a);
ZLG_D_OUT(0xcf,a);do{a=Read();a=a&0x80;}while(a!=0x80 );} } }
//*************************************************
//*************************************************
main(){ uchar a; Comstart();
ZLG_OUT(0xa4);ZLG_OUT(0xbf);ZLG_D_OUT(0x88,0x00);Delayl(0x7f);//复位、闪烁、测试
Write(0x00);Delayl(0x7f);a=Read(); Pc_com(a);Delays(0x7f);
Write(0xff);Delayl(0x7f);a=Read(); Pc_com(a);Delays(0x7f);
while(1);
}
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?