OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2482|回复: 6

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

[复制链接]

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
发表于 2017-8-15 13:25:42 | 显示全部楼层 |阅读模式
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#楼]

[mw_shl_code=c,true]//Temp 要显示的数据 //pShow_Num,每一位数的编码数组 //功能:计算每一位数的编码,然后用指针传出去,然后用定时器中断定时刷新,实际的刷新LED数码管的函数是在定时器中断里 void LED_Show(int32_t Temp,u8 *pShow_Num,u8 status) { if(status) { if(Temp >= -999 && Temp -100 && Temp =0 && Temp 99 && Temp
正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

4

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2600
金钱
2600
注册时间
2016-7-6
在线时间
546 小时
发表于 2017-8-15 13:25:43 | 显示全部楼层
[mw_shl_code=c,true]//Temp 要显示的数据
//pShow_Num,每一位数的编码数组
//功能:计算每一位数的编码,然后用指针传出去,然后用定时器中断定时刷新,实际的刷新LED数码管的函数是在定时器中断里
void LED_Show(int32_t Temp,u8 *pShow_Num,u8 status)
{
        if(status)
        {
                if(Temp >= -999 && Temp <= -100)
                {
                        Temp = -Temp;
                       
                        pShow_Num[0] = duan[11];
                        pShow_Num[1] = duan[Temp / 100];
                        pShow_Num[2] = duan[Temp % 100 / 10] | 0x80;
                        pShow_Num[3] = duan[Temp % 100 % 10];
                }

                else if(Temp > -100 && Temp <0)
                {
                        Temp = -Temp;
                       
                        pShow_Num[0] = duan[10];
                        pShow_Num[1] = duan[11];
                        pShow_Num[2] = duan[Temp / 10] | 0x80;
                        pShow_Num[3] = duan[Temp % 10];
                }
               
                else if(Temp >=0 && Temp <= 99)
                {
                        pShow_Num[0] = duan[10];
                        pShow_Num[1] = duan[10];
                        pShow_Num[2] = duan[Temp / 10] | 0x80;
                        pShow_Num[3] = duan[Temp % 10];
                }
               
                else if(Temp > 99 && Temp <= 999)
                {
                        pShow_Num[0] = duan[10];
                        pShow_Num[1] = duan[Temp / 100];
                        pShow_Num[2] = duan[Temp % 100 / 10] | 0x80;
                        pShow_Num[3] = duan[Temp % 100 % 10];
                }
                else
                {
                        pShow_Num[0] = duan[0];
                        pShow_Num[1] = duan[0];
                        pShow_Num[2] = duan[0];
                        pShow_Num[3] = duan[0];
                }
        }
        else
        {
                pShow_Num[0] = duan[10];
                pShow_Num[1] = duan[0];
                pShow_Num[2] = duan[12];
                pShow_Num[3] = duan[12];
        }               
}[/mw_shl_code]
把复杂的事,做简单!
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-15 13:38:03 | 显示全部楼层
这些代码的逻辑是这样的:
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位所有的数码管全亮。
回复

使用道具 举报

4

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2600
金钱
2600
注册时间
2016-7-6
在线时间
546 小时
发表于 2017-8-15 13:51:01 | 显示全部楼层
这是我的处理方式,你可以看一下。
把复杂的事,做简单!
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-15 14:00:11 | 显示全部楼层
月无缺 发表于 2017-8-15 13:51
这是我的处理方式,你可以看一下。

能给我看一下你pshow_num[]的相关代码嘛?我数组这用的不太好,不是很敢用。虽然你的方法不是很适合我,但是非常感谢你提供的思路。
回复

使用道具 举报

4

主题

211

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
2600
金钱
2600
注册时间
2016-7-6
在线时间
546 小时
发表于 2017-8-15 15:46:25 | 显示全部楼层
q247341184 发表于 2017-8-15 14:00
能给我看一下你pshow_num[]的相关代码嘛?我数组这用的不太好,不是很敢用。虽然你的方法不是很适合我, ...

[mw_shl_code=c,true]unsigned char duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0x40,0x71};//0~9,灭,-,F
unsigned char wei[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};[/mw_shl_code]
[mw_shl_code=c,true]void TIM1_UP_IRQHandler(void)
{
        static u8 i;
       
        tc_tick_count++;
        i++;
        if(i > 4)
                i = 0;
        date_in(~wei);
        date_in(Show_Num);
        date_out();
       
        if(Start_Calibrated)
                CalibratedCount ++;
               
        TIM_ClearITPendingBit(TIM1,TIM_FLAG_Update);
}[/mw_shl_code]
show_num[]只是一个缓存而已,通过数码管的编码计算而得。
上面的是我的数码管对应的编码,我用的是74HC595驱动的,定时器的函数,是定时将计算而得的show_num[]的内容发送到数码管上。
把复杂的事,做简单!
回复

使用道具 举报

17

主题

181

帖子

0

精华

高级会员

Rank: 4

积分
504
金钱
504
注册时间
2017-7-24
在线时间
117 小时
 楼主| 发表于 2017-8-15 16:29:06 | 显示全部楼层
月无缺 发表于 2017-8-15 15:46
[mw_shl_code=c,true]unsigned char duan[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x00,0 ...

非常感谢,学到了很多。但是我最后没采用你的方法,因为我没有用595芯片,不过我刚才回头看了一下你的代码,发现我采用的和你的思路是雷同的,只不过你的更简洁,感谢
回复

使用道具 举报

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

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 07:19

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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