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

2019-07-15 10:15发布

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楼是更改后的程序。

一周热门 更多>