关于4位数码管的动态显示问题,新手虚心求教,有空的大兄弟进来看看

2019-03-24 18:06发布

以下是程序,下载到板子上不能实现一秒变化一次,大概8秒才一次
#include<reg52.h>
typedef unsigned char uint8;
typedef unsigned int  uint16;
typedef unsigned long uint32;

code uint8 number[] = {0xc0,0xf9,0xa4,0xb0,
                                                              

                       0x99,0x92,0x82,0xf8,
                                                              

                       0x80,0x90,0x88,0x83,
                                                              

                       0xa7,0xa1,0x86,0x8e}; //【16进制数组】
uint8  i = 0;
uint16 counter = 0;

//sbit ENLED = P1^4;
sbit SMG1 = P3^4;
sbit SMG2 = P3^5;
sbit SMG3 = P3^6;
sbit SMG4 = P3^7;

void timer1_init()                //定时器初始化
{
        TMOD |= 0x01;
        TH1   = 0xfc;
        TL1   = 0x67;                //1ms
        TR1   = 1;
}

void int_init()                        //中断初始化
{
        ET1 = 1;
        EA  = 1;
}

main()
{
        P0 = 0xff;P3 = 0xff;
    timer1_init();
        int_init();
        while(1);
}

void refresh() //数码管动态扫描显示
{
        static uint8 j = 0;

        switch(j)
        {
                case 0: SMG1 = 0;P0 = number[i];break;
                case 1: SMG2 = 0;P0 = number[i];break;
                case 2: SMG3 = 0;P0 = number[i];break;
                case 3: SMG4 = 0;P0 = number[i];break;
                default: break;
        }
        if(3 == j++)
                j = 0;
}

void interrupt_timer1() interrupt 3
{
        TH1 = 0xfc;
        TL1 = 0x67;
        counter++;
        if(1000 == counter)
        {
                i++;
                if(15 == i)
                {
                        i = 0;
                }       
        }
        refresh();
}



附上原理图
在线等  谢谢各位了~~

此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
11条回答
MrKingMCU
1楼-- · 2019-03-25 17:32
1.晶振是多少?
2.一般在中断里不会再去处理其他东西,refresh();这个函数可以放到main()里。
3.在refresh();里定义的static uint8 j = 0;感觉总是怪怪的。
4.楼上所说的第一条是对的,你数码管估计重影会特别厉害。
5.有一点没看懂,就是你四位数码管显示的是同一个数字吧?是分四个路口吗?

你试着这样排查,把中断函数里的refresh函数注释掉,在i++后面直接控制LED闪烁,看一下闪烁频率是多少,如果正常的话,就是你refresh函数写的不对。
youyuchao
2楼-- · 2019-03-25 19:34
 精彩回答 2  元偷偷看……
le062
3楼-- · 2019-03-26 01:30
从代码来讲,应该会重影,但lz又没看到重影
lz可以做个方波输出,看看中断频率是多少。

也可以通过仿真器单步调,看运行时间
MrKingMCU
4楼-- · 2019-03-26 01:55
下次再写就这样写吧,仅供参考
void timer1_init()                //定时器初始化
{
        //初始化
}

void display(void)
{
        //显示函数
}

main()
{
        P0 = 0xff;P3 = 0xff;
            timer1_init();
        while(1)
        {
                if(timer>=1)
                {
                        dispaly_time++;
                        check_time++;
                        timer=0;
                }
                if(display_time>=Display_Timer)
                {
                        dispaly_time=0;
                        display();
                }
                if(check_time>=Check_Timer)
                {
                        check_time=0;
                        //定时加1
                }
        }
}


void interrupt_timer1() interrupt 3
{
        TH1 = 0xfc;
        TL1 = 0x67;
        timer++;
}
youyuchao
5楼-- · 2019-03-26 07:03
 精彩回答 2  元偷偷看……

一周热门 更多>