找回密码
 立即注册

QQ登录

只需一步,快速开始

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

为什么000-999的跑表按下暂停开关只显示个位,不显示十位和百位

[复制链接]
跳转到指定楼层
楼主
ID:1130102 发表于 2024-8-3 10:44 来自手机 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uint unsigned int
#define uchar unsigned char
sbit wela=P2^7;
sbit dula=P2^6;
sbit key1=P3^4;
sbit key2=P3^5;
sbit key3=P3^6;
sbit key4=P3^7;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,};
uchar bai,shi,ge,tt;
uint aa;
void init();
void delay(uint z);
void display(uchar bai,uchar shi,uchar ge);
void main()
{
        init();
        while(1)
        {
                bai=aa/100;
                shi=aa%100/10;
                ge=aa%10;
                display(bai,shi,ge);
                if(key1==0)
                {
                        delay(5);
                        if(key1==0)
                        {
                                TR0=0;
                        }
                        while(!key1);
                        delay(5);
                        while(!key1);
                }
                else
                        TR0=0;
            }
}


void init()
{
        aa=0;
        TMOD=0x01;
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        EA=1;
        ET0=1;
        TR0=1;
}

void timer0() interrupt 1
{
        TH0=(65536-1000)/256;
        TL0=(65536-1000)%256;
        tt++;
        if(tt==100)
        {
                tt=0;
                aa++;
        if(aa==999)
                aa=0;
    }
}


void display(uchar bai,uchar shi,uchar ge)
{
        wela=1;
        P0=0xfe;
        wela=0;
        dula=1;
        P0=table[bai];
        dula=0;
        delay(1);
       
        wela=1;
        P0=0xfd;
        wela=0;
        dula=1;
        P0=table[shi];
        dula=0;
        delay(1);
       
        wela=1;
        P0=0xfb;
        wela=0;
        dula=1;
        P0=table[ge];
        dula=0;
        delay(1);
}

void delay(uint z)
{
        uint x,y;
        for(x=z;x>0;x--)
         for(y=110;y>0;y--);
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1109793 发表于 2024-8-3 11:36 | 只看该作者
只显示个,百十显示0还是根本不亮?不暂停就显示正常了?
回复

使用道具 举报

板凳
ID:619259 发表于 2024-8-3 12:39 | 只看该作者
虽然没有原理图,但通过分析你的程序,几点建议:
1.你的案例,用到了两片锁存器分别驱动数码管的段和位,感觉有些浪费,用三个三极管驱动位端口就可以了。当然你的方案是为了节省IO口,但是驱动三位数码管就没那个必要了。
2.你遇到的问题:按下暂停开关只显示个位,不显示十位和百位。问题出在按键松手检测“while(!key1);”,程序运行到这里就进入死循环等待,按理应该是数码管全部熄灭,但是电路中有两个锁存器,能保持进入松手检测前的数据,根据你编写的动态显示函数,最先扫描的是百位,最后扫描的是个位,所以进入按键程序前是扫描个位,故松手检测时显示的是个位。
3.解决办法:在松手检测时继续调用显示函数。程序为:“while(!key1) display(bai,shi,ge);”
回复

使用道具 举报

地板
ID:1130102 发表于 2024-8-3 13:20 来自手机 | 只看该作者
xiaobendan001 发表于 2024-8-3 11:36
只显示个,百十显示0还是根本不亮?不暂停就显示正常了?

更本不亮,不暂停就正常跑
回复

使用道具 举报

5#
ID:1130102 发表于 2024-8-3 14:05 来自手机 | 只看该作者
xiaobendan001 发表于 2024-8-3 11:36
只显示个,百十显示0还是根本不亮?不暂停就显示正常了?

根本不亮,对不暂停是正常的
回复

使用道具 举报

6#
ID:69038 发表于 2024-8-3 14:14 | 只看该作者
程序架构的原因,所以按键后只显示个位是正常的:
因为你暂停后是原地空转,没有进行动扫显示,所以只能显示取后一次的数值,而你显示的最后一次就是个位数。
要想暂停后还能全屏显示,你可以再开一个定时器,这个就专门负责动态扫显,为了中断减少对其它进程的影响,一次中断只显示一个数,下一次中断显示下一个数。。。
原则上来说,暂停键也不是原地打转,而是关闭定时器的计数。。。
回复

使用道具 举报

7#
ID:1109793 发表于 2024-8-3 16:49 | 只看该作者
只显示个 的时候,亮度会变亮?看你住程序里面TR=0了,KEY1不管按不按都会TR=0啊。你那个计时怎么计的啊?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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