打印
[51单片机]

数码管计数时十位只闪一下的问题

[复制链接]
1147|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
咸鱼翻身|  楼主 | 2019-6-19 09:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位前辈好,我是一枚刚接触单片机和C语言的小白,网上下载了郭天祥C51的教学视频,学了一段时间,昨晚遇到了一个问题,利用中断做“0~99”的计数,但十位显示不正常,只在个位数变化的时候闪一下立马就灭了,一直找不出原因,都几乎快要照搬例程了,望各位帮忙看下是哪出了问题,谢谢了

#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
uchar snap,temp;
sbit CS = P2^7;//数码管位选
sbit SEG = P2^6;//数码管段选
void delay(uchar z);
void init();//中断初始化
void display();
uchar Ten,SD;
uchar code SEGData[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};

int main(void)
{
        init();
        snap = 0;
       
        while(1)
        {
                if(temp == 20)
         {
                temp = 0;
                snap++;//中断20次后计数+1
       
            Ten = snap/10;//十位
            SD = snap%10;//个位
                display();
                if(snap == 100)
                        snap = 0;
         }
        }
}
void init()
{
        EA = 1;
        TMOD = 0x01;
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;
        ET0 = 1;
        TR0 = 1;
        temp = 0;
}

void timer0() interrupt 1
{
        TH0 = (65536-50000)/256;
        TL0 = (65536-50000)%256;
        temp++;
}

void display()
{
        P0 = 0xff;
        CS = 1;
        P0 = 0xfe;
    CS = 0;
       
        SEG = 1;
        P0 = SEGData[Ten];
        SEG = 0;
        delay(5);
       
        P0 = 0xff;
        CS = 1;
        P0 = 0xfd;
        CS = 0;
       
        SEG = 1;
        P0 = SEGData[SD];
        SEG = 0;
        delay(5);
}

void delay(uchar z)
{
        uchar x,y;
        for(x=100;x>0;x--)
                for(y=z;y>0;y--);
}

使用特权

评论回复

相关帖子

沙发
ayb_ice| | 2019-6-19 09:59 | 只看该作者
int main(void)
{
        init();
        snap = 0;

        while(1)
        {
                if(temp >= 20)
                {
                        temp = 0;
                        snap++;//中断20次后计数+1
                        if(snap >= 100)
                        {
                                snap = 0;
                        }
                        Ten = snap/10;//十位
                        SD = snap%10;//个位
                        display();
                }
        }
}

使用特权

评论回复
板凳
咸鱼翻身|  楼主 | 2019-6-19 10:09 | 只看该作者
ayb_ice 发表于 2019-6-19 09:59
int main(void)
{
        init();

谢谢回复,不过好像还是不行呢,现象还是一样的

使用特权

评论回复
地板
ayb_ice| | 2019-6-19 10:17 | 只看该作者
咸鱼翻身 发表于 2019-6-19 10:09
谢谢回复,不过好像还是不行呢,现象还是一样的

int main(void)
{
        init();
        snap = 0;

        while(1)
        {
                if(temp >= 20)
                {
                        temp = 0;
                        snap++;//中断20次后计数+1
                        if(snap >= 100)
                        {
                                snap = 0;
                        }
                        Ten = snap/10;//十位
                        SD = snap%10;//个位
                }
                display();
        }
}

使用特权

评论回复
5
咸鱼翻身|  楼主 | 2019-6-19 10:29 | 只看该作者
ayb_ice 发表于 2019-6-19 10:17
int main(void)
{
        init();

可以了,非常感谢!然后我再重新打开例程,这个显示函数也是在这个if语句外面的,自己真是太眼拙了。然后我想了一下,是不是因为if在等待的过程中没有执行这个显示函数的原因呢?

使用特权

评论回复
6
ayb_ice| | 2019-6-19 10:36 | 只看该作者
咸鱼翻身 发表于 2019-6-19 10:29
可以了,非常感谢!然后我再重新打开例程,这个显示函数也是在这个if语句外面的,自己真是太眼拙了。然后 ...

是的

使用特权

评论回复
7
咸鱼翻身|  楼主 | 2019-6-19 10:41 | 只看该作者

好的,谢谢

使用特权

评论回复
8
QWE4562009| | 2019-8-28 15:28 | 只看该作者
咸鱼翻身 发表于 2019-6-19 10:29
可以了,非常感谢!然后我再重新打开例程,这个显示函数也是在这个if语句外面的,自己真是太眼拙了。然后 ...

啥意思 没看懂  楼主

使用特权

评论回复
9
QWE4562009| | 2019-8-28 15:31 | 只看该作者
咸鱼翻身 发表于 2019-6-19 10:29
可以了,非常感谢!然后我再重新打开例程,这个显示函数也是在这个if语句外面的,自己真是太眼拙了。然后 ...

display()虽然没有在if内不过还是在while里面循环啊  

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

3

主题

13

帖子

0

粉丝