LEDs
一、接口时序层介绍与函数编写
这里介绍了数据传输接口时序图。时序图,就是数据按照时间变换的图。时间是从左到右进行的,就像数学里的时间轴T。看时序图需要遵循以下规则,从左到右,从上到下来看时序图。仔细看开始条件和结束条件那里,有一个浅浅的竖线。观察SCLK和DIN哪个先改变电平状态。
下面主要写数据传输,如何通过IIC接口传输一个字节的数据:一个字节8位,每一位只能在SCLK低电平期间改变,在高电平期间,DIN口数据要保持不变。可以这样理解,SCLK高电平时,TM1640会读取DIN上的电平信号,所以,这个时候单片机不要改变DIN上的电平,否则,读取会错误。当SCLK低电平时,DIN电平读取完毕了,这个时候,单片机可以改变DIN的电平。一个字节8位,先传递第0位数据,最后是传递第7位数据。下面看程序。
这个程序很简单啊,就是SCLK先变低,然后,判断,数据的最低位是否为高电平,如果是高电平,DIN就输出1,否则输出0。然后SCLK变高,TM1640读取数据,然后把下一位数据移动到最低位,然后重复上面的步骤,一直到8位传输完毕。到此,TM1640的接口时序就编写完毕了。
二、通信协议层介绍与函数编写
下面我们看看TM1640的通信协议,根据手册有两种模式,固定地址和地址自加模式。
在第五步里,我们要看通讯协议,我们可以发现是按照cmd+data这种格式来传输的。那么我们先了解下命令码。B7 B6两位是不同命令码的识别码,一共三种命令码:数据命令,抵制命令,显示命令。比如,01表示数据命令,剩余的6位是具体的数据命令的区分。一个芯片会有多种数据命令。我们这里地址模式就是通过数据命令来设置的。常用的地址自增模式,也就是默认模式,它的命令码是01000000B = 0x40。自增模式里command1就是用来设置地址模式的。可以设置固定地址模式,自增模式。
那么,command2很明显就是地址了,因为这个命令后面紧跟着是data,所以,肯定是地址。那么,地址怎么设置?上面的表格地址命令B7 B6为11就是表示地址命令,剩余的位就是表示地址。TM1640一共能驱动16位数码管,那么地址就有16个。地址从0到16,所以地址命令码就是0xC0+地址(0-16)。
地址后面就是跟着的数据,这个很简单,直接发送数据就可以了。Command3是啥,手册上说是控制显示,研究了下,是关于数码管显示的亮度的。看下图,我们知道10是显示命令,剩余的位数表示亮度。
好了,这样子,通讯协议基本上了解了。一共三部分,先是设置地址模式,然后设置地址,发送数据,最后设置显示亮度。这样一看,是不是很简单了。这里,亮度设置码我们用宏定义表示了下,便于我们阅读代码。
具体的代码如何写呢?下面我以地址自增模式,显示16位数码管。
上面三个函数就是直接和芯片相关的操作函数。当然了,地址设置,亮度设置一般只需要设置一次。因为TM1640默认是地址自增模式,所以,不需要我们设置。在芯片初始化阶段,我们只要把需要显示的数据发送到TM1640就行了,然后开启显示就OK了。在while循环里,我们只需要定时刷新数码管的数据显示缓存就行了。那么这里,有个注意点,就是显示数据变化时,才执行数据发送函数。这里需要使用memcmp函数比较两个数组内容是否一致。一个数组是存放要显示的数据,一个数组存放的是上次显示的数据。
三、应用层函数编写以及数据构造
这里数据显示构造了一个联合体类型,见下图。
我们定义了一个联合体数组,我们知道联合体成员具有共同的地址,这样做有什么好处么?好多很多,首先可以对数码管进行直接操作,也可以对数码管进行位操作。在上电的时候,一般会把所有的数码管点亮,用来检测是否有数码管坏掉的显示段。看下面这张图,列出了常见的显示缓存操作。
数码管用户层函数就两个,一个是数据显示数组刷新函数,另一个就是数据发送函数。我们想显示哪段LED,就向联合体数组里写数据,然后,在数据发送函数里检测数据是否变化,如果变化,就把联合体数组里的数据发送出去。
最后,总结一下关于芯片的驱动程序结构。
最底层是接口数据传输层,这里传输是按照位数据传输,这一层又叫做接口时序层。start(),stop(),TM1640_WriteData()都属于接口时序层。
中间层是通信数据协议层,这一层主要是说明单片机和芯片按照什么格式来传输数据。地址模式设置函数,数据发送函数,显示亮度显示函数都属于这一层。
最后,就是用户层,这一层主要是构造数据结构,以及编写具体的用户应用。比如,数据刷新函数,缓存检测函数。又或者根据具体的需要,定时关闭数码管显示。还有就是数据显示函数,显示数字456,要把456拆分成4,5,6分别送到显示数组里。这些都属于具体的应用。不管是数码管还是其他显示屏,这些用户层都是共用的。当我们,更换使用屏时,只需要修改低层代码就行了。
要掌握根据时序图写程序的方法,这个很重要。在以后学习中,我们可以不写驱动程序,使用别人的程序也是可以的,但是,你要有写驱动程序的能力。还有就是掌握程序的分层方法,规范合理的程序结构有利于程序的阅读和修改。
全部0条评论
快来发表一下你的评论吧 !