打印

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

[复制链接]
2733|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

粉丝