本帖最后由 junying 于 2018-10-23 23:05 编辑
MSP-LAB实训-GPIO高级输出之1.3:四位扫描数码管
实验要求: 1、使用MSP-LAB实验系统的四位扫描数码管,实现0x0000~0xFFFF的自增一显示程序。
题意分析及设计: 1、根据相关原理图(图1所示)得知,每位七段数码管由a、b、。。。g、dp等八个管脚组成,四位数码管存在4个公共位选择线。我们系统中采用的是共阴的四位数码管,当我们需要在某位数码管显示时,需要让该位公共位选择线为‘0’,而a、b、...、g、dp等对应线按照所需显示的数值的图形,正确输出对应的数值。而为了四位全部显示,则需要根据人眼的视觉暂留现象,以25Hz以上的频率(或者说不长于40ms的一个周期内)轮流显示四位数码管的值。因此本题的设计需要考虑如下几个要素的设计: (1) 扫描输出的设计; (2) 每位数码管显示的字库设计;
2、字库的设计: (1) 因为每位数码管的显示字库相同,因此仅需针对一个数码管进行字库设计; (2) 系统采用共阴数码管,即需要显示的字段,输出为‘1’,否则为‘0’; (3) 一个数码管可以显示0~9、A~F等16个不同图形,因此设计一个字库类型为unsigned char DispLib[16];数组中每个元素的下标为需要显示的值,而元素内容为图形所对应管脚的值。假设我们的硬件连线为字段a对应Px的最低位,字段g对应Px的第7位,dp对应最高位,则字库设计如图2、图3、图4所示。
即最后得到的字库如图5所示。
3、扫描机制设计: (1) 为了让显示非常稳定,没有闪烁感,本题设计刷新频率为50Hz,即一个周期为20ms。那么四位数码管,每位显示持续时间为5ms。系统中需要设计一个5ms的Timer中断,来控制刷新机制; (2) 为了统一显示机制,本题设计一个帧缓存,即四位数码管的显示缓存寄存器DispBuf。系统刷新时(中断发生时),只针对DispBuf的内容,正确输出到驱动a、b、。。。、g、dp的管脚上。而应用程序需要将显示的内容,写入到DispBuf即可。本题中,仅实现一个四位数码管的显示,因此DispBuf设计为unsigned char DispBuf[4];其每个元素代码每位数码管的实际显示输出值。 4、为了依次显示0x0000~0xFFFF,系统中需要设计一个定时累加的机制。为了共用Timer中断,我们在Timer中断**程序做一个全局变量Ticks的累加,当累加到20时,即持续了100ms。在应用程序中设计每100ms,显示值自加一操作。
硬件连接: 1、P1.0~P1.6、P1.7分别连接J11的A、B、。。。、G、DP,共八根连线; 2、J8的LE管脚与3V3相连; 3、P2.0~P2.3分别与J5的E0~E3的数码管位选择线直接连接; 4、上述连接完成后,则P1控制每位数码管的具体显示图形,P2控制数码管位选择线;
程序设计: 1、如图6所示,设置Grace的TimerA为5ms中断;Grace中再设置好P1、P2的对应输出管脚,生成相关代码。
2、如图7所示,在CCS中定义DispLib(字库)、BitDisp(位选择)、BitCnt、Ticks等全局变量,定义帧存DispBuf全局变量以及写帧存的函数WriteDispBuf();
3、如图8所示,在Timer中断**程序中,将帧存DispBuf的内容与位选择BitDisp组合构成扫描输出到P1、P2。并在做好Ticks处理。
4、如图9所示,在main主循环中,设计一个val自增一操作,并进行写帧存动作。
实验结果: 1、连线图如图10所示;
2、实验动态效果如视频“例程1.3.mp4”所示。查看:https://weibo.com/1404637705/GFih4sBPV
原文链接:https://weibo.com/1404637705/GFigCqeDg
|