Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1926405
  • 博文数量: 187
  • 博客积分: 1457
  • 博客等级: 上尉
  • 技术积分: 2422
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-13 09:41
个人简介

如需要绘制PCB,设计电路可以和我联系。sunhenu@163.com.

文章分类

全部博文(187)

文章存档

2017年(2)

2016年(2)

2015年(7)

2014年(13)

2013年(80)

2012年(83)

分类: LINUX

2014-09-22 14:30:57

这段时间因为设计项目需要用到数码管和按钮,因为数码管过多,没有办法使用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
阅读(13046) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~