OpenEdv-开源电子网

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

数码管显示亮度不一样,亮度调节和抖动有冲突

[复制链接]

1

主题

1

帖子

0

精华

新手入门

积分
3
金钱
3
注册时间
2020-6-10
在线时间
0 小时
发表于 2020-6-10 16:32:38 | 显示全部楼层 |阅读模式
1金钱
#include <reg52.h>

#define Dataport P0 //宏定义
sbit Duan = P2^2; //段锁存
sbit Wei = P2^3; //位锁存

unsigned char code DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};
unsigned char code WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
unsigned char huancun[8];

void display(unsigned char fistbit,unsigned char num);

void delay(unsigned int t)
{
        while(--t);
}
void main()
{
        unsigned char j;
        signed long num=99999999;
        while(1)
        {
                j++;
                if(j==10) //扫描所有的数码管算一次j,10次j数值加1
                {
                        j=0;
                        num--;
                        if(num == -1) //87654321
                        num = 99999999;
                }
                if(num<10000000) //值小于10000000(千万级),则千万位不显示
                        huancun[0] = 0; //消隐
                else
                        huancun[0] = DuanMa[num/10000000];
                if(num<1000000)
                        huancun[1] = 0;
                else
                        huancun[1] = DuanMa[num/1000000%10];
                if(num<100000)
                        huancun[2] = 0;
                else
                        huancun[2] = DuanMa[num/100000%10];
                if(num<10000)
                        huancun[3] = 0;
                else
                        huancun[3] = DuanMa[num/10000%10];
                if(num<1000)
                        huancun[4] = 0;
                else
                        huancun[4] = DuanMa[num/1000%10];
                if(num<100)
                        huancun[5] = 0;
                else
                        huancun[5] = DuanMa[num/100%10];
                if(num<10)
                        huancun[6] = 0;
                else
                        huancun[6] = DuanMa[num/10%10];
                        huancun[7] = DuanMa[num%10];
                display(0,8);
        }
}


void display(unsigned char firstbit,unsigned char num) //fisbirt表示从第firstbit个数码管开始显示,num表示显示num个数码管.二者为形参
{
        unsigned char i;
        for(i=0;i<num;i++) //一次扫描num个数码管
        {
                Dataport = 0; //每次进入时消除前一次段锁存的数据,消除重影
                Duan = 1;
                Duan = 0;
               
                Dataport = WeiMa[i+firstbit];
                Wei = 1;
                Wei = 0;
               
                Dataport = huancun[i];
                Duan = 1; //锁存透明,输入与输出直通
                Duan = 0; //锁存关闭,保留数据
               
                delay(200);

上面就是程序,显示的时候第八个数码管亮度正常,前七个数码管都比较暗;我怀疑时扫描时间太快了,所以我加长了时间,但是虽然亮度强一点了,同时也出现抖动,不知道怎么弄。想问一下大家亮度暗时由什么造成的呢?还有就是按键扫描和数值累加有没有什么冲突的地方?
















正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

21

主题

2205

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
5136
金钱
5136
注册时间
2014-8-26
在线时间
1316 小时
发表于 2020-6-10 18:35:54 | 显示全部楼层
回复

使用道具 举报

10

主题

3281

帖子

1

精华

论坛元老

Rank: 8Rank: 8

积分
8205
金钱
8205
注册时间
2020-5-11
在线时间
3700 小时
发表于 2020-6-10 21:31:58 | 显示全部楼层
delay(200);后加一句Dataport = 0;
专治疑难杂症
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165309
金钱
165309
注册时间
2010-12-1
在线时间
2108 小时
发表于 2020-6-11 01:22:22 | 显示全部楼层
可能是硬件设计的问题。
回复

使用道具 举报

22

主题

2251

帖子

0

精华

论坛元老

Rank: 8Rank: 8

积分
4471
金钱
4471
注册时间
2013-4-22
在线时间
335 小时
发表于 2020-6-11 09:06:07 | 显示全部楼层
动态扫描就有这个问题
回复

使用道具 举报

0

主题

78

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1590
金钱
1590
注册时间
2018-10-11
在线时间
224 小时
发表于 2020-6-11 10:34:05 | 显示全部楼层
本帖最后由 spritels 于 2020-6-11 10:44 编辑


建议用定时器控制扫描的时间,8位数码管,20ms内扫一次应该看不出闪动(50Hz扫描频率其实有些人还是觉得有一点点闪,可以再快一些)...
回复

使用道具 举报

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

本版积分规则



关闭

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

正点原子公众号

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

GMT+8, 2024-11-23 09:18

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

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