单片机学习——数码管的动态显示(自用)
基础知识:静态和动态的区别
一般来说,静态是由一个P0口控制多个com口,所以显示的都是P0端输出的内容

如果要实现不同com口输出不同的数值,则分别用不同的IO口控制输入

这样的方法占用了多个IO口资源,为了解决这个问题,引入了动态显示,即所有com口由一个P0口控制,既能显示不同的数值又能节省IO口资源。
动态显示的实质就是轮流点亮单个数码管实现多位数码管整体显示的效果。
训练目标:
在8位数码管中,前面四位显示年份“2018”,后面四位显示“--月份”,从一月份开始,每隔一段时间增加一个月,到十二月之后又从一月开始递增。
软件部分:
#include "reg52.h"
unsigned char yue=1;
unsigned char 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 - .)
void InitHC138(unsigned char n)
{
switch(n) //选择工作的锁存器
{
case 4:
P2=(P2 & 0x1f) | 0x80; //0x1f为00011111
break; //&是为了给前三项清零
case 5: //|为了输入二进制数
P2=(P2 & 0x1f) | 0xa0;
break;
case 6:
P2=(P2 & 0x1f) | 0xc0;
break;
case 7:
P2=(P2 & 0x1f) | 0xe0;
break;
}
}
void DisplaySMG_Bit(unsigned char value,unsigned char pos)//点亮的数值与位置
{
InitHC138(6); //选择控制位置的寄存器
P0=0x01<<pos; //调整亮的位置
InitHC138(7); //选择控制数字的寄存器
P0=value; //选择输入的数字(数字由16位段码控制)
}
void delaySMG(unsigned int t)
{
while(t--);
}//数码管显示专用的delay函数
void Display_Dynamic()
{
DisplaySMG_Bit(SMG_duanma[2],0);
delaySMG(500);
DisplaySMG_Bit(SMG_duanma[0],1);
delaySMG(500);
DisplaySMG_Bit(SMG_duanma[1],2);
delaySMG(500);
DisplaySMG_Bit(SMG_duanma[8],3);
delaySMG(500);
DisplaySMG_Bit(SMG_duanma[16],4);
delaySMG(500);
DisplaySMG_Bit(SMG_duanma[16],5); //以上为固定输入
delaySMG(500);
DisplaySMG_Bit(SMG_duanma[yue/10],6);
delaySMG(500);
DisplaySMG_Bit(SMG_duanma[yue%10],7);
delaySMG(500);
} //对各个位置数码管的输入分别实现动态控制
void delay(unsigned char t)
{
while(t--);
Display_Dynamic(); //还不懂为什么要在delay函数里添加动态显示函数
}
void main()
{
while(1)
{
Display_Dynamic();
yue++;
if(yue>12)
{
yue=1;
}
delay(100);
}
}
相比静态,main函数中多了一个控制两位显示月份的for循环