|
楼主 |
发表于 2020-8-1 15:29:37
|
显示全部楼层
狗尾续貂:说说TM1629驱动共阳极数码管的那些事
TM1629是一款驱动共阴极的芯片,虽然也可以变通使用来驱动共阳极芯片但程序会麻烦些,本次制作曾经一度困在了这里,经过一番挣扎最终利用一段网上的程序实现了自己的控制,其实时钟的整体程序方案用的是我自己的,如果不涉及共阴、共阳的数据变换问题,程序就与上篇帖子的没啥区别了,只不过更加完善了一些,另外,本次制作没有用到TM1629的按键功能而是用了单片机端口按键控制,主要是因为这个芯片的按键功能与1637不相同,1637的按键是每个都有固定的编码可以读取任意按键的键值,而1629则必须一次性按顺序读出4个值,4个值静止在数组里我废了很多精力也无法实现抬键判断,如果那位高手有办法也请指点一下、在此先谢了!下面继续说共阴、共阳的数据转换的原理,如果用TM1629来驱动共阴极数码管,则欲使某为数码显示某个数字,只需要经该数字的编码存入相应位的显存中即可直接看到显示了,对于TM1629B而言,因为可以同时驱动12段LED,所以每一位显存都由两个8位寄存器组成,例如:GRID1就有0x00,0x01两个寄存器,如果我们在SEG1-SEG8上连接一个8段数码管,那么,只要在0x00中存入0x77(0字的段码)就可以看到第一个数码管显示为0;如果驱动共阳极数码管那么数码管的公共端就要连接在SEGn上而段引脚就要连接在8个GRIDn上,此时要想在由SEG1控制的第一位数码管上显示一个数字0就要分别在8个相应寄存器中写入SEG1位的值,详见数据手册相关表格,也就是说显示一个数字需要写8个寄存器。
下面是网上找来的数据变换函数:
//8段数码显示的共阴数据到共阳数据的转换 外加数码位移 -- 实质是一个数组的转置 并且只改变位
void NE_C(unsigned char ydata,unsigned char cnt)
{
char i=0,j=0;
if(cnt>0)
{
if(cnt>8)
{
//myflag |= 0x01;
cnt = cnt -9;
for(i=1;i<16;i=i+2)
{
if(ydata&0x01 == 0x01)
{
BCD_LABLE_anode |= (0x01<<cnt);
else
{
BCD_LABLE_anode &= ~(0x01<<cnt);//清零
ydata = (ydata>>
1);
}
}
else
{
cnt = cnt -1;
for(i=0;i<16;i=i+2)
{
if((ydata&0x01) == 0x01)
{
BCD_LABLE_anode |= 1);
}
}
else
{
cnt = cnt -1;
for(i=0;i<16;i=i+2)
{
if((ydata&0x01) == 0x01)
{
BCD_LABLE_anode |= (0x01<<cnt);
else
{
BCD_LABLE_anode &= ~(0x01<<cnt);//清零
ydata = (ydata>>1);
}
}
}
}
以下是我改编的可以任意进行三种颜色驱动输出时的数据变换函数
//匹配程序的接线详解程序标注
- void Convert(uchar ydata, uchar cnt, uchar se)
- {
- uchar i,in,im;
- if(se==1)//显示绿色====由SEG1-SEG5驱动
- {
- in=2;//用到寄存器0x00、0x02、0x04、0x06、0x08、0x0A、0x0C、0x0E
- im=0;
- }
- if(se==2)//显示红色====由SEG9-SEG13驱动
- {
- in=2;//用到寄存器0x01、0x03、0x05、0x07、0x09、0x0B、0x0D、0x0F
- im=1;
- }
- if(se==3)//显示橙色
- {
- in=1;//用到全部16个寄存器(两个8位寄存器分别存储红色和绿色段码数据)
- im=0;
- }
- for (i = im; i < 16; i = i+in)
- {
- if (ydata & 0x01 == 0x01)
- {
- DATE[i] |= (0x01 << cnt);
- }
- else
- {
- DATE[i] &= ~(0x01 << cnt);
- }
- if(se==3)
- {
- if(i%2==1)
- {
- ydata = (ydata >> 1);
- }
- else
- {
- ydata = ydata;
- }
- }
- else
- ydata = (ydata >> 1);
- }
- }
复制代码
|
|