模吧

 找回密码
 立即注册

QQ登录

只需一步,快速开始

手机号码,快捷登录

1262查看 | 18回复

[求助贴] 数码管显示的奇怪问题

[复制链接]
发表于 2018-5-17 11:35:18 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

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

x
本帖最后由 运单 于 2018-5-17 11:38 编辑

学习萝莉大神的帖子,准备做舵机测试仪,数码管用拆机的,用了两个2位的拼成4位的,显示时出现了奇怪的问题,4个8能正确显示,同时显示同一数字也可以,但是扫描显示时出现了问题,如图
数码管显示的奇怪问题 舵机 作者:运单 5493 数码管显示的奇怪问题 舵机 作者:运单 8306 数码管显示的奇怪问题 舵机 作者:运单 5591
显示1288是正确的:
数码管显示的奇怪问题 舵机 作者:运单 2889
显示6767后两位不对:
数码管显示的奇怪问题 舵机 作者:运单 1390
显示1767后两位不对:
数码管显示的奇怪问题 舵机 作者:运单 7254
显示1267最后一位不对:
数码管显示的奇怪问题 舵机 作者:运单 4996
好像是前两位显示正常,后两位有的数字正常显示,有的不行
程序,我只改了单片机的引脚定义
        #include<reg51.h>
        
        sfr P2M0=0x96;     //声明 P2引脚模式寄存器
   sfr P3M0=0xb2;     //声明 P3引脚模式寄存器
        
        
        sbit DA=P2^1;                        //数码管引脚a,接单片机24脚,P2.1
        sbit DB=P2^0;                        //数码管引脚b,接单片机23脚,P2.0
    sbit DC=P3^3;                        //数码管引脚c,接单片机18脚,P3.3
        sbit DD=P3^5;                        //数码管引脚d,接单片机20脚,P3.5
        sbit DE=P3^4;                        //数码管引脚e,接单片机19脚,P3.4
        sbit DF=P2^2;                        //数码管引脚f,接单片机25脚,P2.2
        sbit DG=P2^4;                        //数码管引脚g,接单片机27脚,P2.4
        sbit DP=P2^3;                        //数码管引脚dp,接单片机26脚,P2.3
        
        sbit B1=P2^5;                        //第一个数码管公共脚,接单片机28脚,P2.5                        
        sbit B2=P3^7;                        //第二个数码管公共脚,接单片机22脚,P3.7
        sbit B3=P3^6;                        //第三个数码管公共脚,接单片机21脚,P3.6
        sbit B4=P3^2;                        //第四个数码管公共脚,接单片机17脚,P3.2
        
        
        unsigned char display_time;        //定义变量用于显示次数
        
        unsigned char Data1;        //第一个数码管要显示的数据
        unsigned char Data2;        //第二个数码管要显示的数据
        unsigned char Data3;        //第三个数码管要显示的数据
        unsigned char Data4;        //第四个数码管要显示的数据
        
        
        void Delay1ms()                //@12.000MHz
        {
                unsigned char i, j;
        
                i = 12;
                j = 169;
                do
                {
                        while (--j);
                } while (--i);
        }
        
        void delay_n_ms(unsigned int n) //延时n毫秒函数
        {
                while(n)         
                {
                        Delay1ms();
                        n=n-1;//每循环一次n减小1
                }   
        }
        
        
        void display(unsigned char x)//控制数码管显示内容的函数
        {
                //判断x的值来决定显示什么
                if(x==0){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=0;DP=0;} //显示"0"
               
                if(x==1){DA=0;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示"1"
               
                if(x==2){DA=1;DB=1;DC=0;DD=1;DE=1;DF=0;DG=1;DP=0;} //显示"2"
               
                if(x==3){DA=1;DB=1;DC=1;DD=1;DE=0;DF=0;DG=1;DP=0;} //显示"3"
        
                if(x==4){DA=0;DB=1;DC=1;DD=0;DE=0;DF=1;DG=1;DP=0;} //显示"4"
               
                if(x==5){DA=1;DB=0;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示"5"
               
                if(x==6){DA=1;DB=0;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示"6"
               
                if(x==7){DA=1;DB=1;DC=1;DD=0;DE=0;DF=0;DG=0;DP=0;} //显示"7"
               
                if(x==8){DA=1;DB=1;DC=1;DD=1;DE=1;DF=1;DG=1;DP=0;} //显示"8"
               
                if(x==9){DA=1;DB=1;DC=1;DD=1;DE=0;DF=1;DG=1;DP=0;} //显示"9"
               
        }
        
        
        main()
        {
                //P2M0=0x1B;                //需要高电平大电流的引脚 2.4、2.3、2.1、2.0,填入数值0001 1011
                //P3M0=0xE4;                //需要高电平大电流的引脚 3.7、3.6、3.5、3.2,填入数值1110 0100
               
               
                while(1)
                {
                        delay_n_ms(4);//系统周期4ms
                        
                        Data1=1;//四个数码管显示的数据
                        Data2=7;
                        Data3=6;
                        Data4=7;
                        
                        ///////////////////////////////////////////////////////
                        //显示程序模块化,只需要改变Data1/2/3/4的值就可以控制显示内容
                        
                        display_time=display_time+1;
                                                
                        if(display_time>3)
                        {
                                display_time=0;  //0、1、2、3 四个循环
                        }
                        
                        if(display_time==0)//第0次显示第一个数码管
                        {
                                B1=0;B2=1;B3=1;B4=1;        
                                display(Data1);                //显示第1位数据
                        }
                        
                        if(display_time==1)//第1次显示第二个数码管
                        {
                               B1=1;B2=0;B3=1;B4=1;        
                                display(Data2);                //显示第2位数据
                        }
                        
                        if(display_time==2)//第2次显示第三个数码管
                        {
                                B1=1;B2=1;B3=0;B4=1;        
                                display(Data3);                //显示第3位数据                          
                        }
                        
                        if(display_time==3)//第3次显示第四个数码管
                        {
                                B1=1;B2=1;B3=1;B4=0;        
                                display(Data4);                //显示第4位数据                                                               
                        }
                              
                }
        }


 楼主| 发表于 2018-5-17 11:45:45 | 显示全部楼层
经过试验,单独第三位的6能正常显示,单独第四位的7也能正常显示,但显示后两位时就不正常
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-17 11:50:30 | 显示全部楼层
第一位和第四位不显示,第二位显示7时第三位显示6不正常,少了中间一横,而且亮度也比较大,如果第二位改成显示2、3、4、5、6、8、9第三位显示6都能正常显示,就是亮度大些
回复 支持 反对

使用道具 举报

发表于 2018-5-17 12:03:19 | 显示全部楼层
把显示延时改久点
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-17 12:17:20 | 显示全部楼层
421930188 发表于 2018-5-17 12:03
把显示延时改久点

改了,不行
回复 支持 反对

使用道具 举报

发表于 2018-5-17 12:48:55 | 显示全部楼层
试下这样行不:

B1=1;B2=1;B3=1;B4=1;       // 公共端先全关闭
display(Data1);                //显示第N位数据
B1=0;                               //开第N位公共端
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-17 13:07:24 | 显示全部楼层
youngchun 发表于 2018-5-17 12:48
试下这样行不:

B1=1;B2=1;B3=1;B4=1;       // 公共端先全关闭

加大输出电流正常了,但是还没找到原因
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-17 13:10:20 | 显示全部楼层
youngchun 发表于 2018-5-17 12:48
试下这样行不:

B1=1;B2=1;B3=1;B4=1;       // 公共端先全关闭

试了下,这时候可以正常显示,但是为什么改成这样就可以了呢?
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-17 13:15:32 | 显示全部楼层
youngchun 发表于 2018-5-17 12:48
试下这样行不:

B1=1;B2=1;B3=1;B4=1;       // 公共端先全关闭

     我原来把这两句屏蔽了 ,然后根据我的实际接法改了之后加上就可以正常显示,但是有点刺眼,还是您的改法好
      P2M0=0x1f;                //需要高电平大电流的引脚 2.4、2.3、2.1、2.0,填入数值0001 1111
                P3M0=0x38;
回复 支持 反对

使用道具 举报

发表于 2018-5-17 13:38:36 | 显示全部楼层
void display(unsigned char x)//控制数码管显示内容的函数
此函数效率太低。
可以考虑用整个字节输出。
用SWITCH结构判断,没用到的就不用判断了。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-17 14:30:36 | 显示全部楼层
youngchun 发表于 2018-5-17 13:38
void display(unsigned char x)//控制数码管显示内容的函数
此函数效率太低。
可以考虑用整个字节输出。

还不会呀,能否给个例子?
回复 支持 反对

使用道具 举报

发表于 2018-5-17 14:46:05 | 显示全部楼层

    u8 SMG_Code[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};//数码管编码0-9



    (SMG_Code[dat] & BIT7) ? GPIO_WriteHigh(GPIOC, GPIO_PIN_5) : GPIO_WriteLow(GPIOC, GPIO_PIN_5); //A,共阳极数码管,低电平有效
    (SMG_Code[dat] & BIT6) ? GPIO_WriteHigh(GPIOC, GPIO_PIN_7) : GPIO_WriteLow(GPIOC, GPIO_PIN_7); //B
    (SMG_Code[dat] & BIT5) ? GPIO_WriteHigh(GPIOD, GPIO_PIN_4) : GPIO_WriteLow(GPIOD, GPIO_PIN_4); //C
    (SMG_Code[dat] & BIT4) ? GPIO_WriteHigh(GPIOD, GPIO_PIN_5) : GPIO_WriteLow(GPIOD, GPIO_PIN_5); //D
    (SMG_Code[dat] & BIT3) ? GPIO_WriteHigh(GPIOD, GPIO_PIN_6) : GPIO_WriteLow(GPIOD, GPIO_PIN_6); //E
    (SMG_Code[dat] & BIT2) ? GPIO_WriteHigh(GPIOA, GPIO_PIN_1) : GPIO_WriteLow(GPIOA, GPIO_PIN_1); //F
    (SMG_Code[dat] & BIT1) ? GPIO_WriteHigh(GPIOD, GPIO_PIN_2) : GPIO_WriteLow(GPIOD, GPIO_PIN_2); //G
    (SMG_Code[dat] & BIT0) ? GPIO_WriteHigh(GPIOD, GPIO_PIN_3) : GPIO_WriteLow(GPIOD, GPIO_PIN_3); //DP


我这是共阳极数码管,你是共阴的,要重新编码。
IO口也要对应修改。

回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-17 22:29:20 | 显示全部楼层
youngchun 发表于 2018-5-17 14:46
u8 SMG_Code[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};//数码管编码0-9

这个有点看不懂呀,百度了一下,好像与stm有啥关系,我用的是51,直接贴到程序里编译不过去,要怎么改呢?

点评

老大,这是我的示例代码,你也不能死搬硬套吧。 重要的是要看懂上面的原理,根据你的实际情况改动。  详情 回复 发表于 2018-5-18 09:00
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-18 07:25:39 | 显示全部楼层
youngchun 发表于 2018-5-17 14:46
u8 SMG_Code[10] = {0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09};//数码管编码0-9

编译提示:错误C202,‘dat’:undefined identifier
回复 支持 反对

使用道具 举报

发表于 2018-5-18 09:00:25 | 显示全部楼层
运单 发表于 2018-5-17 22:29
这个有点看不懂呀,百度了一下,好像与stm有啥关系,我用的是51,直接贴到程序里编译不过去,要怎么改呢 ...

老大,这是我的示例代码,你也不能死搬硬套吧。

重要的是要看懂上面的原理,根据你的实际情况改动。

回复 支持 反对

使用道具 举报

发表于 2018-5-18 10:13:26 | 显示全部楼层
直接把p2和p3赋值
回复 支持 反对

使用道具 举报

发表于 2018-5-18 10:15:15 | 显示全部楼层
楼上写的是stm32的程序.
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-5-18 21:07:48 | 显示全部楼层
youngchun 发表于 2018-5-18 09:00
老大,这是我的示例代码,你也不能死搬硬套吧。

重要的是要看懂上面的原理,根据你的实际情况改动。

您写这个我真看不懂,51的都还没学好,要看懂这个又得学stm,您能给个51的示例吗?我原来用过直接给P0和P1赋值,有个工具帮着算数模,但那个数码管和单片机的接法是固定的,不像这种可以随便接
回复 支持 反对

使用道具 举报

发表于 2019-10-27 13:50:20 | 显示全部楼层
代码这东西太复杂了!
回复 支持 反对

使用道具 举报

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

本版积分规则

QQ|关于模吧|APP下载|广告报价|小黑屋|手机版|企业会员|商城入驻|联系我们|模吧 ( 冀公网安备13080502000084号 )

© 2013-2020 Moz8.com 模吧,玩出精彩!