打印

看到一个很方便的4位数码管显示函数!

[复制链接]
1964|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
lacfg|  楼主 | 2013-7-6 10:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   可实现位闪烁,无效零是否显示功能。
#define SMG_LAST_TIME        10
#define SMG_FLASH_TIME        100

typedef struct Smg_Ele
{
        unsigned Bit0_Flash                                :1;
        unsigned Bit1_Flash                                :1;
        unsigned Bit2_Flash                                :1;
        unsigned Bit3_Flash                                :1;
        unsigned InvalidZero_NoDis                :1;
        unsigned int *Num                                  ;
}Smg_Element;

Smg_Element Smg1={1,1,0,0,0,&Smg_Num};

void SmgDisplay(Smg_Element Smg_Temp)
{
        static unsigned char Turn_Scan=0,Num_Scan=0,Temp[4];
        static bit Zero_Valid;
        switch(Turn_Scan)
        {               
                case 0*SMG_LAST_TIME:
                        PORTD=0;
                        U5A=0;
                        U5B=0;
                        U5C=0;
                        if(Smg_Temp.Bit3_Flash==0)
                                Temp[3]=LED[*Smg_Temp.Num/1000];
                        else
                        {
                                if((Num_Scan%SMG_FLASH_TIME==0)&&(Num_Scan!=0))
                                {
                                        if(Temp[3]!=0)
                                                Temp[3]=0;
                                        else
                                                Temp[3]=LED[*Smg_Temp.Num/1000];
                                }
                        }
                        if(Smg_Temp.InvalidZero_NoDis)
                        {
                                Zero_Valid=0;
                                if(Temp[3]==LED[0])
                                {
                                        Temp[3]=0;
                                }
                                else
                                {
                                        Zero_Valid=1;
                                }
                        }                       
                        PORTD=Temp[3];
                        Turn_Scan++;                               
                        break;
                       
                       
                       
                case 1*SMG_LAST_TIME:
                        PORTD=0;
                        U5A=1;
                        U5B=0;
                        U5C=0;
                        if(Smg_Temp.Bit2_Flash==0)
                                Temp[2]=LED[*Smg_Temp.Num%1000/100];
                        else
                        {
                                if((Num_Scan%SMG_FLASH_TIME==0)&&(Num_Scan!=0))
                                {
                                        if(Temp[2]!=0)
                                                Temp[2]=0;
                                        else
                                                Temp[2]=LED[*Smg_Temp.Num%1000/100];
                                }
                        }
                        if(Smg_Temp.InvalidZero_NoDis)
                        {
                                if(Temp[2]==LED[0])
                                {
                                        if(Zero_Valid)
                                        {
                                                Temp[2]=LED[0];
                                        }
                                        else
                                        {
                                                Temp[2]=0;
                                        }
                                }
                                else
                                {
                                        Zero_Valid=1;
                                }               
                        }                               
                        PORTD=Temp[2];
                        Turn_Scan++;                               
                        break;
                       
                       
                       
                case 2*SMG_LAST_TIME:
                        PORTD=0;
                        U5A=0;
                        U5B=1;
                        U5C=0;
                        if(Smg_Temp.Bit1_Flash==0)
                                Temp[1]=LED[*Smg_Temp.Num%100/10];
                        else
                        {
                                if((Num_Scan%SMG_FLASH_TIME==0)&&(Num_Scan!=0))
                                {
                                        if(Temp[1]!=0)
                                                Temp[1]=0;
                                        else
                                                Temp[1]=LED[*Smg_Temp.Num%100/10];
                                }
                        }
                        if(Smg_Temp.InvalidZero_NoDis)
                        {
                                if(Temp[1]==LED[0])
                                {
                                        if(Zero_Valid)
                                        {
                                                Temp[1]=LED[0];
                                        }
                                        else
                                        {
                                                Temp[1]=0;
                                        }
                                }
                                else
                                {
                                        Zero_Valid=1;
                                }
                        }                       
                        PORTD=Temp[1];
                        Turn_Scan++;
                        break;
                       
                       
                       
                case 3*SMG_LAST_TIME:                               
                        PORTD=0;
                        U5A=1;
                        U5B=1;
                        U5C=0;
                        if(Smg_Temp.Bit0_Flash==0)
                                Temp[0]=LED[*Smg_Temp.Num%10];
                        else
                        {
                                if((Num_Scan%SMG_FLASH_TIME==0)&&(Num_Scan!=0))
                                {
                                        if(Temp[0]!=0)
                                                Temp[0]=0;
                                        else
                                                Temp[0]=LED[*Smg_Temp.Num%10];
                                }
                        }       
                        if(Smg_Temp.InvalidZero_NoDis)
                        {
                                if(Temp[0]==LED[0])
                                {
                                        if(Zero_Valid)
                                        {
                                                Temp[0]=LED[0];
                                        }
                                        else
                                        {
                                                Temp[0]=0;
                                        }
                                }
                                else
                                {
                                        Zero_Valid=1;
                                }
                        }                       
                        PORTD=Temp[0];
                        Turn_Scan++;
                        break;
                       
                       
                default:
                        Turn_Scan++;
                        if(Turn_Scan==4*SMG_LAST_TIME)
                        {
                                Num_Scan++;
                                Turn_Scan=0;
                        }                                       
                        break;

        }
}

相关帖子

沙发
通宵敲代码| | 2013-7-6 11:00 | 只看该作者
专用函数库的封装,不错不错,学习了。

使用特权

评论回复
板凳
liu0000feng| | 2013-7-8 10:28 | 只看该作者
嗯,对我很有用的程序。

使用特权

评论回复
地板
coody| | 2013-7-8 10:42 | 只看该作者
简单功能复杂化了哦

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

15

帖子

1

粉丝