数码管显示逻辑求指导!!!!

2019-08-14 15:08发布

个人努力写了一个数码管显示的模块,大概思路是这样的,传入参数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);  
        }      
    }  
}

友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
6条回答
q247341184
2019-08-14 20:49
这些代码的逻辑是这样的:
1、Reset所有的管脚;
2、读取值,用s来读取data的值进行操作;
3、进入循环,for(i=0;i<4;i++)是位选;顺序是d4、d3、d2、d1,
      我的想法是此处我在D2的选择面,当D2位亮时,我固定定负号显示在D2这。
4、段选,显示每一位的数,通过s对10求余得到每一位的值,再s除以10,再对10求余得到下一位的值。
5、如果s的值为零,则跳出循环。
但是我不明白为什么D2处没有显示负号,而是显示D2位所有的数码管全亮。

一周热门 更多>