TM1637 显示代码

#define DIO_LED      GET_BITFIELD(&PD_ODR).bit0
#define CLK_LED      GET_BITFIELD(&PD_ODR).bit2

void I2CStart(void)
{
     DIO_LED=1;
     CLK_LED=1;
        nop();
        
     DIO_LED=1;
     nop();
     DIO_LED=0;
    nop();
     CLK_LED=0;
}


/********************Stop函数*************************/
void I2CStart(void)
{
    CLK_LED=0;
   nop();
  nop();
    DIO_LED=0;
   nop();
    nop();
    CLK_LED=1;
   nop();
  nop();
  nop();
    DIO_LED=1;
   nop();
    CLK_LED=0;
    DIO_LED=0;


}


/***************发送8bit数据,从低位开始**************/
void I2CWritebyte(unsigned char oneByte)
{
  unsigned char i;
  for(i=0;i<8;i++)
  {
    CLK_LED=0;
    if(oneByte&0x01) 
      DIO_LED=1;
    else 
      DIO_LED=0;
      nop();
    CLK_LED=1;
    oneByte=oneByte>>1;
  }
                                                                                  //8位数据传送完                 
    CLK_LED = 0;                                                                //判断芯片发过来的ACK应答信号
    nop();
    while(DIO_LED==1);
    nop();
    CLK_LED = 1;
    nop();
}


/************显示函数,地址自加一************/
void disp0(unsigned char *p)                              
{
     unsigned char i;
     I2CStart();
     I2CWritebyte(0x40);                                  //数据命令设置:地址自动加1,写数据到显示寄存器
     I2CStop();

     I2CStart();
     I2CWritebyte(0xc0);                                  //地址命令设置:初始地址为00H
     for(i=0;i<6;i++)                                  //发送4字节数据到显存
     {
         I2CWritebyte(*p);
         p++;
     }
     I2CStop();

     I2CStart();
     I2CWritebyte(0x8C);                                 //显示控制命令:开显示,脉冲宽度为11/16.
     I2CStop();

}

/************显示函数,固定地址写数据************/
void disp(unsigned char add, unsigned char value)
{
 I2CStart();
 I2CWritebyte(0x44);                                 //数据命令设置:固定地址,写数据到显示寄存器
 I2CStop();

 I2CStart();
 I2CWritebyte(add);                                //地址命令设置:写入add对应地址

 //I2CWritebyte(CODE[value]);                        //给add地址写数据
 I2CStop();

 I2CStart();
 I2CWritebyte(0x8C);                                //显示控制命令:开显示,脉冲宽度为11/16.
 I2CStop();

}

/***************读按键程序**************/
unsigned char read_key()
{
unsigned char rekey,i;
I2CStart();
I2CWritebyte(0x42);                                                         //写读键指令0x42
DIO_LED=1;
for(i=0;i<8;i++)
{
        CLK_LED=0;
        nop();
       nop();
        rekey=rekey>>1;                                                           //先读低位
       nop();
      nop();
        CLK_LED=1;
        if(DIO_LED) 
          rekey=rekey|0x80;
        else 
          rekey=rekey|0x00;
       nop();
}
        CLK_LED = 0;                                                          //判断芯片发过来的ACK应答信号
       nop();
      nop();
        while(DIO_LED==1);
       nop();
      nop();
        CLK_LED = 1;
        nop();
       nop();
        I2CStop();
        
        return rekey;
}

猜你喜欢

转载自blog.csdn.net/ccy764417301/article/details/84955822
tm