今天继续8266+DS3231时钟项目的显示部分功能的详解。这个时钟系列的前的三篇分别是:
《8266+DS3231时钟之开发个时钟遇到的N个坑【一】》
《8266+ds3231时钟之arduino官网发布的DS3231库的分析【二】》
《8266+DS3231时钟之DS3231具体实现及代码【三】》
有兴趣的可以去看看,如果觉得对你有帮助,请点个赞。
时钟采用TM1638芯片去驱动数码管和按键。由于同时要驱动十个数码管和8个按键,这里采用TM1638这个强大的数码管驱动芯片。功能上,十个数码管分别显示月、日、时、分共8个数码管,温度占用2个数码管。其中月、日、时、分的显示采用共阴管,而温度显示采用共阳管。这里大家可以先看看成品电路的效果,具体如下图:
由于板子是半成品,还没有做外壳,所以这里先用红字标上管的显示内容,以期能理解。至于为什么有共阴也有共阳的数码管,这里主要是因为TM1638的显示能力是8位10段。由于8个数码管我们实际只用到了7段(a、b、c、d、e、f、g)就够显示了,所以每个管还剩3段的显示能力,也就是3段*8位。这样我在设计时把这3段的显示能力中,一段分配给了秒的显示(如上图),二段8位用于温度的显示。这里看不明白不要紧,具体在下面理解完芯片的引脚能力会,就自然明白了。
以下内容是摘自TM1638的数据手册,放在这里是为了方便阅读,当然也可以自已去度娘下载。要用好TM1638必须清楚数据手册里讲的内容,否则在后面的驱动程序的部分是没法看明白的。由于原文的例子中有些有错误,我在摘录时已修改,因此有原文的人在阅读原文时要注意。
TM1638是带键盘扫描接口的LED(发光二极管显示器)驱动控制专用电路,内部集
成有MCU 数字接口、数据锁存器、LED 高压驱动、键盘扫描等电路。
• 采用功率CMOS 工艺
• 显示模式 10 段×8 位
• 键扫描(8×3bit)
• 辉度调节电路(占空比8 级可调)
• 串行接口(CLK,STB,DIO)
• 振荡方式:RC 振荡(450KHz+5%)
• 内置上电复位电路
• 采用SOP28封装
注意:DIO口输出数据时为N管开漏输出,在读键的时候需要外接1K-10K的上拉电阻。推荐10K的
上拉电阻。DIO在时钟的下降沿控制N管的动作,此时读数时不稳定,你可以参考图(6),在时钟的上升沿读数才时稳定。
显示寄存器地址和显示模式:
该寄存器存储通过串行接口从外部器件传送到TM1638 的数据,地址从00H-0FH共16字节单元,
分别与芯片SGE和GRID管脚所接的LED灯对应,分配如下图:
(写LED显示数据的时候,按照从显示地址从低位到高位,从数据字节的低位到高位操作。)
(这里表格产生了向左的错位,我用箭头标出了错位的对应界限,看时请注意)
写LED显示数据的时候,按照从低位地址到高位地址,从字节的低位到高位操作;在运用中
没有使用到的SEG输出口,在对应的BIT地址位写0。
这里,我用一个具体的例子来说明,就比较好明白上表的使用方法了。
数码管的段的定义如下:
如果此时要显示0这个数,那么对应的需要点亮的段为A、B、C、D、E、F这六个段
键扫矩阵为8×3bit,如图(3)所示:
键扫数据储存地址如下所示,先发读键命令后,开始读取按键数据BYTE1—BYTE4字节,
读数据从低位开始输出;芯片K和KS引脚对应的按键按下时,相对应的字节内的 BIT位为1。
注意:
1、TM1638最多可以读4个字节,不允许多读。
2、读数据字节只能按顺序从BYTE1-BYTE4读取,不可跨字节读。例如:硬件上的K2与KS8
对应按键按下时,此时想要读到此按键数据,必须需要读到第4个字节的第5BIT位,才可读出数据;当K1与KS8,K2与KS8,K3与KS8三个按键同时按下时,此时BYTE4所读数据的B4,B5,B6位均为1
3、组合键只能是同一个KS,不同的K引脚才能做组合键;同一个K与不同的KS引脚不可以
做成组合键使用。
指令用来设置显示模式和LED 驱动器的状态。
在STB下降沿后由DIO输入的第一个字节作为一条指令。经过译码,取最高B7、B6两位比特位以区别不同的指令。
如果在指令或数据传输时STB被置为高电平,串行通讯被初始化,并且正在传送的指令或数据
无效(之前传送的指令或数据保持有效)。
该指令用来设置数据写和读,B1和B0位不允许设置01或11。
总结上表,实际用到的命令码如下:
该指令用来设置显示寄存器的地址。 如果地址设为10H 或更高,数据被忽略,直到有效地址被设定。
上电时,地址默认设为00H。
总结:上表由于B7位和B6位设定为1,因此实际就决定了基地址为1100 0000即C0H。B0-B3则定义了偏移地址。在实际地址命令设置时应当是基地址+偏移地址。
读取和接收1个BIT都在时钟的上升沿操作。
▲注意:读取数据时,从串行时钟CLK 的第8 个上升沿开始设置指令到CLK 下降沿读数据之间需要
一个等待时间Twait(最小1μS)。
注意:字节读入时,是按B0-B7的低位到高位的顺序。
1、驱动共阴数码管:
图7给出共阴数码管的连接示意图,如果让该数码管显示“0”,那你需要在GRID1为低电平
的时候让SEG1,SEG2,SEG3,SEG4,SEG5,SEG6为高电平,SEG7为低电平,
查看图(2)显示地址表格,只需在00H地址单元里面写数据3FH就可以让数码管显示“0”。
2、驱动共阳数码管
图8给出共阳数码管的连接示意图,如果让该数码管显示“0”,那你需要在GRID1,GRID2,
GRID3,GRID4,GRID5,GRID6为低电平的时候让SEG1为高电平,在GRID7为低电平的时候让SEG1为低电平。要向地址单元00H,02H,04H,06H,08H,0AH里面分别写数据01H,其余的地址单元全部写数据00H。
注意:SEG1-10为P管开漏输出,GRID1-8为N管开漏输出,在使用时候,SEG1-10只能接LED的阳极,GRID只能接LED的阴极,不可反接。
你可以按照图(9)用示波器观察观察SEG1/KS1和SEG2/KS2的输出波形,SEGN/KSN
输出的波形见图(10)。
IC在键盘扫描的时候SEGN/KSN的波形:
Tdisp和IC工作的振荡频率有关,TM1638经过多次完善,振荡频率不完全一致。500US
仅仅提供参考,以实际测量为准。
一般情况下使用图(11),可以满足按键设计的要求。
当S1被按下的时候,在第1个字节的B2读到“1”。如果多个按键被按下,将会读到多个“1”,
当S2,S3被按下的时候,可以在第1个字节的B1,B6读到“1”。
▲注意:复合键使用注意事项:
SEG1/KS1-SEG10/KS10是显示和按键扫描复用的。以图(12)为例子,显示需要D1亮,D2灭,需要让SEG1为“0”,SEG2为“1”状态,如果S1,S2同时被按下,相当于SEG1,SEG2被短路,这时D1,D2都被点亮。
解决方案:
1、在硬件上,可以将需要同时按下的键设置在不同的K线上面如图(13)所示,
2、在SEG1—SEG N上面串联电阻如图(14)所示,电阻的阻值应选在510欧姆,太大会造成
按键的失效,太小可能不能解决显示干扰的问题。
3、或者串联二极管如图(15)所示。
使用地址自动加1模式,设置地址实际上是设置传送的数据流存放的起始地址。起始地址命令
字发送完毕,“STB”不需要置高紧跟着传数据,最多14BYTE,数据传送完毕才将“STB”置高。
使用固定地址模式,设置地址其实际上是设置需要传送的1BYTE数据存放的地址。地址发送完
毕,“STB”不需要置高,紧跟着传1BYTE数据,数据传送完毕才将“STB”置高。然后重新设置第2
个数据需要存放的地址,最多14BYTE数据传送完毕,“STB”置高。
采用地址自动加1的程序设计流程图:
采用固定地址的程序设计流程图:
2 TM1638驱动共阴数码屏硬件电路,如图(17):
▲注意: 1、VDD、GND之间滤波电容在PCB板布线应尽量靠近TM1629芯片放置,加强滤波效果。
2、连接在DIO、CLK、STB通讯口上三个100P电容可以降低对通讯口的干扰。
3、因蓝光数码管的导通压降压约为3V,因此TM1629供电应选用5V。
月份和日期的显示分别是采用了两个2位共阴数码管。管脚的定义如下:
时分秒的显示采用的是一个4位共阴数码管。管脚定义如下:
由于时分秒显示采用的是4位管,4位用于时分的显示,秒的闪烁是两个LED灯,在图中是第3脚连接的D5、D6。
温度显示采用的是一个2位共阳数码管。管脚定义如下:
具体原理图:
LED_2_green1 和 LED_2_green2 是对应月日的显示
LED_2_node对应的是温度显示
LED_clock_4是时分秒的显示
接线对应表:
以上所有涉及硬件的部分已完成,要想完成正常的显示,接下来就是软件部分。考虑到篇幅问题,将在下一篇详细分析TM1638的驱动代码,以及驱动的具体应用。