新手请教大神关于51单片机数码管闪烁程序

2019-07-15 10:15发布

51单片机C语言程序想要控制四个数码管同时亮,并且其中一个闪烁并可通过键盘调节,通过按键使可调节的位(也就是闪烁的位)移动到下一位,类似于电子钟的程序。新手不知道应该把延时加在动态显示的什么位置。
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
4条回答
wulinwl
1楼-- · 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楼是更改后的程序。
人中狼
2楼-- · 2019-07-15 21:30
这里先定义一个概念,闪烁就是指需要闪烁的数码管在固定的周期内进行显示和关闭的交替动作。
这里有一个时间,就是闪烁周期,这个周期可以自己定义,并进行调节,以达到合适的效果。
闪烁的实现就是在数码管正常的显示过程中要判断是否需要闪烁,需要闪烁的是哪一位数码管,当前需要进行的是显示需要闪烁的数码管,还是要关闭需要闪烁的数码管。
至于闪烁动作的移动,也就是更改需要闪烁的数码管的位号即可。
@曲终人散@
3楼-- · 2019-07-16 02:35
 精彩回答 2  元偷偷看……
houjue
4楼-- · 2019-07-16 03:04
意思表达清晰,思路也就出来了~~~~~

一周热门 更多>