OpenEdv-开源电子网

 找回密码
 立即注册

扫一扫,访问微社区

正点原子新作:阿波罗STM32F767&F429&探索者STM32F4开发板&赶快来下载资料哦。

查看: 189|回复: 10

数码管显示负数问题求思路!!!

[复制链接]

  离线 

13

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2017-7-24
在线时间
58 小时
发表于 2017-8-15 13:24:59 | 显示全部楼层 |阅读模式
5金钱
个人努力写了一个数码管显示的模块,大概思路是这样的,传入参数a,让a对10求余,显示一个数,再a=a/10,再对a求余得到第二位,依次类推。直至四位都显示。但是最近遇到一个问题就是显示负数的时候无法解决。负号不能正常的按照既定思路的显示出来,我个人的思路是假如a求完了,在前面固定显示负号,后来我发现逻辑上不行,因为我的每一位都是循环数据读取的。有没有什么方法可以让第二位固定显示负号呢?附上显示模块的代码:

void DisPlayNum(int n)  
{  
        RCC_APB2PeriphClockCmd(RCC_APB2Periph_AFIO,ENABLE);                               
        GPIO_PinRemapConfig(GPIO_Remap_SWJ_NoJTRST,ENABLE);                                //使能
    if (n < 9999)  
    {         int i;  
        int s;  
                                int fu;                       
        s = n;               
        i=0;  
        for (i=0;i<4;i++)  
        {  
            GPIO_ResetBits(GPIOB,GPIO_Pin_4|GPIO_Pin_5|GPIO_Pin_6|GPIO_Pin_7|                                                       
                                                                                                                                        GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|                                                       
                                                                                                                                        GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15 );  
        if(s<0)
                                {       
                                         s=s-2*s;
                                         fu=1;
                                }
                                switch (i)                                                                                                                                                                 
                                {  
                                                case 0:  
                                                                                        GPIO_SetBits(GPIOB,GPIO_Pin_7);  
                                                                                        break;  
                                                case 1:  
                                                                                        GPIO_SetBits(GPIOB,GPIO_Pin_6);  
                                                                                        break;  
                                                case 2:  
                                                                                        if(i==1&&fu==1)
                                                                                        {                       
                                                                                                                GPIO_SetBits(GPIOB,GPIO_Pin_5);
                                                                                                                GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|                               
                                                                                                                                                                                                GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15 );
                                                                                        }
                                                                                        else GPIO_SetBits(GPIOB,GPIO_Pin_5);
                                                                                        break;  
                                                case 3:  
                                                                                        GPIO_SetBits(GPIOB,GPIO_Pin_4);
                                                                                        break;  
        }
                       
            switch (s % 10)                       
            {  
                case 0:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_14|GPIO_Pin_15);                                                                                                                                                                                           // 0
                    break;  
                case 1:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15); // 1
                    break;  
                case 2:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_13|GPIO_Pin_15);                                                                                                                                          // 2
                    break;  
                case 3:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_15);                                                                                                                                          // 3
                    break;  
                case 4:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_8|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_15);                                                                                                  // 4
                    break;  
                case 5:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_12|GPIO_Pin_15);                                                                                                                                  // 5
                    break;  
                case 6:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_9|GPIO_Pin_15);                                                                                                                                                                                                  // 6
                    break;  
                case 7:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);                                          // 7
                    break;  
                case 8:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_15);                                                                                                                                                                                                                                          // 8
                    break;  
                case 9:  
                    GPIO_SetBits(GPIOB,GPIO_Pin_12|GPIO_Pin_15);                                                                                                                                                                                          // 9
                    break;  
            }     
            s = s / 10;  
           if(s==0)
           break;               
                                                delay_ms(5);  
        }      
    }  
}


最佳答案

查看完整内容[请看2#楼]

给你一段代码作为参考,这是个显示某一个数码管调用函数。 u8 ledShow(u8 num, u8 dp)//传入显示的字符,小数点 { u8 code = 0; switch (num) { case 0: code = 0x3F; //8位二进制表示数码管XGFEDCBA,3F=0011 1111代表点亮FEDCBA,即显示0.其他同理 break; case 'F': code = 0x71; break; ... ....//此处省去n行 case '-': ...
回复

使用道具 举报

  离线 

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1839
金钱
1839
注册时间
2014-9-10
在线时间
204 小时
发表于 2017-8-15 13:25:00 | 显示全部楼层
本帖最后由 jiutianshenjian 于 2017-8-19 10:53 编辑

给你一段代码作为参考,这是个显示某一个数码管调用函数。
u8 ledShow(u8 num, u8 dp)//传入显示的字符,小数点
{
    u8 code = 0;   

    switch (num)
    {
        case 0:
           code = 0x3F; //8位二进制表示数码管XGFEDCBA,3F=0011 1111代表点亮FEDCBA,即显示0.其他同理
            break;
        case 'F':
           code = 0x71;
           break;

... ....//此处省去n行
        case '-':
           code = 0x40;//你要的负号在这
           break;      
        
        default:
            break;
    }
   
    if ((code >> 6) & 0x1)//判断第7位即G是否点亮
    {
        GPIO_SetBits(GPIOE, GPIO_Pin_9);
    }
   
    if ((code >> 5) & 0x1)
//判断第6位即F是否点亮,以下同理
    {
        GPIO_SetBits(GPIOE, GPIO_Pin_8);
    }
... ....//此处省去n行
    if (1 == dp)
    {
        GPIO_SetBits(GPIOE, GPIO_Pin_10);
    }
   
    return 0;
}


给你简单的注释了下,如果你看不懂,我再加注释吧。


2017-08-16_091552.png
小小蜗牛
回复

使用道具 举报

  离线 

53

主题

1155

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2058
金钱
2058
注册时间
2014-2-13
在线时间
363 小时
发表于 2017-8-15 14:19:42 | 显示全部楼层
送形参进来之后,对正负进行判断不就好了吗?
技术交流,Sell 中颖单片机,欢迎私信骚扰
回复

使用道具 举报

  离线 

13

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2017-7-24
在线时间
58 小时
 楼主| 发表于 2017-8-15 14:24:50 | 显示全部楼层
黑夜之狼 发表于 2017-8-15 14:19
送形参进来之后,对正负进行判断不就好了吗?

已经进行了正负判断,你是说为负的时候让第二位负号常亮是这意思嘛?我也是这个意思,所以我现在想求一个1234能分开显示的思路,有没有什么方法可以让这四位分开显示??每一位显示不同的数据。或者两位两位也行。
回复

使用道具 举报

  离线 

482

主题

8万

帖子

30

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
117015
金钱
117015
注册时间
2010-12-1
在线时间
896 小时
发表于 2017-8-16 01:06:49 | 显示全部楼层
q247341184 发表于 2017-8-15 14:24
已经进行了正负判断,你是说为负的时候让第二位负号常亮是这意思嘛?我也是这个意思,所以我现在想求一个 ...

纯软件问题,自己仿真解决
我是开源电子网www.openedv.com站长,有关站务问题请与我联系。
正点原子STM32开发板购买店铺http://openedv.taobao.com
微信公众平台:正点原子   点击扫码添加
回复

使用道具 举报

  离线 

81

主题

1002

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
1839
金钱
1839
注册时间
2014-9-10
在线时间
204 小时
发表于 2017-8-16 08:58:27 | 显示全部楼层
每一位显示什么完全由你控制啊,负号没什么特殊的,和其他字母数字等字符道理都是一样的。
例如你定义了4个变量,L1L2L3L4用来表示4个数码管该显示的值,你一个一个显示不就完了么?
小小蜗牛
回复

使用道具 举报

  离线 

29

主题

312

帖子

0

精华

高级会员

Rank: 4

积分
733
金钱
733
注册时间
2016-5-21
在线时间
197 小时
发表于 2017-8-16 09:27:29 | 显示全部楼层
本帖最后由 haysen 于 2017-8-16 09:30 编辑

其实一点都没看懂你的题意思,四位数为啥要第二位显示负号啊?
数码管的每一位是没有属性的啊,你让他显示啥就显示啥,只是个char的数组而已,有共阴共阳的段码表,你按这个逻辑补一个负号就行了。

你这个代码写的,没有标注,没有注释,完全懒得看,个人感觉而且逻辑上很混乱。

你可以先封装一个函数,入参为  两个参数, 第一个参数为数码管的位号,第二个参数为要显示的一位值。
void  displayOne(uchar  x, uchar Num);

void DisPlayNum(int n)
{
       判断正负
       displayOne(4, '负号') ;//具体负号是啥,自己定义
      z=n取绝对值  
    m=1;
     for(i=0;i<4;i++)
     {
           
           j = (z/m)%10;
           displayOne(i, j) ;
           m*=10;
     }
      
}

//上面逻辑未经验证,但是大概思路是这样,自己跑下看看

回复

使用道具 举报

  离线 

13

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2017-7-24
在线时间
58 小时
 楼主| 发表于 2017-8-16 10:14:54 | 显示全部楼层
haysen 发表于 2017-8-16 09:27
其实一点都没看懂你的题意思,四位数为啥要第二位显示负号啊?
数码管的每一位是没有属性的啊,你让他显示 ...

是这样,首先我那个代码本来是有注释的,但是粘出来是乱码,为了简洁我就给删了,所以十分抱歉。然后我已经尝试出一个方法了,不过非常感谢你的思路。
回复

使用道具 举报

  离线 

13

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2017-7-24
在线时间
58 小时
 楼主| 发表于 2017-8-16 10:15:40 | 显示全部楼层
jiutianshenjian 发表于 2017-8-16 09:11
给你一段代码作为参考,这是个显示某一个数码管调用函数。
u8 ledShow(u8 num, u8 dp)//传入显示的字符, ...

很感谢提供的思路。对我很有帮助,收获很多,谢谢
回复

使用道具 举报

  离线 

13

主题

121

帖子

0

精华

中级会员

Rank: 3Rank: 3

积分
239
金钱
239
注册时间
2017-7-24
在线时间
58 小时
 楼主| 发表于 2017-8-16 10:18:33 | 显示全部楼层
jiutianshenjian 发表于 2017-8-16 08:58
每一位显示什么完全由你控制啊,负号没什么特殊的,和其他字母数字等字符道理都是一样的。
例如你定义了4 ...

是这样,之前我显示不出来因为逻辑上的问题,也就是说我是定义了负号这个东西的,给你打个比方,我有8位数码管显示数据,但是我实际的值只显示了一个56,那么我的逻辑里,数码管只循环了两次,因此只在后两位显示了56,前面的被判定break掉了。所以显示这个56的时候真正运作的之后最后两位。所以我才想找一个思路,就是既让前面的该空的地方空着,然后还能显示负号,不过已经解决了,灰常感谢你提供的思路
回复

使用道具 举报

  离线 

53

主题

1155

帖子

0

精华

论坛大神

Rank: 7Rank: 7Rank: 7

积分
2058
金钱
2058
注册时间
2014-2-13
在线时间
363 小时
发表于 2017-8-16 17:07:23 | 显示全部楼层
q247341184 发表于 2017-8-15 14:24
已经进行了正负判断,你是说为负的时候让第二位负号常亮是这意思嘛?我也是这个意思,所以我现在想求一个 ...

形参进来之后,进行正负判断,负数就求绝对值,然后你说的1234分开,就是取余求整的算法
技术交流,Sell 中颖单片机,欢迎私信骚扰
回复

使用道具 举报

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

本版积分规则




QQ|联系我们|手机版|官方淘宝店|新浪微博|微信公众平台|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2017-11-18 08:50

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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