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

📄 zy_8566.c

📁 I2C PCF8566D PCF8575 驱动C51
💻 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 + -