⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pcf8574.c

📁 PCF8574的读写
💻 C
字号:
#include <w77e58.h>    
#include <stdio.h>   
#include <stdlib.h>                      /* standard library .h-file          */
#include <math.h>
#include <absacc.h>
#include <intrins.h>
#define NOP _nop_();
#define	WriteDeviceAddress 0xa0		
#define	ReadDviceAddress 0xa1	
sbit	Ram_protect=P1^2;	
sbit	SCL=P1^1;	// I2C serial clock line.
sbit	SDA=P1^0;	// I2C serial data line.
#define uint unsigned int
#define uchar unsigned char
/* -------------定义器件地址--------------*/
unsigned char PCFKey		=0x40;	// 键盘8574地址
unsigned char PCFLed		=0x4E;	// 指示灯8574地址????????????
extern I2CStart();
extern I2CStop();
extern uchar readbyte(void);
extern writebyte(uchar input);
/*--------------------- WatchDog -------------------------*/
void WatchDog(void)
{	
	TA=0xAA	;	//3M/C	Note:M/C=Machine Cycles
    	TA=0x55	;	//3M/C
	RWT=1;		//Reset Watchdog timer
	led0=~led0;
} 
void DelayMs(int number) 	//延时1Ms
{
	uchar idata temp;
	for(;number!=0;number--)
	{
		for(temp=167;temp!=0;temp--) {
		}
		WatchDog();
	}
}
void long_delay(void)
{
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP

	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
	NOP
}
/*  在时钟线(SCL)为高电平其间,数据线(SDA)由高变低,将产生一个开始信号。-------*/
void I2CStart() {
	SDA=1;
	long_delay();
	SCL=1;
	long_delay();
	SDA=0;
	long_delay();
	SCL=0;
	long_delay();
}
/*  在时钟线(SCL)为高电平其间,数据线(SDA)由低变高,将产生一个停止信号。-------*/
void I2CStop() {
	SCL=0;
	long_delay();
	SDA=0;
	long_delay();
	SCL=1;
	long_delay();
	SDA=1;
	long_delay();
}
/*-------------------------------------------------------------------------*/
void Ack() {
	SDA=0;
	SCL=1;
	SCL=0;
	SDA=1;
}
/*-------------------------------------------------------------------------*/
void NoAck() {
	SDA=1;
	SCL=1;
	SCL=0;
}
/*-------------------------------------------------------------------------*/
bit TestAck(void) {
	bit ErrorBit;
	SDA=1;
	long_delay();
	SCL=1;
	long_delay();
	ErrorBit=SDA;
	long_delay();
	SCL=0;
	long_delay();
	return(ErrorBit);
}
/*-------------------------------------------------------------------------*/
void Write8Bit(unsigned char input) {
	unsigned char temp;
	for(temp=8;temp!=0;temp--) {
		SDA=(bit)(input&0x80);
		SCL=1;
		SCL=0;
		input=input<<1;
	}
}
/*-------------------------------------------------------------------------*/
void Write24c02(unsigned char *Wdata,unsigned char RomAddress,unsigned char number) 
{
	Ram_protect=0;
	I2CStart();
	Write8Bit(WriteDeviceAddress);
	TestAck();
	Write8Bit(RomAddress);
	TestAck();
	for(;number!=0;number--) {
		Write8Bit(*Wdata);
		TestAck();
		Wdata++;
	}
	I2CStop();
	//DelayMs(20);
	Ram_protect=1;
}
/***********writebyte()***********/
void writebyte(unsigned char input)
{
	unsigned char idata temp;
	for(temp=8;temp!=0;temp--) {
		SDA=(bit)(input&0x80);
		SCL=1;
		long_delay();
		SCL=0;
		long_delay();
		input=input<<1;
	}
	TestAck();
}
/***********readbyte()***************/
//并口读取I2C总线的数据时,必须让 T1截止,使用并口的13脚来接收SDA上的数据。
unsigned char readbyte(void){
	unsigned char idata temp,rbyte=0;
	for(temp=8;temp!=0;temp--)
	{
		SCL=1;
		rbyte=rbyte<<1;
		rbyte=rbyte|((unsigned char)(SDA));
		SCL=0;
	}
	return(rbyte);
}
unsigned char Read8Bit() 
{
	unsigned char temp,rbyte=0;
	for(temp=8;temp!=0;temp--) {
		SCL=1;
		rbyte=rbyte<<1;
		rbyte=rbyte|((unsigned char)(SDA));
		SCL=0;
	}
	return(rbyte);
}
/*-------------------------------------------------------------------------*/
void Read24c02(unsigned char *RamAddress,unsigned char RomAddress,unsigned char bytes)
{	
	Ram_protect=0;
	I2CStart();
	Write8Bit(WriteDeviceAddress);
	TestAck();
	Write8Bit(RomAddress);
	TestAck();
	I2CStart();
	Write8Bit(ReadDviceAddress);
	TestAck();
	while(bytes!=1)
	{
		*RamAddress=Read8Bit();
		Ack();
		RamAddress++;
		bytes--;
	}
	*RamAddress=Read8Bit();
	NoAck();
	I2CStop();
	Ram_protect=1;
}
/*-------------写PCF8574--------------------------*/
void writepcf8574(uchar slvadr,uchar dat)
{
	I2CStart();//START();				//启动I2C 总线
	writebyte(slvadr);
	writebyte(dat);
	I2CStop();
}
/*-------------读PCF8574--------------------------*/
uchar readpcf8574(uchar slvadr)
{
	uchar idata dat;
	I2CStart();//START();				//启动I2C 总线
	writebyte(slvadr);
	I2CStart();
	writebyte(slvadr+1);
	dat=readbyte();
	I2CStop();
	return(dat);
}
/*---------------------Keyboard Scan Routins----------------*/
/*出口信息:SGKEY中存键值,无键按下,键值=FF.*/
uchar KBSCAN(void)
{
	uchar idata data0,data1;
	uchar idata key;			//键值
	writepcf8574(PCFKey,0xF0);		//写键盘8574
	data0=readpcf8574(PCFKey);		//读键盘8574
	if(data0!=0xF0)				//是否有键按下?
	{
		data0=~data0;
		data0&=0xF0;
		DelayMs(10);			//延时去抖
		writepcf8574(PCFKey,0x0F);
		data1=readpcf8574(PCFKey);
		if(data1!=0x0F)			//是否有键按下?
		{
			data1=~data1;
			data1&=0x0F;
			key=data0+data1;
		}
		else
			key=0xFF;
		//判断按键是否放开
		writepcf8574(PCFKey,0xF0);
		data0=readpcf8574(PCFKey);
		while(data0!=0xF0)
		{
			writepcf8574(PCFKey,0xF0);
			data0=readpcf8574(PCFKey);
			WatchDog();
		}
	}
	else
		key=0xFF;
	return(key);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -