微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 做个简单的数码显示,最后一位数据在其他为都以阴影出现

做个简单的数码显示,最后一位数据在其他为都以阴影出现

时间:10-02 整理:3721RD 点击:
写了个多功能数码管函数。可以任意显示多少位,从哪位开始显示,以及小数点显示。
假设我显示 5163,可是调试时一切正常,全速运行时,板子上的8位数码
管显示前四位5163 正确,可是所有的位都有3的阴影显示,单步看得时候也没有阴影。
/*******************************************************************************
* Function Name  : void Display(int data,int position,int bit,int point)
* Description    : 数码管动态显示数据
* Input          : int data 要显示的数据        int bit  显示的位数  
                   position 数据开始显示的位置 char point小数点位置
* Output         : None
* Return         : None
*******************************************************************************/
void Display(int data,int position,int bit,int point)
{
  char i, j;
  char Tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
  struct Posi                    //分解的数据
  {
    char kb;
    char hun;
    char de;
    char te;
  }P1;
  P1.kb  = data/1000;
  P1.hun = data/100%10;
  P1.de  = data/10%10;
  P1.te  = data%10;
  j = position;
  Display_Clear();
  for(i=0;i<bit;i++)
  { Display_Clear();   
    P4OUT = 0xff;           //关闭位选
    Pos_EN;
    Pos_DS;
    switch(j)  //j 数据开始显示的位置
    {
    case 0: break;
    case 1: if(point == j)
            {
              P4OUT = Tab[P1.kb]| 0x80;    //显示千位
            }
            else
            {
              P4OUT = Tab[P1.kb];
            }        
            Seg_EN;                     //段 使能
            Seg_DS;                       
            P4OUT =~(0x01<<j-1);
            Pos_EN;
            Pos_DS;                     //位 使能                     
            Delay(2);break;
    case 2: if(point == j)
            {
              P4OUT = Tab[P1.hun]| 0x80;    //显示白位
            }
            else
            {
              P4OUT = Tab[P1.hun];
            }                        
            Seg_EN;                         //段 使能
            Seg_DS;
            P4OUT = ~(0x01<<j-1);
            Pos_EN;
            Pos_DS;                     //位 使能
            Delay(2); break;
    case 3: if(point == j)
            {
              P4OUT = Tab[P1.de]| 0x80;
            }
            else
            {
              P4OUT = Tab[P1.de];       //显示十位
            }        
            Seg_EN;                      //段 使能
            Seg_DS;                       //位 使能
            P4OUT = ~(0x01<<j-1);
            Pos_EN;
            Pos_DS;                           
            Delay(2); break;
    case 4: if(point == j)
            {
              P4OUT = Tab[P1.te]| 0x80;//显示个位
            }
            else
            {
              P4OUT = Tab[P1.te];
            }
            Seg_EN;                     //段 使能
            Seg_DS;                       //位 使能
            P4OUT = ~(0x01<<j-1);
            Pos_EN;
            Pos_DS;                       
            Delay(2);break;
    default : break;      
    }
    if(j<position+bit)
    {
      j++;
    }
    else
    {
      j=0;
    }
  }
}
很奇怪,有木有高手解释下。

最好加个清除显示的语句,不然他最后跳出这个显示函数的时候,锁存器的锁存端还是3,这可能是造成阴影的原因吧

在显示的最后一条加一条消隐语句,就可以解决。P4OUT = 0xff;

上一篇:1602液晶程序
下一篇:LED点阵显示时钟

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top