TM1638驱动数码管的一点建议,附程序

  年过完了,首先祝大家开工大吉!

   TM1638是一种带键盘扫描接口的数码管驱动芯片。可以驱动共阳极数码管或共阴极数码管,相比单片机直接驱动数码管的方案,可以省去很多单片机的端口,也不需要浪费资源去扫描显示了。使用方便,价格也便宜。

  最近一个项目用到它,没详细看数据手册,只是按照数据手册给的共阳极的原理图画了电路。

9aded9b37780f63eae736a52ff431c65.png

       然而板子做好了写程序时发现,它的寄存器是按照共阴极数码管的方式定义的。驱动共阴极数码管,只需要写1个或2个(如果用到SEG9和SEG10)寄存器即可,寄存器的8位对应一个数码的8段,非常简单,如下:

11bac01e084fd75561d5e7d876085bf9.png       然而,驱动共阳极数码管,则需要写8个或16个(如果用到SEG9和SEG10)寄存器。而且还需要根据自己的电路图进行行列的转换,移位操作。程序上,比共阴极的驱动方式要复杂很多。

aa88527e31804d5fc5a35f33501f1fa9.png

b3c488091ca900f70db08cab6867d5b6.png

       无奈,板子已经做好了,只能按照共阳极的写程序,下面是我写的共阴极寄存器转换为共阳极显示的程序。

void Convert()
{
    uint8_t Temp;
    uint8_t i,j,k;


    for(i=0; i<8; i++) //8个寄存器
    {
        Temp = Disp_Cathode_Reg[i];//共阴极寄存器
        for(j=0; j<16; j+=2) //8个寄存器移位
        {
            Disp_Anode_Reg[j] = Disp_Anode_Reg[j]>>1;
        }
        for(j=0; j<8; j++) //8位
        {
            k=j<<1;
            if(Temp&0x01)
            {
                Disp_Anode_Reg[k] |= 0x80;
            }
            else
            {
                Disp_Anode_Reg[k] &= 0x7F;
            }
            Temp = Temp>>1;
        }
    }


    for(i=0; i<16; i+=2) //8个寄存器
    {
        Disp_Anode_Reg[i+1] = Disp_Anode_Reg[i]>>5;
        Disp_Anode_Reg[i] = Disp_Anode_Reg[i]<<3;
    }
}

       共阴极的方式最多可驱动8位x10段的数码管,而共阳极可驱动10位x8端的数码管。这里给大家提个醒,电路尽量要按照共阴极的方式设计,写程序方便。如果数码管位数大于8位,必须按照共阳极的方式设计,也要尽量按照顺序去设计数码管的位和段,这样程序做转换时逻辑也简单一些。

       最后附上完整驱动程序,仅供参考。(公众号不支持外部链接,请复制到浏览器打开)

链接:https://pan.baidu.com/s/1DCSW039uw8n4ugY5dLntZg

提取码:bpka

推荐阅读:

【硬件设计】电源防反接电路设计

【硬件设计】几种电平转换电路

【软件设计】Keil总是未响应?

【软件设计】STM32软件调用系统BootLoader

   欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值