专家
公告
财富商城
电子网
旗下网站
首页
问题库
专栏
标签库
话题
专家
NEW
门户
发布
提问题
发文章
51单片机
新手请教大神关于51单片机数码管闪烁程序
2019-07-15 10:15
发布
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
站内问答
/
51单片机
12977
4
1028
51
单片机
C语言程序想要控制四个数码管同时亮,并且其中一个闪烁并可通过键盘调节,通过按键使可调节的位(也就是闪烁的位)移动到下一位,类似于
电子
钟的程序。新手不知道应该把延时加在动态显示的什么位置。
友情提示:
此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
wulinwl
2019-07-15 18:52
本帖最后由 wulinwl 于 2017-7-13 17:51 编辑
正常数码管动态显示为避免闪烁需要每一位显示时间约1ms,8位显示一轮约10ms。如果刻意需要某一位数码管在特定时间处于1s周期闪烁,也就是说该位数码管500ms同其他一样发光,500ms处于熄灭状态。这最好用定时器中断来处理数码管动态显示程序。由按键程序得到的设定位置变量与数码管动态显示的位变量加时间变量来确定某一位数码管发光或熄灭。这个程序不难,但切不可用delay软件延时处理。否则所有数码管都闪烁或不亮。给你一个思路例程参考。/******定时器0初始化程序******/
void Timer0Init(void) //1毫秒@12.000MHz
{
TMOD = 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开定时器0中断
}
/******定时器0中断服务程序******/
void timer0() interrupt 1
{
TL0 = 0x18; //设置定重载值
TH0 = 0xFC; //设置定重载值
Cnt_ms++; //1ms变量自+1
if(Cnt_ms>=1000) //1秒
{
Cnt_ms=0;
count++; //轮流显示计数
if(count>=4) //显示程序
{
count=0;
switch(count)
{
case 0:
//显示段语句
//显示位前先判断条件,下同
if((a==1)&(count<500))//满足两个条件执行以下语句,a=键值0~4,0为初始态,这里无效
{
//关闭位语句
}
else
{
//显示位语句
}
break;
case 1:
//显示段语句
if((a==2)&(count<500))//满足两个条件执行以下语句,a=键值
{
//关闭位语句
}
else
{
//显示位语句
}
break;
case 2:
//显示段语句
if((a==3)&(count<500))//满足两个条件执行以下语句,a=键值
{
//关闭位语句
}
else
{
//显示位语句
}
break;
case 3:
//显示段语句
if((a==4)&(count<500))//满足两个条件执行以下语句,a=键值
{
//关闭位语句
}
else
{
//显示位语句
}
break;
}
}
}
}
补充内容 (2017-7-14 15:54):
程序有错误,5楼是更改后的程序。
加载中...
查看其它4个回答
一周热门
更多
>
相关问题
【东软载波ESF0654 PDS开发板活动】开箱
1 个回答
东软载波ESF0654 PDS开发板外部中断
1 个回答
东软载波ESF0654 PDS开发板高级控制定时器AD16C4T
1 个回答
用串口调试助手为什么只能在hex模式接收发送而在文本模式不行
9 个回答
触摸芯片SC02B/SC04B在地砖灯的设计方案
1 个回答
相关文章
51单片机与蓝牙模块连接
0个评论
51单片机的硬件结构
0个评论
基于51单片机的无线遥控器制作
0个评论
51单片机 AD转换
0个评论
51单片机数码管递增显示
0个评论
如何实现对单片机寄存器的访问
0个评论
基于51单片机的指纹密码锁
0个评论
×
关闭
采纳回答
向帮助了您的知道网友说句感谢的话吧!
非常感谢!
确 认
×
关闭
编辑标签
最多设置5个标签!
51单片机
保存
关闭
×
关闭
举报内容
检举类型
检举内容
检举用户
检举原因
广告推广
恶意灌水
回答内容与提问无关
抄袭答案
其他
检举说明(必填)
提交
关闭
×
打开微信“扫一扫”,打开网页后点击屏幕右上角分享按钮
×
付费偷看金额在0.1-10元之间
确定
×
关闭
您已邀请
0
人回答
查看邀请
擅长该话题的人
回答过该话题的人
我关注的人
正常数码管动态显示为避免闪烁需要每一位显示时间约1ms,8位显示一轮约10ms。如果刻意需要某一位数码管在特定时间处于1s周期闪烁,也就是说该位数码管500ms同其他一样发光,500ms处于熄灭状态。这最好用定时器中断来处理数码管动态显示程序。由按键程序得到的设定位置变量与数码管动态显示的位变量加时间变量来确定某一位数码管发光或熄灭。这个程序不难,但切不可用delay软件延时处理。否则所有数码管都闪烁或不亮。给你一个思路例程参考。/******定时器0初始化程序******/
void Timer0Init(void) //1毫秒@12.000MHz
{
TMOD = 0x01; //设置定时器模式
TL0 = 0x18; //设置定时初值
TH0 = 0xFC; //设置定时初值
TR0 = 1; //定时器0开始计时
EA=1; //开总中断
ET0=1; //开定时器0中断
}
/******定时器0中断服务程序******/
void timer0() interrupt 1
{
TL0 = 0x18; //设置定重载值
TH0 = 0xFC; //设置定重载值
Cnt_ms++; //1ms变量自+1
if(Cnt_ms>=1000) //1秒
{
Cnt_ms=0;
count++; //轮流显示计数
if(count>=4) //显示程序
{
count=0;
switch(count)
{
case 0:
//显示段语句
//显示位前先判断条件,下同
if((a==1)&(count<500))//满足两个条件执行以下语句,a=键值0~4,0为初始态,这里无效
{
//关闭位语句
}
else
{
//显示位语句
}
break;
case 1:
//显示段语句
if((a==2)&(count<500))//满足两个条件执行以下语句,a=键值
{
//关闭位语句
}
else
{
//显示位语句
}
break;
case 2:
//显示段语句
if((a==3)&(count<500))//满足两个条件执行以下语句,a=键值
{
//关闭位语句
}
else
{
//显示位语句
}
break;
case 3:
//显示段语句
if((a==4)&(count<500))//满足两个条件执行以下语句,a=键值
{
//关闭位语句
}
else
{
//显示位语句
}
break;
}
}
}
}
补充内容 (2017-7-14 15:54):
程序有错误,5楼是更改后的程序。
一周热门 更多>