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 + -
显示快捷键?