年过完了,首先祝大家开工大吉!
TM1638是一种带键盘扫描接口的数码管驱动芯片。可以驱动共阳极数码管或共阴极数码管,相比单片机直接驱动数码管的方案,可以省去很多单片机的端口,也不需要浪费资源去扫描显示了。使用方便,价格也便宜。
最近一个项目用到它,没详细看数据手册,只是按照数据手册给的共阳极的原理图画了电路。
然而板子做好了写程序时发现,它的寄存器是按照共阴极数码管的方式定义的。驱动共阴极数码管,只需要写1个或2个(如果用到SEG9和SEG10)寄存器即可,寄存器的8位对应一个数码的8段,非常简单,如下:
然而,驱动共阳极数码管,则需要写8个或16个(如果用到SEG9和SEG10)寄存器。而且还需要根据自己的电路图进行行列的转换,移位操作。程序上,比共阴极的驱动方式要复杂很多。
无奈,板子已经做好了,只能按照共阳极的写程序,下面是我写的共阴极寄存器转换为共阳极显示的程序。
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
推荐阅读:
欢迎关注公众号"嵌入式技术开发",大家可以后台给我留言沟通交流。如果觉得该公众号对你有所帮助,也欢迎推荐分享给其他人。