[讨论] 6位数码管有效位显示

奔跑小羊   2015-4-17 21:26 楼主
大神们,求救。
要实现数码管有效位显示,可是有残影 图片 002.jpg
如何修改程序的?

程序代码如下


#include

                                                               

sbit ADDR0 = P1^0;                                       //位地址声明

sbit ADDR1 = P1^1;

sbit ADDR2 = P1^2;

sbit ADDR3 = P1^3;

sbit ENLED = P1^4;

    //数码管显示字符转换表

unsigned char code LedChar[]={

    0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,

    0x80, 0x90, 0x88, 0x83, 0xC6, 0xA1, 0x86, 0x8E};

unsigned char LedBuff[6]={

               0XFF, 0XFF, 0XFF, 0XFF, 0XFF, 0XFF};          //显示缓冲区

  unsigned int cnt = 0;                  //记录T0中断次数

                          //动态扫描的索引



void main()

{

   unsigned long sec = 0;        //记录经过的秒数,赋初值



  EA = 1;

  ENLED = 0;      

  ADDR3 = 1;                    //使能U3

  TMOD = 0x01;

   TH0 = 0xFC;           //定时1ms

    TL0 = 0x00;

        TR0 = 1;                         //启动T0

         ET0 = 1;             //T0中断使能

  while(1)                        //主循环

   {         if(TF0 == 1)

        {   TF0 = 0;

                    TH0 = 0xfc;

                        TL0 = 0x67;

                        cnt++;

                 if(cnt >= 1000)

                {  cnt = 0;

                   sec++;

                 //        将sec按十进制从低到高提取并转为数码管显示符

                  LedBuff[0] = LedChar[sec%10];

                 ADDR2=0; ADDR1=0; ADDR0=0; P0 = LedBuff[0];

                 if(sec >= 10)

                 {

                          LedBuff[1] = LedChar[sec/10%10];

                          ADDR2=0; ADDR1=0; ADDR0=1; P0 = LedBuff[1];

                 }

                  else

                  { LedBuff[1] = 0xff; }

               

                 if(sec >= 100)

                  {

                          LedBuff[2]        = LedChar[sec/100%10];

                        ADDR2=0; ADDR1=1; ADDR0=0; P0 = LedBuff[2];

                  }

                   else

                   {

                             LedBuff[2] = 0xff;

                   }

                 if(sec >= 1000)       

                 {

                   LedBuff[3] = LedChar[sec/1000%10];       

                   ADDR2=0; ADDR1=1; ADDR0=1; P0 = LedBuff[3];

                 }       

                  else

                  {

                          LedBuff[3] = 0xff;

                  }

                  if(sec >= 10000)

                 {

                    LedBuff[4]        = LedChar[sec/10000%10];

                         ADDR2=1; ADDR1=0; ADDR0=0; P0 = LedBuff[4];

                 }

                 else

                 {

                         LedBuff[4] = 0xff;

                 }

                  if(sec >= 100000)

                  {

                          LedBuff[5]        = LedChar[sec/100000%10];

                          ADDR2=1; ADDR1=0; ADDR0=1; P0 = LedBuff[5];

                  }

                   else

                   {

                            LedBuff[5] = 0xff;

                   }

                     }

                 }

                 }

                 }







回复评论 (2)

扫描周期后加上短暂的全关断状态,“消隐”
点赞  2015-4-17 23:06
谢谢了,问题解决了。程序没有扫描到低位,在前面加上

if(sec >=0)

{

   LedBuff[0] = LedChar[sec%10];

ADDR2=0; ADDR1=0; ADDR0=0; P0 = LedBuff[0];

}

else

{

  LedBuff{0}= 0xff;

}




即可。
点赞  2015-4-19 14:38
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复