设计与开发

单片机字库 一文教你全面透彻使用MAX7219驱动8位LED数码管

小编 2024-11-24 设计与开发 23 0

一文教你全面透彻使用MAX7219驱动8位LED数码管

Hello,大家好,今天我们来讨论一下老掉牙但应用广泛的MAX7219(咱已然立誓,不是老掉牙的芯片坚决不讨论,哈哈,不要打我),它是一款可以驱动多位LED的芯片,已出版图书《显示器件应用分析精粹:从芯片架构到驱动程序设计》(以下简称“显示器件”)中也有详细介绍,本文主要结合仿真工具以另一种图文方式展现其工作效果,这样即便你并没有购买《显示器件》一书,也有机会窥探其工作原理。当然,图书的组织更讲究体系的完整,涉及的知识面相对较广而深,文章则以形象易读为要,所以图片相对会更多。另外,本文不涉及具体控制时序及代码相关的话题,我想也很少有人会在手机上看那么大段的代码,有兴趣可参考《显示器件》一书。

MAX7219的硬件连接比较简单,除用于驱动LED的16个引脚外,ISET引脚可以设置LED的驱动电流值(因为MAX7219是恒流驱动形式)。也就是说,你只需要额外添加一个外围电阻即可使MAX7219正常工作,《显示器件》给出的电路类似如下图所示。需要特别注意的是,

MAX7219只能驱动共阴(common-cathode) 类型的数码管。

那怎么样才能让MAX7219驱动数码管显示想要的数据呢?几乎所有LED驱动芯片是相似的,我们肯定需要往芯片的某个存储区域写入一些数据 。首先我们来明确单片机是如何控制MAX7219的,它是由时钟(CLK)、数据(DIN)、载入(LOAD)这3个引脚完成的串行通信来实现,每次传输16位数据(高位先行),相应的格式如下图所示。

可以看到,给MAX7219发送的16位数据中,低8位是具体的数据(DATA),而高8位为相应的地址(ADDRESS,仅低4位有效),所以其有效的寄存器最多只有16个(8位寄存器),所以我们接下来需要明确这16个寄存器各自的功能是什么。

MAX7219内部存在14个寄存器(2个地址无效),总体来说可以分为数据寄存器控制寄存器 ,前者决定LED数码管可以显示的内容(简单地说,你往里面写什么,LED数码管就会显示什么),后者则决定LED如何显示内容,具体如下图所示。

Digit0~~Digit7(地址为0x1~0x8,写成0xX1~0xX8是因为仅低4位有效)这8个寄存器分别对应多位数码管的每一位数字,在上面的仿真电路图中,Digit0对应最左侧位,Digit1对应左侧第二位,其它依此类推,下面为显示数字0~7的仿真效果。

现在的问题是:怎么样才能显示出这样的效果呢?往数据寄存器中写入BCD码还是字型码(代表每个段亮灭的数据)呢?这取决于译码模式Decode Mode )寄存器,它的每一位(共8位)可以控制相应数据寄存器的译码模式,具体如下表所示。

例如,当设置译码模式寄存器的D0位为1时,表示Digit0数据寄存器中的数据会经过译码后驱动LED数码管(而不是直接输出),这样如果你需要最左侧显示“0”,则只需要往Digit0数据寄存器中写入0的BCD码即可(也就是0),具体的译码表如下所示。

如果你选择不译码,数据寄存器中的数据会直接输出以驱动LED数码管的每个段,那么同样显示数字“0”就得往相应的数据寄存器中写入0b1111110(0x7E)。也就是说,译码模式对于LED数码管非常方便,但是只能显示约定好的某些特定字符,对于需要驱动LED点阵模块的场合,通常还是会选择不译码

当然,上面这个译码表成立的前提条件是,你必须按照预定义的连接方式将MAX7219与LED数码管连接,MAX7219约定的段与数据位的对应关系如下图所示,前面的仿真电路图也遵从此约定,这样可以避免将简单的问题复杂化。

需要注意的是,当你使用译码模式时,数据寄存器仅使用到了低4位,而最高位对应小数点控制位(1为亮,0为灭),下图是已经往Digit3与Digit4数据寄存器的最高位写入的1后的显示效果。

MAX7219还可以控制扫描的数码管位数,这是由扫描限制(Scan-Limit) 寄存器完成的。与译码模式控制寄存器有限不同的是,你需要往其中输入限制位数的BCD码(而并非每一位数据寄存器对应控制扫描与否,这也就意味着,扫描位数只能是连续的,你不能异想天开地只企图扫描第1、3、5位)。例如,当你往其中写入0时,表示仅扫描第0位对应的数码管(其它数码管不会亮,即便你已经往其中写入了数据),当你往其中写入4时,则表示第0、1、2、3、4位都会扫描,而5、6、7位不扫描(不会亮),相应的表格如图所示:

下图是限制扫描位数为4的显示效果。

当然,想要让MAX7219正常显示,显示测试(Display Test)关闭(Shutdown) 寄存器也必须得进行合理设置。显示测试寄存器主要用于测试,当其最低位为1时,表示进入测试模式,此时所有数码管都会亮起来(即显示8.8.8.8.8.8.8.8.),这样你就可以判断芯片驱动是否正常,数码管是否存在无法点亮的段等情况。在正常工作(Normal Operation)时,应该将其最低位置0,如下表所示:

关闭寄存器可以控制是否输出。在关闭模式下,MAX7219内部时钟源处于挂起状态,所有段驱动引脚(Seg A,B,C,…)都下拉到地,所有位选通引脚(DIG0~7)都上拉到电源,此时所有数码管都不会显示,具体如下表所示。

下图为限制低4位扫描时依次发送的数据。首先发送“F00 ”表示往显示测试寄存器(地址为0xF)中写入0,将最低位清零也就进入了正常工作模式。然后往译码模式寄存器(地址为0x9)中写入“9FF ”,表示进行全8位译码,因为我们驱动的是LED数码管。接下来的“B03 ”表示限制扫描位数为0、1、2、3,所以最右侧4位是不会显示的。

A0F ”通过往亮度(Intensity) 寄存器中写入数据以达到控制LED显示亮度的目的,本质上是通过控制PWM来实现的,受限于篇幅不再讨论,因为即便你不往其中写入数据,MAX7219也存在一个默认的亮度,有兴趣的读者可参考《显示器件》一书。

紧接着往关闭寄存器(地址为0xC)中发送“C01 ”,将最低位置1即可进入正常工作模式,此后,数据寄存器中的数据将会被显示出来。当然,到目前为止,我们还没有往数据寄存器中写入任何内容,本例中依次往地址0x1~0x8中写入0~7的BDC码即可,值得一提的是,Digit3与Digit4数据寄存器的最高位被置1,表示显示小数点,但由于前面已经限制了扫描位数,所以你只看得到一个小数点。

STM32入门实战:强大、好用的嵌入式编译器软件Keil uVision5

上一篇文章《STM32入门实战:工之利器,基础代码生成器CubeMX》中我们详细介绍了STM32CubeMX这款软件。该软件可以以图形化的操作方式,自动生成兼容多种编译器的基础代码。其中有一个选项是MDK-ARM,对应的就是Keil uVision5这个编译器。只要您的电脑安装配置好了这个编译软件之后,就可以直接打开生成的基础代码了,非常方便快捷。

而嵌入式的软件开发工具,用Keil和IAR的相对较多。两者相比呢,IAR的操作界面相对更简洁,Keil软件功能相对更强大一些。Keil支持ARM7、ARM9、以及Cortex系列内核的处理器。它还集成了Flash烧写模块,强大的设备仿真,性能分析等功能。在后续章节中,我们都将以Keil软件作为开发的平台。

Keil软件可以在KEIL的官网上下载:https://www.keil.com/download/product/ ,如下图所示:

KEIL5下载界面

需要注意的是,该软件不是免费软件,您需要得到Keil公司的授权才能正常使用。但是对于个人学习和研究来说,我们可以从网上其它渠道下载试用。软件本身的安装非常简单,照着提示点“Next”即可。和Keil4不同的是,Keil5需要单独安装芯片包,否则无法选择芯片类型,比如F1系列的芯片包名称一般是这样的:Keil.STM32F1xx_DFP.1.0.5。STM32芯片包Keil的官网下载地址是:http://www.keil.com/dd2/。但Keil官网的速度慢的出奇,我们还是从其它非官方网站下更好些。

全部安装好后打开主界面:

Keil uVision5主界面

左上栏是项目栏,以目录的形式显示出整个项目的应用文件、库文件、接口软件还有一些中间件。右上栏是文本编辑窗口,用来查看、编辑各个C、H文件。下边栏是编译信息栏,你的整个工程编译后,会把编译过程中的各种信息显示在下方。如果编译过程有错误,你就可以根据错误提示信息进行问题排查。

从上图可以看出,我们已经打开了用STM32CubeMX自动生成的一个工程初始文件。但在进行编译前,我们还需要对Keil的一些关键选项进行设置。

点击红圈处的"Options for Target..."按钮,弹出Options for Target...对话框,在Device选项卡中选择我们所使用的单片机型号,这里我们选择STM32F103C8。

Device选项卡

在Output选项卡中,如果你在调试程序的时候不需要每次都要搜索相关变量和函数的具体位置,你就可以把"Browse information"这个选项去掉,否则每次编译都要生成用户浏览信息的话,编译速度会慢的让你想砸电脑。

Ouput选项卡

Debug选项卡中,右上角的Use框中选择"ST-Link Debugger",这样你就可以用一个便宜又小巧的USB下载器下载和调试程序了。

Debug选项卡

ST-Link V2 USB下载器,小巧、便宜、好用

然后再点击Use框"ST-Link Debugger"后边的"Settings"按钮,弹出"Cotex_M Target Driver Setup"对话框。把上边红圈上的"Retset and Run"勾选上,这样你每次把程序下载到单片机,它就自动开始运行了。然后看下边"Programming Algorithm"编程算法里边有没有显示出对应的芯片类型,如果没有,Keil将无法将编译好的程序下载到单片机,此时您就需要点击下边的"Add"按钮添加对应的芯片型号。

"Cotex_M Target Driver Setup"对话框

以上所有选项都设置好了之后,您就可以点击左上角的"Build"按钮(或者按F7快捷键)编译我们的工程项目了。编译完之后,就可以看到最下边显示"0 Error(s),0 Warring(s)",说明编译成功,已经生成了可以在单片机中运行的二进制程序代码了。

编译工程项目

相关问答

51 单片机 如何实现汉字显示,如“龙”字,能否给程序和电路图?

方案一:含字库的液晶,单片机给出相应指令即可显示。效果最好,成本较高,程序量小,难度适中。方案二:点阵液晶或LED点阵,以16*16分辨率,用汉字取模软件取...方...

STC12C5204AD 单片机 -ZOL问答

STC系列的单片机都可以按照下面连接多余引脚不用管他。有用(0)回复reset键复位,编程复位有用(0)回复看了一下STC89C52的引脚图,很好的解决方案是...

STM32 单片机 可以用来做人机交互界面吗?

第二种方案利用stm32单片机自带的Fsmc接口驱动TFT彩屏,Fsmc原是stm32的一种存储并线接口,那用在彩屏驱动时,在硬件设计上就需要考虑布线等长,还要做防静电...总...

初学 单片机 需要准备哪些学习套件?

最好配一块单片机开发板学习。在单片机的学习过程中,切不可有以下错误认识:1、看完学习视频后,认为自己这部分已经...4、下载软件上面都没问题,就要把程序烧进...

5v1a开关电源给 单片机 供电,怎么做滤波整流?-ZOL问答

应该不用吧,一般开关电源都是直流输出的,如果要滤波的话,一般在电源输出前方并联个100uF或220uF的电容,接近单片机电源的地方(越靠近单片机越好)并个104的钽电容...

字库 电流与上盖电流区别?

字库电流和上盖电流是指液晶显示器背光模块中的两种不同类型的电流,其区别如下:字库电流:字库电流是指用于点阵字符显示的电流,它主要用于控制显示器中的字...

怎样才能成为 单片机 工程师?

一般来说,单片机属于硬件工程师的工作范畴。毕竟单片机驱动编程和电路设计是分不开,只有明白了单片机如何驱动才能设计出更为合理的电路产品。如果想更好的从...

单片机 按钮复位电路各元件的作用-ZOL问答

上电复位是为下载程序做准备的,单片机在在上电的前两个周期(由于电容电压不能突变,复位端为开始为高电平)检测是否有程序下载,如果前两个周期没有检测到程序下载...

大家编程都用什么编辑器?vim是程序员必学的吗?

摘要:在我认识的所有程序员里,每个人几乎都有专属于自己的常用工具和相关资源,今天给大家奉上数十个程序员硬核工具,我相信这里总有一款工具是属于你的!程...其...

单片机 51,出现按一次按键,得到多次按键的情况,怎么处理-ZOL问答

4条回答:【推荐答案】if(key==0){delayxms(15);//消除抖动if(key==0)//再次判断{while(key==0);//等待按键释放//这里添加按键按下释放后的执行

猜你喜欢