TM1638芯片使用心得

19430阅读 0评论2014-09-22 sunhenu
分类:LINUX

这段时间因为设计项目需要用到数码管和按钮,因为数码管过多,没有办法使用IO扫描方式,所以就是使用了专用IC驱动芯片,TM1638芯片可以驱动数码可以驱动矩阵键盘。


这是芯片管脚图,具体说明请看该芯片的PDF说明书,我在最后会以附件方式上传,这里主要说说芯片驱动程序,我自己调试通的。
因为正式产品的板子还没有做好,我就利用了一下,前面那个HTCL2032模块板,因为上面正好有单片机,还有SO32的贴片封装,
正好可以焊上TM1638,因为是试验,我不能将24个矩阵按钮全接上,我只是将第一脚和第五脚通过一个按钮连接了,不多说了,直接上驱动程序。

#define TM1638_STB                      PORTC_Bit1
#define TM1638_CLK                      PORTC_Bit2
#define TM1638_DIO_IN                DDRC_Bit3=0
#define TM1638_DIO_OUT             DDRC_Bit3=1
#define TM1638_DIO                     PORTC_Bit3
#define TM1638_DIO_DataIN          PINC_Bit3

void TM1638_Write(unsigned char DATA) //写数据函数
{
  
    unsigned char i;
    TM1638_DIO_OUT;
    for(i=0;i<8;i++)
        {
            TM1638_CLK=0;
             delay_us(1);
            if(DATA&0X01)
                TM1638_DIO=1;
                else
                    TM1638_DIO=0;
             DATA>>=1;
             TM1638_CLK=1;
             delay_us(1);
        }
}
unsigned char TM1638_Read(void) //读数据函数
{
        unsigned char i;
        unsigned char temp=0;
        TM1638_DIO_IN;

        for(i=0;i<8;i++)
            {
                    temp>>=1;
                    TM1638_CLK=0;
                    delay_us(1);
                    if(TM1638_DIO_DataIN==1)
                        temp|=0x80;
                    TM1638_CLK=1;
                    delay_us(1);
            }
    return temp;
}
void Write_COM(unsigned char cmd) //发送命令字
{
        TM1638_STB=0;
        TM1638_Write(cmd);
        TM1638_STB=1;
}
unsigned char Read_key(unsigned char *KeyValue)
{
    unsigned char c[4],i,key_value=0;
    TM1638_STB=0;
    TM1638_Write(0x42);           //读键扫数据 命令
    delay_us(10);
    for(i=0;i<4;i++)
        KeyValue[i]=TM1638_Read();
    TM1638_STB=1;           //4个字节数据合成一个字节
    return 0;
}
void Write_DATA(unsigned char add,unsigned char DATA) //指定地址写入数据
{
    Write_COM(0x44);
    TM1638_STB=0;
    TM1638_Write(0xc0|add);
    TM1638_Write(DATA);
    TM1638_STB=1;
}




//TM1638初始化函数
void init_TM1638(void)
{
        unsigned char i;       
        DDRC=0xff;
        Write_COM(0x8b);       //亮度 (0x88-0x8f)8级亮度可调
        Write_COM(0x40);       //采用地址自动加1
        TM1638_STB=0;           //
        TM1638_Write(0xc0);    //设置起始地址
        for(i=0;i<16;i++)   //传送16个字节的数据
            TM1638_Write(0x00);
        TM1638_STB=1;
}
main()
{
 init_TM1638();
 __enable_interrupt();
                               //初始化TM1638
    while(1)              
      {
        uchar KeyValue[4];  
        Read_key(KeyValue);
        if(KeyValue[0]&0x04)
        {
          PORTB_Bit0=0;
          Uart_Transmit(KeyValue[0]);
        }        
        else
          PORTB_Bit0=1;
    }
}


程序的效果,就是我按下按钮,KeyValue[0]&0x04为1,然后点亮LED,弹起,就熄灭LED.在调试过程中因为我这是凑合的电路,所以STB,CLK,DIO三个管脚
没有接上拉电阻,结果读不到数据,所以这里一定要接上上拉电阻在这个三个管脚。下面图片是按钮按下和不按下的效果图。


tm1638芯片数据手册.pdf
上一篇:正点原子jlink v8 重新烧录解决不识别usb,灯不亮的问题
下一篇:NMOS管实现3.3V和5V转换电路的输入信号速率问题分析