数码管显示问题 最后一位有阴影

[复制链接]
2997|3
 楼主| 木子不二 发表于 2013-5-28 22:38 | 显示全部楼层 |阅读模式
写了个多功能数码管函数。可以任意显示多少位,从哪位开始显示,以及小数点显示。
假设我显示 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;
    }
  }
}

很奇怪,有木有高手解释下。。。。
ayb_ice 发表于 2013-5-29 07:50 | 显示全部楼层
这种数码管显示最好用中断驱动,而且也就几句而已,这个函数显示不适合中断,太长
airwill 发表于 2013-5-29 16:14 | 显示全部楼层
多位扫描方式.
阴影总是刷新做得不好, 或关闭显示的时候没有关死 引起的.
有软件的问题, 也有硬件的因素

评分

参与人数 1威望 +1 收起 理由
木子不二 + 1 赞一个!

查看全部评分

 楼主| 木子不二 发表于 2013-5-31 10:14 | 显示全部楼层
case4后没关位选,找到问题了最后一位显示过后没有关位选,所以最后一位显示的时间过长。
程序长是功能有点多啊
您需要登录后才可以回帖 登录 | 注册

本版积分规则

36

主题

306

帖子

6

粉丝
快速回复 在线客服 返回列表 返回顶部