一、理论部分
共阳数码管引脚可以分为两个部分,一是段码,一个是位码。段码指的是一个数码管的7个段加dp小数点,一共8个,通过P0控制其亮灭使得数码管显示出不同效果。譬如亮afedcg表示的是6形状。位码指的多个数码管显示的时候,你要让哪个数码管显示,设定对应的公共端的值,简单讲位码指的是亮哪个数码管,其由P0控制。
通过查询原理图,可知Y7C和Y6C分别控制段码和位码,而Y7C和Y6C控制方法和LED灯相似。
由于数码管段码只给出了8个引脚,也就是说,只能同一时让八个数码管通过这8个引脚获得相同的信号,显示相同内容。那么如何让数码管显示不同内容?这就引进了动态数码管显示:我们要使用3个数码管显示123,只需要在第一个管显示完1立刻切换到下一个管让其显示2,这样不停的在三个管中显示123,又由于人的视觉暂停作用,就可以使人看到多个数码管同时显示不同内容的效果。
编写思路:P2高三位置为110->P0输出数码管位置->P2高三位置为111->P0输出显示内容
静态显示:直接调用显示
动态显示:切换不同数码管,显示不同内容,封装成函数后放进主循环不断扫描
二、程序案例
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~F、'-'、'.'。
void Delay(unsigned int t) //延时函数
{
while (t--);
while (t--);
}
/*****************************************************************
*@Function: SelecHC573 //
*@Description: 切换锁存器 //
*@Input: channel 切换的锁存器序号//
*@Output: 无//
*@Return: 无 //
*@Others: 无 //
/*****************************************************************/
void SelecHC573(unsigned char channel)
{
switch(channel)
{
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;
}
}
/*****************************************************************
*@Function: DisplaySMG_Bit//
*@Description: 数码管显示 //
*@Input: dat 数码管显示的数据(段码表)//
* pos 数码管的位置0-7//
*@Output: 无//
*@Return: 无 //
*@Others: 无 //
/*****************************************************************/
void DisplaySMG_Bit(unsigned char dat,unsigned pos)
{
SelecHC573(6);//数码管的位置
P0=0x01<<pos;
SelecHC573(7);//数码管的内容
P0=dat;
}
/*****************************************************************
*@Function: DelaySMG //
*@Description: 延时函数 //
*@Input: t 用于延时递减//
*@Output: 无//
*@Return: 无//
*@Others: 无//
/*****************************************************************/
void DelaySMG(unsigned int t)
{
while(t--);
}
void Delay(unsigned int t)
{
while(t--)
{
Display_Dynamic();//延时时放置数码管暂停显示
}
}
/*****************************************************************
*@Function: Display_Dynamic //
*@Description: 切换数码管,使其显示“2018--月份” //
*@Input: 无//
*@Output: 无//
*@Return: //
*@Others: //
/*****************************************************************/
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[month/10],6);
DelaySMG(500);
DisplaySMG_Bit(SMG_duanma[month%10],7);
DelaySMG(500);
}
在主函数将Display_Dynamic放置while循环不断扫描即可
通过断码表可以便捷输入内容,不用每次都计算。
感谢大家的观看
欢迎大家提出问题并指正~