标题: 数码管如何显示负数 [打印本页]

作者: zhong2463    时间: 2018-10-11 14:25
标题: 数码管如何显示负数
附上数码管显示代码,请问如何修改代码。另数码管可以显示负数。谢谢
void Displaycountupnum(unsigned int num)
{
  signed int units,tens,hundreds;
  
  units = num%10;
  tens = (num/10)%10;
  hundreds = num/100;
  
  Send3byte_595_2(countupseg[hundreds],countupseg[tens],countupseg[units]);
  Out_595_2();
}



作者: 文凤轩    时间: 2018-10-11 14:48
建议说的再详细一点,把全部代码上传上来,只看到局部
作者: 月儿123    时间: 2018-10-11 15:50
数码管中的g一直显示
作者: willcome0    时间: 2018-10-11 15:52
如果要显示负数,首先函数的传参就不应该是个无符号整形
作者: zhong2463    时间: 2018-10-11 16:18
/*===============================================================*/
/*                     ????鼶??74LS595_2?????????????         */
/*===============================================================*/
#ifndef _LS595_2driver_H_
#define _LS595_2driver_H_

unsigned char flag_fu=0;  //???????????λ

sbit RCK_595_2 = P0^4;        //????鼶??595???????????
sbit DS_595_2 = P0^3;         //????鼶??595??????
sbit CLK_595_2 = P0^5;        //????鼶??595??λ???????

unsigned char code countupseg[] =                                                                                                                                  //?????595?ж???0~9??????????
{// 0         1          2           3        4         5          6           7        8         9
        0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F
};
unsigned char code roundseg[6]={0x01,0x02,0x04,0x08,0x10,0x20}; //??????

char code_func[]={0x98,0xbd,0xbf,0xd8};//E,r,-,C

/*???????  1ms???λ*/
void Delay_ms(unsigned int t)           //???????,t/ms
{
  unsigned int a,b;
  for(a=0;a<t;a++)
  {  
    for(b=0;b<100;b++)
    {
       _nop_();
    }
  }
}

/* ??1??LS595_2д??1?????*/
void Send1byte_595_2(unsigned char dat)   
{
  unsigned char i;

  for(i=0;i<8;i++)
  {   
        if(dat&0x80)
        DS_595_2 = 1;
        else
        DS_595_2 = 0;
        dat <<=1;
        CLK_595_2 = 0;
        _nop_();
        CLK_595_2 = 1;       
  }

}

/* ??3??????LS595_2д??3?????*/
void Send3byte_595_2(unsigned char dat1,unsigned char dat2,unsigned char dat3)
{
  Send1byte_595_2(dat1);
  Send1byte_595_2(dat2);
  Send1byte_595_2(dat3);
}

/*?????LS595???????????*/
void Out_595_2()
{
  RCK_595_2 = 0;
  _nop_();
  RCK_595_2 = 1;
}

/*???????? 3λ*/
void Displaycountupnum(unsigned int num)
{
  signed int units,tens,hundreds;
  
  units = num%10;
  tens = (num/10)%10;
  hundreds = num/100;
  

  Send3byte_595_2(countupseg[hundreds],countupseg[tens],countupseg[units]);        //??????????????????λ
  Out_595_2();

}
/*????????*/
void Displayround()
{
  unsigned char j;
  for(j=0;j<5;j++)
  {
    Send3byte_595_2(roundseg[j],roundseg[j],roundseg[j]);
        Out_595_2();
        Delay_ms(800);
  }
  
}
#endif  
作者: zhong2463    时间: 2018-10-11 16:18
文凤轩 发表于 2018-10-11 14:48
建议说的再详细一点,把全部代码上传上来,只看到局部

已经发了,请看
作者: zhong2463    时间: 2018-10-11 16:19
willcome0 发表于 2018-10-11 15:52
如果要显示负数,首先函数的传参就不应该是个无符号整形

是的,是我忽略了,
作者: 我爱8051    时间: 2018-10-11 16:31
可以预留一块数码管用来显示符号,当数值为正数时正常显示且不显示符号位,为负数时取绝对值显示并显示符号位
作者: Ktas520    时间: 2018-10-11 18:18
,可以在你这个代码里加个判断,根据结果选择是否点亮一个数码管中间哪一横,具体16进制代码看你自己用的是共阴极还是共阳极
作者: Sdvcxe    时间: 2018-10-11 18:46
这里面,只有显示两位数的程序,要想显示“-”,必须再加一位。
如果是四位显示器,可以先考虑把最左边的当做符号位。
用两个数字相减,Cy=0时,把符号位显示空白。
Cy=1时,把符号位显示“-”,再把数字反减,再去显示即可。
作者: wulin    时间: 2018-10-11 18:57
这是用3位数码管显-30~150度缓存数组的设置,显示程序段码直接调用缓存数据
void temperature()     //AD采样后的温度处理函
{ //采集到电压值与二维数组的电压值进行比较,从而获得相对应的温度
        uchar i;  
        if((WDCY>table[11][1])||(WDCY<table[171][1]))//如果上下限温度溢出
        {
                dis_buf[0]=14;//百位"E"
                dis_buf[1]=16;//十位"-"
                dis_buf[2]=16;//个位"-"
                dis_buf[3]=16;//-号位 "-"
                dis_buf[4]=16;//负1位"-"
                dis_buf[5]=14;//负2位"E"
        }
        else    //-30~150度正常温度范围显示
        {
                for(i=181;i<182;i--)
                {
                        if((WDCY>=table[i][1])&&(WDCY<table[i-1][1]))
                        {
                                temp=(table[i][0]); //查表法直接获取温度值
                                if(temp<0)   //负温值
                                {
                                        dis_buf[3]=16;                //-号
                                        dis_buf[4]=(temp/10)*(-1);//负1位
                                        dis_buf[5]=(temp%10)*(-1);//负2位
       
                                }
                                else          //正温值
                                {
                                        dis_buf[0]=temp/100;//百位
                                        dis_buf[1]=temp%100/10;//十位
                                        dis_buf[2]=temp%10;//个位
                                }
                                break;
                        }
                }
        }
}


作者: zhong2463    时间: 2018-10-12 17:27
我爱8051 发表于 2018-10-11 16:31
可以预留一块数码管用来显示符号,当数值为正数时正常显示且不显示符号位,为负数时取绝对值显示并显示符号 ...

请问我这样改可以吗
void Displaycountupnum(signed int num)
{
  unsigned int units,tens,hundreds;

  if(num>=0){
  units = num%10;
  tens = (num/10)%10;
  hundreds = num/100;
  

  Send3byte_595_2(countupseg[hundreds],countupseg[tens],countupseg[units]);        //显示倒计时的个、十、百位
  Out_595_2();
  }
if(num<0)
        {
                num=~num;
                num+=1;
                flag_fu=1;
        }
        else
        {
                flag_fu=0;
        }
    if(flag_fu==1)
                                {
//负温度显示
   units = num%10;
   tens = (num/10)%10;
  
        Send3byte_595_2(countupseg[code_func[2]],countupseg[tens],countupseg[units]);                                       
    Out_595_2();                       
                                }
}
作者: 我爱8051    时间: 2018-10-18 12:32
zhong2463 发表于 2018-10-12 17:27
请问我这样改可以吗
void Displaycountupnum(signed int num)
{

//试试看行不行
void Displaycountupnum(signed int num)
{
    unsigned int units,tens,hundreds;

    bool falg_fu = false;//符号位false为正,true为负
    if (num < 0){
        falg_fu = true;
        num = num * (-1);//取绝对值
    }
    units = num % 10;//提取个位
    tens = (num / 10) % 10;//提取十位
    hundreds = num / 100;//提取百位
   
    //三块数码管,当为负数时,百位和符号位就会出现不可兼得的情况(当测正常情况的温度应该不会出现零下百位)
    if (falg_fu) {
        Send3byte_595_2(countupseg[code_func[2]],countupseg[tens],countupseg[units]);        //显示倒计时的个、十、符号位
        Out_595_2();
    }
    else {
        Send3byte_595_2(countupseg[hundreds],countupseg[tens],countupseg[units]);        //显示倒计时的个、十、百位
        Out_595_2();
    }
}

作者: 15233576689    时间: 2018-10-23 10:32
只有显示两位数的程序,要想显示“-”,必须再加一位。如果是四位显示器,可以先考虑把最左边的当做符号位。用两个数字相减,Cy=0时,把符号位显示空白。Cy=1时,把符号位显示“-”,再把数字反减,再去显示即可。--符号位,应该紧贴着数值位。所以,应该判断百位、十位为零否,再把“-”显示在合适的位置上。
作者: zjy007    时间: 2018-10-24 16:00
取数码管中间一杠的断码,就是你想要的负号,在做个标志位判断你要显示的数是不是负数(只提供思想,程序全靠自己编,加油)




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1