电子工程师技术服务社区
公告
登录
|
注册
首页
技术问答
厂商活动
正点原子
板卡试用
资源库
下载
文章
社区首页
问答
关于数码管闪烁的问题
已解决
73482
个问题
已帮助
5993
位优秀工程师
关于数码管闪烁的问题
韩梅梅
2021-02-05
浏览量:2193
用数码管做了数字钟,运行没有什么问题,但是加了流水灯之后,数码管会闪烁,这是怎么回事?应该怎么解决?求大佬指教!
代码如下:#include<regx51.h>
#define uint unsigned int
#define uchar unsigned char
sbit s1 = P3^2;//闹钟开关
sbit s2 = P3^3;//设置
sbit s3 = P3^4;//小时键
sbit s4 = P3^5;//分
sbit s5 = P3^6;//退出键
sbit fs = P3^0;//蜂鸣器
sbit d = P3^1;//小灯
unsigned char mfsw;//秒,分,时,计数器
uchar f_naos_nao;//闹钟分,时
bit flag_nao;//闹钟标志
void zuo();
void you();
void delay(uint i);
//void ledscan(uchar huchar muchar s);
void alarm();
void tiaojie();
void delay(uint i)
{
while(i--);
}
void zuo()
{unsigned char d;
unsigned char a = 0x01;
for(d = 0;d<8;d++)
{
P0 = ~a;
delay(1);
a = a<<1;
}
if(a == 0)
{
a = 0x01;
}
}
void ledscan(uchar huchar muchar s) reentrant
{
uchar LED[]={0x3f0x060x5b0x4f0x660x6d0x7d0x070x7f0x6f};
uint j;
P1 = LED[s%10];
P2 = 0x7f;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = LED[s/10];
P2 = 0xbf;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = 0x40;
P2 = 0Xdf;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = LED[m%10];
P2 = 0xef;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = LED[m/10];
P2 = 0xf7;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = 0x40;
P2 = 0xfb;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = LED[h%10];
P2 = 0xfd;
for(j = 0;j<100;j++);
P2 = 0xff;
P1 = LED[h/10];
P2 = 0xfe;
for(j = 0;j<100;j++);
P2 = 0xff;
}
void tiaojie()
{
if(s3 == 0)
{
ledscan(sfm);
if(s3 == 0)
{
if(s == 23)
s = 0;
else
s++;
while(!s3)ledscan(sfm);
}
}
else if(s4 == 0)
{
ledscan(sfm);
if(s4 == 0)
{
if(f == 59)
f = 0;
else
f++;
while(!s4)ledscan(sfm);
}
}
}void alarm()
{
//uchar a;
if(flag_nao)
{
if(f==f_nao&&s==s_nao)
{
while(m<=5&&flag_nao)
{
fs = ~fs;
ledscan(sfm);}
}
}
}
void t0() interrupt 1
{
TH0 = (65536-50000)/256;
TL0 = (65536-50000)%256;
w++;
if(w == 20)
{
w = 0;
m++;
if(m == 60)
{
f++;
m = 0;
if(f == 60)
{s++;
f = 0;
if(s == 24)
s = 0;}
}
}zuo();
}
void guan_naozhong() interrupt 0
{
flag_nao = ~flag_nao;
d = ~d;
while(!s1)ledscan(sfm);
}
void naozhong()interrupt 2
{
f_nao = f;
s_nao = s;
while(s5)
{
ledscan(s_naof_nao0);
if(s3 == 0)
{
ledscan(s_naof_nao0);
if(s3 == 0)
{
if(s_nao == 24)s_nao =0;
else s_nao++;
}
while(!s3) ledscan(s_naof_nao0);
}
else if(s4 == 0)
{
ledscan(s_naof_nao0);
if(s4 == 0)
{
if(f_nao == 59)f_nao =0;
else f_nao++;
}
while(!s4)
ledscan(s_naof_nao0);
}
}
}
void main()
{
TMOD = 0X01;
TH0 =(65536 - 50000)/256;
TL0 =(65536 - 50000)%256;
TR0 = 1;
ET0 = 1;
IT1 = 1;
IT0 = 0;
EX1 = 1;
EX0 = 1;
PT0 = 1;
EA = 1;
f = 0;
m = 0;
fs = 0;
flag_nao = 0;
while(1)
{
ledscan(sfm);
tiaojie();
alarm();
//zuo();
}
}
显示全部
单片机
关注问题
写回答
0
0
收起
我来回答
上传资料:
选择文件
文件大小不超过15M(格式支持:doc、ppt、xls、pdf、zip、rar、txt)
最佳答案
xdsnet
刷新率不够,或者置位方式不恰当,造成数据位都是先清除后置位。 可以看看具体显示函数处理方式是否可以调整。
发布于
2021-02-05
举报
评论 0
0
0
其他答案
数量:
4
yhj416606438
数码管显示应该放在定时中断里刷新,如果在主循环里面那么干扰显示的
发布于
2021-02-05
举报
评论 0
0
0
一笔之名也
闪烁的问题,一般是延时时间太长了,也就是没有让人眼看上去是静态的,加快刷新速度就行了
发布于
2021-02-07
举报
评论 0
0
0
SunnyPlus
流水灯和数码管有很多种方法去做,墙裂建议学习一下状态机思维,彻彻底底的把傻延时机制去掉,让代码运行效率飞起来,实现伪多线程效果。
发布于
2021-02-07
举报
评论 0
0
0
莱克迷KW
刷新的速度是不够的,太慢了,或是主程序中有其他的程序点用了过长时间了
发布于
2021-02-07
举报
评论 0
0
0
相关问题
问题达人
换一批
文章
知识经验换现金
换一批
关于数码管闪烁的问题
写回答
关注问题
×
我要举报该内容,理由是:
内容质量差:
内容太水、伸手党
垃圾广告信息:
广告、招聘、推广、测试内容等
偏离问答主题:
与技术无关、讨论类
与社区已有内容重复:
违规内容:
色情、暴力、血腥、敏感信息等
不友善内容:
人事攻击、挑衅辱骂、恶意行为
以上选项都不是: