找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2463|回复: 5
打印 上一主题 下一主题
收起左侧

单片机数码管显示错误问题,偶数次循环出错

[复制链接]
跳转到指定楼层
楼主
我在练习数码管循环显示时,奇数次循环没有问题如第一张图,偶数次循环都会出现第二张图的问题,反复看了代码感觉没有问题,还想请教各位我这里是出现了什么问题,谢谢

#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code tabledu[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d};       //,0x07,0x6f,0x77,0x7c,0x58,0x5e,0x7b,0x71};
uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};          //,0xbf,0x7f};
sbit wela=P2^7;
sbit dula=P2^6;
uint a,num1,num2;
void init();
void main()
{
        init();
        while(1)
        {
                if(a==20)
                {
                        num1++;
                        num2--;
                        if(num1>5)
                        {
                                num1=0;
                                num2=5;
                        }
                        P0=tablewe[num1];
                        wela=1;
                        wela=0;
                        P0=tabledu[num2];
                        dula=1;
                        dula=0;
                        a=0;
                }
        }               
}

void init()
{
        TMOD=0x11;
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;
        EA=1;
        ET1=1;
        TR1=1;
        num1=0;
        num2=5;
        wela=1;
        P0=tablewe[num1];
        wela=0;
        dula=1;
        P0=tabledu[num2];
        dula=0;        
}

void timer1() interrupt 3
{
        a++;        
        TH1=(65536-50000)/256;
        TL1=(65536-50000)%256;        
}

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:434390 发表于 2019-4-22 08:06 | 只看该作者
timer1中断里面提取段码译码位选
回复

使用道具 举报

板凳
ID:213173 发表于 2019-4-22 11:47 | 只看该作者
动态数码管显示需要1~5ms显示1位,根据数码管显示位数扫描一轮不要超过20ms。改这样试试。
#include<reg52.h>
#include<intrins.h>
#define uint unsigned int
#define uchar unsigned char
uchar code tabledu[]={0x06,0x5b,0x4f,0x66,0x6d,0x7d};       //,0x07,0x6f,0x77,0x7c,0x58,0x5e,0x7b,0x71};
uchar code tablewe[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf};          //,0xbf,0x7f};
sbit wela=P2^7;
sbit dula=P2^6;
uchar num1,num2;
uint b;
bit a;
void init();

void main()
{
        init();
        while(1)
        {
                if(a==1)
                {
                        a=0;
                        b++;
                        num1++;
                        if(num1>5)
                                num1=0;
                        if(b>=500)
                        {
                                b=0;
                                num2--;
                                if(num2>5)
                                        num2=5;
                        }
                        P0=tablewe[num1];
                        wela=1;
                        wela=0;
                        P0=tabledu[num2];
                        dula=1;
                        dula=0;
                }
        }
}

void init()
{
    TMOD=0x10;
    TH1=(65536-2000)/256;
    TL1=(65536-2000)%256;
    EA=1;
    ET1=1;
    TR1=1;
    num1=0;
    num2=5;
//    wela=1;
//    P0=tablewe[num1];
//    wela=0;
//    dula=1;
//    P0=tabledu[num2];
//    dula=0;        
}

void timer1() interrupt 3
{      
    TH1=(65536-2000)/256;
    TL1=(65536-2000)%256;        
    a=1;
}
回复

使用道具 举报

地板
ID:462827 发表于 2019-4-22 14:04 | 只看该作者
你想要实现什么效果?这个不说清楚不行的
回复

使用道具 举报

5#
ID:476725 发表于 2019-4-27 22:20 | 只看该作者
wulin 发表于 2019-4-22 11:47
动态数码管显示需要1~5ms显示1位,根据数码管显示位数扫描一轮不要超过20ms。改这样试试。
#include
#inc ...

感谢,问题已解决,我改成在打开段选和位选控制之前先给P0赋值就没问题了。
回复

使用道具 举报

6#
ID:476725 发表于 2019-4-27 22:20 | 只看该作者
snni00 发表于 2019-4-22 08:06
timer1中断里面提取段码译码位选

感谢,问题已解决,我改成在打开段选和位选控制之前先给P0赋值就没问题了。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表