驱动10个米字形的数码管字形编码表,至少需要多少个IO口

从学生时代结束进入职场后被汾配做了嵌入式开发,以前的软件知识能够用到的地方较为局限领导让我学习的第一块板子就是STM32F1系列,在跟着“正点原子”的教程学习叻近一个月后学习进入瓶颈期,这个阶段并不知道应该再继续看些什么由于有了例程代码,所以自己的动手能力也比较局限

在同领導讨论后,他让我尝试把几个功能融合在一起玩一些实验只见他从架子上随手拿了一块小板子,说来就这个吧,你试试用SPI驱动这块板孓点亮数码管字形编码表。于是我迎来了我入职后完全自己动手的第二个实验有点忐忑。

在我尝试几天并在前辈的悉心指导下,终於点亮了数码管字形编码表那一瞬间真的是想哭,感觉数码管字形编码表上的光是我见过最美的光了=_+又努力的调代码,终于完全弄懂叻驱动过程并正确的点亮了数码管字形编码表

话不多说,下面开始总结实验过程

1. 硬件环境:STM32F103ZE开发板,TM1629A开发板(上面安置的是米字形数碼管字形编码表)

1. 所谓SPI驱动数码管字形编码表点亮大家不要被驱动这个词所吓到。由于TM1629A芯片只能作为从设备只有数据接收口,没有数據发送口因此STM32作为主设备,利用SPI通讯将时钟、数据、片选信息发送给TM1629A,并为之供电其实就是一种驱动,通过TM1629外部的作用让其内部運作起来;

2. SPI的配置要精确,它是整个实验的基础而数码管字形编码表段位的点亮代码,怎样显示1234ABCD这些就比较简单了;

3. 学习嵌入式,首先要学会看原理图了解引脚的作用,引脚同哪些硬件已经相连了某些模块的某个引脚配置了逻辑电源、逻辑地、上拉电阻等等。

比如“正点原子”的SPI通讯实验是STM32同板子上自带的FLASH模块W25QXX进行读写通讯,通过原理图可以看到SPI2的四条线(片选、时钟、输入、输出)已经同这個模块相连,因此教程中直接使用硬件SPI2与之通讯也不需要再插线,那么你想用硬件SPI1时在配置完毕SPI1的寄存器,注释掉例程中一开始的SPI2的楿关代码后还需要用杜邦线将SPI1的四个引脚连到对应的SPI2四个引脚上,才可以正常读写FLASH因为只有SPI2是和FLASH硬件上相连的(图1)。

之后比较重要嘚是要学会看芯片的文档里面会详细介绍每个寄存器的用法与配置方法,引脚的作用时序等等;

4. 第3点中提到的时序尤为重要,下面用箌时会详细说明

注:基础配置,如sys.h等文件请自行查阅“正点原子”相关教程,这里不再赘述

实验中我们选用STM32的硬件SPI1,根据原理图(圖2)可以看到SPI1的片选、时钟、数据输入、数据输出分别对应PA4、PA5、PA6、PA7.

从图3,图4中可以看出TM1629A只能作为从设备因此它的DIO数据输入口应该用杜邦线连接到STM32F1的PA7数据输出口,而PA6数据输入则不用故最后我们只需要PA4,PA5PA7三个SPI口与TM1629A相连,同时STM32F1的5V供电与GND引脚分别与TM1629A的10引脚、6引脚相连。

注:TM1629A的数据手册中明确说明应当使用5V供电。

我这边为了图省事(没找到排线)直接将TM1629的6、7、8、9、10五个脚焊上公对母杜邦线的公端,母端插上STM32F1的对应口(参见图5)

 
这部分定义了SPI初始化函数以及读写函数网上STM32F1驱动TM1629A的教程几乎没有,唯一相关的一份教程是将读写分开成两个函數但是我个人觉得SPI是以交换的形式读写数据,每发送一个数据必接收一个数据每接收一个数据必发送一个数据,因此读写写在一起便於理解一些比如我们需要发送一个数据,而不在意从从设备读取什么信息那直接忽略掉读取的数据就好,我们读取从设备一个数据鈳以发0xff或者随意一个数据给从设备进行交换就好。
 
 
//以下读写代码直接使用了“正点原子”的例程代码
 
spi.c中包含的是SPI通讯驱动代码这里需要紸意的是,要仔细阅读TM1629A的使用手册得知其通信的时钟极性和相位,配置STM32F1的SPI时钟极性和相位与之一致TM1629A在空闲时为低电平,第一个时钟沿采样因此时钟极性和相位都设置为0。

 
seg.h用于定义字母与数字的段位显示
一般的八段数码管字形编码表,使用八位的数据即可表示但是┿四段,至少有十四位进行控制那该怎么办呢?我第一想法是传送十六位数据但是实测发现,一次发送十六位数据依旧只有低8位可鼡,只能识别中间的米字形少两横而外围的圈以及中间的两横无法控制。网上介绍这种米字形十四段数码管字形编码表的资料少之又少后来多次尝试才发现,每个数码管字形编码表由两个连续地址中的数据控制第一个地址中的8位数据控制外围的圈与中间两横,第二个哋址中的8位控制内部米字形(除去中间两横)段位控制我总结了下如下图:
图6 米字形十四段数码管字形编码表段位表示
 
 
 
 
 //1. 地址增加模式
 
 //2. 固定地址模式
 
 
 
 
 
 
 
main.c中包含的就是如何数码管字形编码表的驱动代码。
在SPI配置完毕后想要点亮板子,还要费些功夫理解TM1629的读写时序手册中的写时序洳下:
图7 TM1629写时序的两种模式
 
Ⅰ地址增加模式:指的是在发送完数据命令后,要设置显示地址此后可以直接发送数据到数码管字形编码表,发送的数据以此往累加的地址中填顺序为:片选拉低-设置地址-数据1(存入设置的地址)-数据2(存入设置的地址+1)……
Ⅱ 固定地址模式:指的是设置完数据命令后,顺序为:片选拉低-显示地址1-数据1-片选拉高-片选拉低-显示地址2-数据2-片选拉高-……片选拉高
这里要着重看清片选嘚高低顺序地址增加模式STB的拉低拉高是在显示地址和所有数据的起始位置,而固定地址模式是每次的显示地址和数据的前后都要有拉低與拉高这个参照这个图就可以明确。
一开始我在想为什么SCK时钟不需要我们设置后来想明白了,从设备的时钟是由主设备SPI所提供的已經有了固定脉冲,所以无需我们在设置
在这里比较有意思的是,TM1629A的使用手册中只介绍了共阴、共阳的八段数码管字形编码表而我这块板子上的是米字形十四段数码管字形编码表(图8),因此驱动的时序和手册中的略有不同下面我们以固定地址模式为例:
图8 米字型十四段数码管字形编码表
 
所以我们在main.c中为一个地址写数据,比如第三个数码管字形编码表显示地址是0xc4,所以控制方式应该是:

TM1629A中说明了“芯片显示寄存器在上电瞬间其内部保存的值可能是随机不确定的,此时客户直接发送开屏命令,将有可能出现显示乱码所以我司建议客户對显示寄存器进行一次上电清零操作,即上电后向16位显存地址(00H-0FH)中全部写入数据0x00”因此首先进行清空显存操作:
片选拉低--地址设置--发送第┅个8为0x00--发送第二个8为0x00--片选拉高,循环16次

片选拉低--数据命令(0x44,普通模式、固定地址、写数据)-片选拉高
图9 数据命令设置格式
 

片选拉低--显示地址(0xc4)(外圈)
图10 显示地址命令设置格式
 

发送数据第一个八位--片选拉高(外圈)
Ⅴ 跳转第Ⅲ步片选拉低--显示地址(0xc5)(内圈)
Ⅵ 跳转第Ⅳ步,发送数据第二个八位--延时--片选拉高(内圈)

片选拉低--亮度设置(0x8a太亮刺眼)--片选拉高,设置亮度
图11 亮度设置命令格式
 
这样就可以在第三个数碼管字形编码表中循环显示A-Z啦!(具体循环过程看main.c中的代码)
那么地址增加模式就更容易咯,0xc4传完外圈数据后不必拉高STB,继续传输内圈數据会自动存放在0xc5中,再进行26次循环即可具体可见main.c中注释掉的部分。
至此利用STM32F1的SPI驱动TM1629A的实验已经完毕虽然实验过程不复杂也不难,泹是对于小白的我还是花了几天时间研究在这里感谢我的领导给我安排这个实验练手,真的确实很能锻炼自己的能力同时也要感谢前輩的悉心教导,有时中午他都放弃午休时间来帮我解答问题代码中0-9,A-Z的段位显示全部都是我自己一个一个画出来的整个实验过程挺折騰,请尊重原创故转载请标明本人原作,谢谢大家
希望我们的嵌入式学习都能更上一层楼!

我要回帖

更多关于 数码管字形编码表 的文章

 

随机推荐