100字范文,内容丰富有趣,生活中的好帮手!
100字范文 > [蓝桥杯单片机]学习笔记——共阳数码管的静态与动态显示

[蓝桥杯单片机]学习笔记——共阳数码管的静态与动态显示

时间:2023-06-29 21:01:52

相关推荐

[蓝桥杯单片机]学习笔记——共阳数码管的静态与动态显示

一、理论部分

共阳数码管引脚可以分为两个部分,一是段码,一个是位码。段码指的是一个数码管的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: 切换数码管,使其显示“--月份” //*@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循环不断扫描即可

通过断码表可以便捷输入内容,不用每次都计算。

感谢大家的观看

欢迎大家提出问题并指正~

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。