一、训练任务
在CT107D单片机综合训练平台上,8个数码管分别依次显示0-9的值,然后所有数码管一起同时显示0-F的值,如此往复
二、训练重点
1.弄清楚数码管的段码与显示数值之间关系。
2.供养数码管的基本控制方法,特别是弄清楚COM端与显示码的关系
三、训练准备
3.1 原理图展示
3.2 数字对照表
3.3 数码管分路
3.4 一些解释
位码:8个大的数码管(com)
段码:一个数码一个个小段(a-h)
com输入:高电平
段码输入:低电平
即可闪亮
Y6控制位码
Y7控制段码
消影与重影
重影:IO口从高电平到低电平,有一定的残留的电流在里面。
在数码管动态显示实验中,每次送完段选数据后,在送入位选数据之前,需要一句
“P0 = 0xff” ,这条语句的专业名称叫做“消影”
解释如下:
在刚送完段选数据后,P0口仍然保持着上次的段选数据,若不加“P0 = 0xff”这句话,再执行接下来的打开位锁存器命令后,原来保持在P0口的段选数据将立即通过位选锁存器直接加在数码管上,接下来才是再次通过P0口给位选锁存器送入位选数据,虽然这个过程非常短暂,但是在数码管高速显示状态下,我们仍然可以看到数码管出现显示混乱的现象,加上消影之后,在开启位锁存器后,P0口数据全为高电平,所以哪个数码管都不会亮,因此这个消影的动作是很重要的
四、代码实现
#include <reg52.h> typedef unsigned int uint; typedef unsigned char uchar; uchar code SMG_duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90, 0x88,0x80,0xc6,0xc0,0x86,0x8e, 0xbf,0x7f};//分别是0-9(对应下标),A-F,“-”,“.” //配置HC138 void InitHC138(uchar n) { switch(n) { case 4: P2 = (P2 & 0X1F) | 0X80; break; case 5: P2 = (P2 & 0X1F) | 0Xa0; break; case 6: P2 = (P2 & 0X1F) | 0Xc0; break; case 7: P2 = (P2 & 0X1F) | 0Xe0; break; } } //延时 void Delay(unsigned int n) { while(n--); while(n--); } void ShowSMG_Bit(unsigned pos, uchar dat) { InitHC138(6); //数码管的位置 P0 = 0x01 << pos; InitHC138(7); //数码管的内容 //Delay(100000000); //Delay(80000); P0 = SMG_duanma[dat]; Delay(6000); Delay(6000); //P0 = 0xff;// 消影 } void SMG_Static() { uchar i,j; for(i = 0; i < 8; i++) { for(j = 0; j < 10; j++) { ShowSMG_Bit(i,j); } //Delay(600000); //Delay(600000); } } void Initsys() { InitHC138(5); P0 = 0X00; InitHC138(4); P0 = 0XFF; } void main() { while(1) { Initsys(); SMG_Static(); } }
注意事项!!!
延时必须unsigned int