找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10955|回复: 14
收起左侧

数码管如何显示负数

  [复制链接]
ID:393625 发表于 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();
}


回复

使用道具 举报

ID:408226 发表于 2018-10-11 18:46 | 显示全部楼层
这里面,只有显示两位数的程序,要想显示“-”,必须再加一位。
如果是四位显示器,可以先考虑把最左边的当做符号位。
用两个数字相减,Cy=0时,把符号位显示空白。
Cy=1时,把符号位显示“-”,再把数字反减,再去显示即可。

评分

参与人数 1黑币 +50 收起 理由
admin + 50 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:386381 发表于 2018-10-11 14:48 来自手机 | 显示全部楼层
建议说的再详细一点,把全部代码上传上来,只看到局部

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:408093 发表于 2018-10-11 15:50 | 显示全部楼层
数码管中的g一直显示
回复

使用道具 举报

ID:408110 发表于 2018-10-11 15:52 | 显示全部楼层
如果要显示负数,首先函数的传参就不应该是个无符号整形

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:393625 发表于 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  
回复

使用道具 举报

ID:393625 发表于 2018-10-11 16:18 | 显示全部楼层
文凤轩 发表于 2018-10-11 14:48
建议说的再详细一点,把全部代码上传上来,只看到局部

已经发了,请看
回复

使用道具 举报

ID:393625 发表于 2018-10-11 16:19 | 显示全部楼层
willcome0 发表于 2018-10-11 15:52
如果要显示负数,首先函数的传参就不应该是个无符号整形

是的,是我忽略了,
回复

使用道具 举报

ID:408134 发表于 2018-10-11 16:31 | 显示全部楼层
可以预留一块数码管用来显示符号,当数值为正数时正常显示且不显示符号位,为负数时取绝对值显示并显示符号位

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:408209 发表于 2018-10-11 18:18 | 显示全部楼层
,可以在你这个代码里加个判断,根据结果选择是否点亮一个数码管中间哪一横,具体16进制代码看你自己用的是共阴极还是共阳极

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:213173 发表于 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;
                        }
                }
        }
}

评分

参与人数 1黑币 +20 收起 理由
admin + 20 回帖助人的奖励!

查看全部评分

回复

使用道具 举报

ID:393625 发表于 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();                       
                                }
}
回复

使用道具 举报

ID:408134 发表于 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();
    }
}
回复

使用道具 举报

ID:413816 发表于 2018-10-23 10:32 | 显示全部楼层
只有显示两位数的程序,要想显示“-”,必须再加一位。如果是四位显示器,可以先考虑把最左边的当做符号位。用两个数字相减,Cy=0时,把符号位显示空白。Cy=1时,把符号位显示“-”,再把数字反减,再去显示即可。--符号位,应该紧贴着数值位。所以,应该判断百位、十位为零否,再把“-”显示在合适的位置上。
回复

使用道具 举报

ID:241273 发表于 2018-10-24 16:00 | 显示全部楼层
取数码管中间一杠的断码,就是你想要的负号,在做个标志位判断你要显示的数是不是负数(只提供思想,程序全靠自己编,加油)
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表