12
返回列表 发新帖我要提问本帖赏金: 10.00元(功能说明)

[STM32] 求助各位坛友:定时器2ms数码管动态显示 3位数只显示最...

[复制链接]
5812|47
山东电子小菜鸟 发表于 2018-4-7 20:56 | 显示全部楼层
qmmdzd 发表于 2018-4-7 20:52
不用驱动芯片是不是会麻烦很多呢?求显示程序上的指点

显示中的delayms(1)与定时器中断时间可能木有协调好:
建议:把变量i去掉,把显示函数直接放在中断里面,调试成功后,再选取恰当的时间平衡点加入变量I
 楼主| qmmdzd 发表于 2018-4-7 21:31 | 显示全部楼层
本菜菜把程序发上来,麻烦各位坛友有时间帮忙看下,堵在这一段时间了,谢谢大家了

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?注册

×
jinglixixi 发表于 2018-4-8 08:22 | 显示全部楼层
qmmdzd 发表于 2018-4-7 13:04
也就是把K设置为全局变量?Display中的K的for循环也用改吗?

把K设置为全局变量,将for循环改为if(k<3)判别处理,if(k==3) k=0.来试一试,如果无变化说明问题在其它地方。
 楼主| qmmdzd 发表于 2018-4-8 09:28 | 显示全部楼层
jinglixixi 发表于 2018-4-8 08:22
把K设置为全局变量,将for循环改为if(k

请问坛友,如果我中断一次显示一个数码管程序该如何写呢?我试了下你说的这种,还是不行,我现在的程序是中断一次扫描三只管 可能这样有问题
m564522634 发表于 2018-4-8 09:41 | 显示全部楼层
这驱动写的太差了不想看了
 楼主| qmmdzd 发表于 2018-4-8 10:11 | 显示全部楼层
m564522634 发表于 2018-4-8 09:41
这驱动写的太差了不想看了

麻烦坛友直接给写个显示三位数的函数吧
 楼主| qmmdzd 发表于 2018-4-8 10:40 | 显示全部楼层
山东电子小菜鸟 发表于 2018-4-7 20:56
显示中的delayms(1)与定时器中断时间可能木有协调好:
建议:把变量i去掉,把显示函数直接放在中断里面 ...

麻烦坛友给配置个一次中断显示一位数码管的程序吧  可能我这种写法本身就有问题
datouyuan 发表于 2018-4-8 13:49 | 显示全部楼层
本帖最后由 datouyuan 于 2018-4-8 13:50 编辑
qmmdzd 发表于 2018-4-6 22:00
void Isr_Init()
{
        NVIC_InitTypeDef NVIC_InitStructure;
  1. u8 DisPlayBuff[3];//
  2. void DisPlayDrv(void)//3位数码驱动,间隔1~5mS执行一次
  3. {  
  4.         static u8 k=0;

  5.         GPIO_SetBits(GPIOF,GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_11);//关闭段选
  6.         GPIO_SetBits(GPIOE,GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_11|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7);//关闭位选
  7.         switch (k)  
  8.         {  
  9.                 case 0:  
  10.                 GPIO_ResetBits(GPIOF,GPIO_Pin_13);  //GPIO_Write(GPIOE,table[n % 10]); n=n/10; //显示个位
  11.                 break;  
  12.                
  13.                 case 1:  
  14.                 GPIO_ResetBits(GPIOF,GPIO_Pin_12); //GPIO_Write(GPIOE,table[n % 10]); n=n/10; //显示十位
  15.                 break;  
  16.                
  17.                 case 2:  
  18.                 GPIO_ResetBits(GPIOF,GPIO_Pin_11); //GPIO_Write(GPIOE,table[n % 10]); n=n/10; //显示百位
  19.                 break;                 
  20.         }
  21.         switch (DisPlayBuff[k])  //分别取余写入段选
  22.         {  
  23.                 case 0:  
  24.                 GPIO_Write(GPIOE,table[0]);   
  25.                 break;  
  26.                 case 1:                                                      
  27.                 GPIO_Write(GPIOE,table[1]);
  28.                 break;  
  29.                 case 2:  
  30.                 GPIO_Write(GPIOE,table[2]);  
  31.                 break;  
  32.                 case 3:  
  33.                 GPIO_Write(GPIOE,table[3]);  
  34.                 break;  
  35.                 case 4:  
  36.                 GPIO_Write(GPIOE,table[4]);
  37.                 break;  
  38.                 case 5:  
  39.                 GPIO_Write(GPIOE,table[5]);  
  40.                 break;  
  41.                 case 6:  
  42.                 GPIO_Write(GPIOE,table[6]);  
  43.                 break;  
  44.                 case 7:  
  45.                 GPIO_Write(GPIOE,table[7]);  
  46.                 break;  
  47.                 case 8:  
  48.                 GPIO_Write(GPIOE,table[8]);  
  49.                 break;  
  50.                 case 9:  
  51.                 GPIO_Write(GPIOE,table[9]);  
  52.                 break;  
  53.                 default:
  54.                 //空显示的IO口操作
  55.                 break;
  56.         }
  57.         k++;
  58.         if(3==k) k=0;
  59. }  

帮你改成了每次显示一段。
假如某一段不显示,这个时间不能省略,否则会造成显示亮度变化。如显示“1”比显示“100”亮3倍。

打赏榜单

qmmdzd 打赏了 5.00 元 2018-04-09
理由:感谢相助

datouyuan 发表于 2018-4-8 14:29 | 显示全部楼层
本帖最后由 datouyuan 于 2018-4-8 14:41 编辑
  1. void DisPlayNum(u16 n)
  2. {  
  3.         u8 k;
  4.         if (n < 1000)  
  5.         {
  6.                 //关中断
  7.                 for (k=0;k<3;k++)  //位选择循环,K=0对应个位数据,K=1对应十位数据,K=2对应百位
  8.                 {  
  9.                         DisPlayBuff[k]=(n % 10);
  10.                         n = n / 10;
  11.                 }  

  12.                 //前面的0不显示
  13.                 if(DisPlayBuff[2]==0)
  14.                 {
  15.                         DisPlayBuff[2]=255;//
  16.                         if(DisPlayBuff[1]==0) DisPlayBuff[1]=255;
  17.                 }
  18.                 //开中断
  19.         }

  20. }


另外,显示驱动把“ switch (DisPlayBuff[k])”放到“ switch (k)”前面要好些,先准备好数据再切换显示。
datouyuan 发表于 2018-4-8 14:50 | 显示全部楼层
楼主的“ switch (DisPlayBuff[k])”这么有规律,
改成“if(DisPlayBuff[k]<10) GPIO_Write(GPIOE,table[DisPlayBuff[k]]);”
看着多舒服。
 楼主| qmmdzd 发表于 2018-4-8 22:31 | 显示全部楼层
datouyuan 发表于 2018-4-8 14:29
另外,显示驱动把“ switch (DisPlayBuff[k])”放到“ switch (k)”前面要好些,先准备好数据再切换显示 ...

感谢坛友相助  明天早上去试试,今天有事来着回复晚了,再次感谢
xch 发表于 2018-4-8 23:32 | 显示全部楼层
qmmdzd 发表于 2018-4-6 22:00
void Isr_Init()
{
        NVIC_InitTypeDef NVIC_InitStructure;

改成这样子
void DisPlayNum(int n)
{
        static int k=0;
        int digi =0;
       
    if (n >= 1000){k=0;return} ;  

        GPIO_SetBits(GPIOF,GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_11);//关闭所有数码管位选
        GPIO_SetBits(GPIOE,GPIO_Pin_15|GPIO_Pin_14|GPIO_Pin_13|GPIO_Pin_12|GPIO_Pin_11|GPIO_Pin_9|GPIO_Pin_8|GPIO_Pin_7);//关闭所有段选

        switch (k)  //0-2循环,选中位选
        {  
                case 0:  
                        GPIO_ResetBits(GPIOF,GPIO_Pin_13);
                        digi = n %10;
                       
                        break;  
                case 1:  
                        GPIO_ResetBits(GPIOF,GPIO_Pin_12);  
                        digi = (n/10)%10;
                       
                        break;  
                case 2:  
                        GPIO_ResetBits(GPIOF,GPIO_Pin_11);
                        digi = (n/100)%10;
                        break;                 
        }
       
        GPIO_Write(GPIOE,table[digi]);
        k++;
        if (k>2) k=0;
}

打赏榜单

qmmdzd 打赏了 5.00 元 2018-04-09
理由:采用你的这个写法,成功了,感谢相助

评论

xch
这个程序不够优化。还可以化简些。  发表于 2018-4-9 11:59
 楼主| qmmdzd 发表于 2018-4-9 09:33 | 显示全部楼层
调试成功了,采用了xch写法,一会再试试datouyuan的写法,再次感谢所有回帖的坛友
jinglixixi 发表于 2018-4-9 11:35 | 显示全部楼层
qmmdzd 发表于 2018-4-8 09:28
请问坛友,如果我中断一次显示一个数码管程序该如何写呢?我试了下你说的这种,还是不行,我现在的程序是 ...

将显示位置的计时器K放到中断中,中断一次,变更一下显示位置可能会管用。
datouyuan 发表于 2018-4-9 17:21 | 显示全部楼层
qmmdzd 发表于 2018-4-9 09:33
调试成功了,采用了xch写法,一会再试试datouyuan的写法,再次感谢所有回帖的坛友 ...

你那种写法非标,是通过给全局变量n赋值来改变显示。

我的这种写法是通用的方法,需要更改显示内容就调用DisPlayNum(x)函数来改变显示缓存,不需要全局变量n。
sum123456 发表于 2018-4-11 14:41 | 显示全部楼层

几十个us够了吗?你有个delayms的函数,起码执行一次,最少3ms,程序的可读性太差了,i居然当做全局变量,你这样写,只要i为0的时候,才执行扫描一遍显示函数,都超过定时器时间了,太乱了。
logical_lu 发表于 2018-4-11 15:26 | 显示全部楼层
     很简单啊,显示123,点亮第一个数码管,然后输入1,延时2ms,然后点亮第二个数码管显示2,延时2ms,再点亮第三个数码管,延时2ms, 数码管需要循环刷新,不像液晶直接点亮就可以了。
logical_lu 发表于 2018-4-11 15:36 | 显示全部楼层
sum123456 发表于 2018-4-11 14:41
几十个us够了吗?你有个delayms的函数,起码执行一次,最少3ms,程序的可读性太差了,i居然当做全局变量, ...

大概500us就可以了
 楼主| qmmdzd 发表于 2018-4-12 21:26 | 显示全部楼层
z273286744 发表于 2018-4-12 13:36
这个好贴千万别沉了

这驱动写不好,不过坛友的回复都给力
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 在线客服 返回列表 返回顶部