怎样只显示动态数码管的有效位??高位零不显示。。。

2019-07-15 16:06发布

#include <reg52.h>

sbit ADD0 = P2^0;
sbit ADD1 = P2^1;
sbit ADD2 = P2^2;


typedef unsigned char uint8;
typedef unsigned int  uint16;
typedef unsigned long uint32;

uint8 code ledchar[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint8 shuchar[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

uint8 i;
uint16 ci;                
uint32 shu;       


void main()
{
EA=1;
TMOD=0x01;
TH0=0xFC;
TL0=0x67;
ET0=1;
TR0=1;


while(1)
{
   if(ci>=1000)
   {
    ci=0;
    shu++;
        shuchar[0]=ledchar[shu%10];
        shuchar[1]=ledchar[shu/10%10];
        shuchar[2]=ledchar[shu/100%10];
        shuchar[3]=ledchar[shu/1000%10];
        shuchar[4]=ledchar[shu/10000%10];
        shuchar[5]=ledchar[shu/10000%10];
   }
}
}


void Interrupttimer0() interrupt 1
{
      TH0=0xFC;
      TL0=0x67;
          ci++;
      P0=0xFF;
           switch(i)
           {
                 case 0:ADD0=1;ADD1=1;ADD2=1;i++;P0=shuchar[0];break;
                 case 1:ADD0=0;ADD1=1;ADD2=1;i++;P0=shuchar[1];break;
                 case 2:ADD0=1;ADD1=0;ADD2=1;i++;P0=shuchar[2];break;
                 case 3:ADD0=0;ADD1=0;ADD2=1;i++;P0=shuchar[3];break;
                 case 4:ADD0=1;ADD1=1;ADD2=0;i++;P0=shuchar[4];break;
                 case 5:ADD0=0;ADD1=1;ADD2=0;i=0;P0=shuchar[5];break;
                 default:break;
       
           }

}       

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
无量寿经
1楼-- · 2019-07-15 17:50
以下内容来源于《51单片机轻松入门-基于STC15W4K系列》例12.5  动态显示的秒计数器(整数有效数值前面的0消隐)在例12.4的数据显示过程中,整数有效数值前面的0都会被点亮,通常是不符合实际使用要求的,本例中判断整数有效位前数值是否为0,若位0则让段码输出口输出0xFF,使对应位数码管不显示,本例只能对整数有效数值前面的0消隐,小数有效数值前面的0消隐将在12章“精密电压表通用显示器计数器制作”部分展示完整产品的实例,本例在上例的基础上主要增加了如下代码。#define     Hidden  16  // 高位消隐码在数据表中的位置,DispTab[15]=0xffvoid DataProcessing()            // 数据处理函数{  unsigned char tmp[6];        // 最高位tmp[5],最低位 tmp[0]  tmp[0] = sec%10;             // 16进制转BCD码(个位)  tmp[1] = sec/10%10;          // 16进制转BCD码(十位)  tmp[2] = sec/100%10;         // 16进制转BCD码(百位)  tmp[3] = sec/1000%10;        // 16进制转BCD码(千位)  tmp[4] = sec/10000%10;       // 16进制转BCD码(万位)  tmp[5] = sec/100000%10;      // 16进制转BCD码(十万位)      if (tmp[5]==0)  DispBuf[5] = Hidden;                           // 十万位消隐      else    DispBuf[5]= tmp[5];     if ((tmp[5]==0)&&(tmp[4]==0))DispBuf[4]= Hidden;               // 万位消隐      else    DispBuf[4]= tmp[4];     if((tmp[5]==0)&&(tmp[4]==0)&&(tmp[3]==0)) DispBuf[3]= Hidden;  // 千位消隐      else    DispBuf[3]= tmp[3];     if((tmp[5]==0)&&(tmp[4]==0)&&(tmp[3]==0)&&(tmp[2]==0))DispBuf[2]= Hidden; //百位消隐      else    DispBuf[2]= tmp[2];     if((tmp[5]==0)&&(tmp[4]==0)&&(tmp[3]==0)&&(tmp[2]==0)&&(tmp[1]==0))DispBuf[1]= Hidden;    // 十位消隐      else    DispBuf[1] = tmp[1];      DispBuf[0] = tmp[0];             // 最低位显示} 12.3  独立键盘


阿累苏磊
2楼-- · 2019-07-15 22:02
 精彩回答 2  元偷偷看……
waistory
3楼-- · 2019-07-16 03:41
#include <reg52.h>

sbit ADD0 = P2^0;
sbit ADD1 = P2^1;
sbit ADD2 = P2^2;


typedef unsigned char uint8;
typedef unsigned int  uint16;
typedef unsigned long uint32;

uint8 code ledchar[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uint8 shuchar[6]={0xFF,0xFF,0xFF,0xFF,0xFF,0xFF};

uint8 i;
uint16 ci;                 
uint32 shu;        


void main()
{
  char i;
  uint8 buf[6];//中间转换缓冲区


  EA=1;
  TMOD=0x01;
  TH0=0xFC;
  TL0=0x67;
  ET0=1;
  TR0=1;


while(1)
{  
    if(ci>=1000)
   {
       ci=0;
       shu++;
       buf[0] = sec%10;
       buf[1] = sec/10%10;
       buf[2] = sec/100%10;
       buf[3] = sec/1000%10;
       buf[4] = sec/10000%10;
       buf[5] = sec/100000%10;     
      
       for(i=5;i>=1;i--)  //从最高为开始,遇到0不显示,遇到非0退出循环
       {
           if(buf[i] == 0)
                shuchar[i] = 0xFF;
           else
                break;
        }

         //将剩余的有效数字位如实转换  
        for( ;i>=0;i--)  /for()起始未对j操作,j即保持上个循环结束时的值
        {
             shuchar[i] =ledchar[buf[i]];
         }
   
   }
}
void InterruptTimer0() interrupt 1
{
      TH0=0xFC;
      TL0=0x67;
          ci++;
      P0=0xFF;
           switch(i)
           {
                 case 0:ADD0=1;ADD1=1;ADD2=1;i++;P0=shuchar[0];break;
                 case 1:ADD0=0;ADD1=1;ADD2=1;i++;P0=shuchar[1];break;
                 case 2:ADD0=1;ADD1=0;ADD2=1;i++;P0=shuchar[2];break;
                 case 3:ADD0=0;ADD1=0;ADD2=1;i++;P0=shuchar[3];break;
                 case 4:ADD0=1;ADD1=1;ADD2=0;i++;P0=shuchar[4];break;
                 case 5:ADD0=0;ADD1=1;ADD2=0;i=0;P0=shuchar[5];break;
                 default:break;
        
           }
daihao0729
4楼-- · 2019-07-16 09:14
谢谢
还是蛮有用的
daihao0729
5楼-- · 2019-07-16 12:07
谢谢
还是蛮有用的
【Certain】
6楼-- · 2019-07-16 17:51
阿累苏磊 发表于 2015-9-22 14:58
#include

sbit ADD0 = P2^0;

这是错误的

一周热门 更多>