8574.c.bak

来自「aduc834单片机PCF8574 4*5键盘驱动程序」· BAK 代码 · 共 147 行

BAK
147
字号
#include <reg52.h>
#include <intrins.h>

#define uchar unsigned char
#define uint unsigned int

sbit SDA=P1^0;      //模拟I2C 数据传送位
sbit SCL=P1^1;      //D釯2C 时钟控制状态标志
sbit DIR17=P1^7;//74HC245输入输出控制       0:A=B      1:B=A


uchar slvadr ;      //被控器地址
uchar str[14]={0x01,0x03,0x07,0x0F,0x1F,0x3F,0x7F,0xFF,0x7F,0x3F,0x1F,0x0F,0x07,0x03};//要显示的内容

void delay1ms(uchar x)
{  
unsigned char i,j;
        while(x--)
           {
             for(i=5;i>0;i--)
          for(j=132;j>0;j--);
        }
}

/*---------------------------------------------------------------------------------------------------
开始:START
描述:启动I2C 总线子程序--发送I2C 起始条件
---------------------------------------------------------------------------------------------------*/
void start(void)
{
      SDA=1;
      _nop_();
      SCL=1;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      SDA=0;
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      _nop_();
      SCL=0;
}

/*---------------------------------------------------------------------------------------------------
名称:STOP
描述:停止I2C 总线子程序--发送I2C 总线停止条件
---------------------------------------------------------------------------------------------------*/
void stop(void)
{
       SDA=0;
       _nop_();
       SCL=1;
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       _nop_();
       SDA=1;
       _nop_();
       _nop_();
       _nop_();
       _nop_();
}

/**************************************************************************************************
名称:SentByte
描述:字节数据传送子程序发送一个字节数据或地址给被控器PCF8574
**************************************************************************************************/
void sentbyte(uchar sentd)
{
       uchar i;
       for(i=0;i<8;i++)          //要传送的数据长度为8 位
       { 
         sentd<<=1;            //要发送的数据左移
          SDA=CY;
         _nop_();
         _nop_();
           SCL=1;           //置时钟线为高通知被控器开始接收数据位
         _nop_();           //保证时钟高周期大于4 us
         _nop_();
         _nop_();
         _nop_();
         _nop_();
           SCL=0;          //钳住总线准备接收下一个数据位
       }
        _nop_();
_nop_();
        SDA=1;             //8 位发送完后释放数据线准备收应答位
        _nop_();
_nop_();
SCL=1;            //开始接收应答信号
_nop_();
_nop_();
_nop_();
_nop_();
        _nop_();      //判断是否接收到应答信号正常转AckEnd
_nop_();
SCL=0;        //发送结束钳住总线准备下一步发送或接收数据或进行其它处理
}

/**************************************************************************************************
发送数据程序
名称:SendData
描述:发送1个字节数据给PCF8574
*************************************************************************************************/
void senddata(uchar *ucI)
{
       uchar datauci=0;
       start();
       sentbyte(slvadr);
       datauci=*ucI;
       sentbyte(datauci);
       stop();
       delay1ms(10);
}

/*************************************************************************************
      地址为addr PCF8574       作为准双向口输出 
**************************************************************************************/
void output_control(uchar addr, uchar *outdata)
{
        slvadr=addr;
senddata(outdata);
}


/*************************************************************************************
主程序
**************************************************************************************/
void main()
{
       uchar *p;
       DIR17=0;
       while(1)
        {
          for(p=str;p<(str+14);p++)
            {
             output_control(0x42,p);
             delay1ms(70);
         }
       }
}
void  I2C0_ISR(void)

⌨️ 快捷键说明

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