📄 zy_8566.c
字号:
#include<reg922.h>
#include<intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define PCF8566 0x7c
#define _Nop() _nop_()
#define ERRORCOUNT 10
sbit LSCL=P0^0;
sbit LSDA=P1^7;
sbit POWERD=P3^1;
uchar buff[6]={0x00};
uchar PCF8566_init(uchar mode,uchar glitter);
uchar PCF8566_display(uchar drive,uchar adr,uchar*buf,uchar no);
bit ACK=0;
void START(void);
void FRIST(void);
void LCDDRIVER(void);
void SENDBYTE(uchar c);
bit ISENDBYTE(uchar sla,uchar c);
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no);
void DELAY(void);
/************************************************************************
* MAIN *
* 如D——OUT为高则24C02清零,在来读拨码 *
************************************************************************/
void main(void)
{
DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();DELAY();
START(); /*I/O口初始 T0,T1,INT0,INT1初始 */
for(;;)
{
DELAY();
LCDDRIVER();
}
}
/*************************************************************************
* START *
* T0,T1,INT1初始化T0 0.2ms开始 *
*************************************************************************/
void START(void)
{
P1M1=0xff;
P1M2=0xf7; /*P1.2 P1.3为输入方式*/
P0M1=0xff;
P0M2=0xff; /*其他口为准双向口*/
}
/************************************************************************************
* LCDDRIVER *
************************************************************************************/
void LCDDRIVER(void) /*从地址为7C*/
{
buff[0]=buff[1]=buff[2]=buff[3]=buff[4]=buff[5]=0xBE; //0:0XBE 1:0X06 2:0XDA 3:0X5E 4:0X66 5:0X7C 6:0XFC 7:0X16 8:0XFE 9:0X7E
PCF8566_init(0x08,0x00); /*初始化1/3偏压,4背极,禁止闪烁*/
PCF8566_display(0x00,0x00,buff,6); /*控制LCD 显示*/
}
/************************************************************************************
* PCF8566 *
************************************************************************************/
uchar PCF8566_init(uchar mode,uchar glitter)
{
mode=(mode&0x1f)|0xc0;
if(ISENDBYTE(PCF8566,mode)==0)return(0);
glitter=(glitter&0x07)|0x70;
ISENDBYTE(PCF8566,glitter);
return(1);
}
/************************************************************************************
* PCF8566LCD *
************************************************************************************/
uchar PCF8566_display(uchar drive,uchar adr,uchar*buf,uchar no)
{
drive=(drive&0x07)|0x60;
ISENDBYTE(PCF8566,drive);
adr=adr&0x1f;
ISendStr(PCF8566,adr,buf,no);
return(1);
}
/************************************************************************************
* STARTIIC *
************************************************************************************/
void STARTIIC(void)
{
LSDA=1;
_nop_();
LSCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
LSDA=0;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
LSCL=0;
_nop_();
_nop_();
}
/************************************************************************************
* STOPIIC *
************************************************************************************/
void STOP(void)
{
LSDA=0;
_nop_();
_nop_();
_nop_();
LSCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
LSDA=1;
_nop_();
_nop_();
_nop_();
_nop_();
}
/************************************************************************************
* SENDBYTE *
************************************************************************************/
void SENDBYTE(uchar c)
{
uchar BITNUM;
for(BITNUM=0;BITNUM<8;BITNUM++)
{
if((c<<BITNUM)&0x80)LSDA=1;
else LSDA=0;
_nop_();
LSCL=1;
_nop_();
_nop_();
_nop_();
LSCL=0;
}
_nop_();
_nop_();
LSDA=1;
_nop_();
_nop_();
LSCL=1;
_nop_();
_nop_();
if(LSDA==1)ACK=0;
else ACK=1;
LSCL=0;
_nop_();
_nop_();
}
/****************************************************************************************
* ISENDBYTE *
****************************************************************************************/
bit ISENDBYTE(uchar sla,uchar c)
{
STARTIIC();
SENDBYTE(sla);
if(ACK==0)
return(0);
SENDBYTE(c);
if(ACK==0);
return(0);
STOP();
return(1);
}
/****************************************************************************************
向有子地址器件发送多字节数据函数 *
函数原型: bit ISendStr(uchar sla,uchar suba,ucahr *s,uchar no); *
功能: 从启动总线到发送地址,子地址,数据,结束总线的全过程,从器件 *
地址sla,子地址suba,发送内容是s指向的内容,发送no个字节。 *
如果返回1表示操作成功,否则操作有误。 *
注意: 使用前必须已结束总线。 *
***************************************************************************************/
bit ISendStr(uchar sla,uchar suba,uchar *s,uchar no)
{
uchar i;
STARTIIC(); /*启动总线*/
SENDBYTE(sla); /*发送器件地址*/
if(ACK==0)return(0);
SENDBYTE(suba); /*发送器件子地址*/
if(ACK==0)return(0);
for(i=0;i<no;i++)
{
SENDBYTE(*s); /*发送数据*/
if(ACK==0)return(0);
s++;
}
STOP(); /*结束总线*/
return(1);
}
/*************************************************************************
* DELAY *
*************************************************************************/
void DELAY(void)
{
uint i;
for(i=0;i<1400;i++);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -