?? 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 + -