打印
[疑难问答]

单片机按键时,数码管会闪烁一下。原因是什么

[复制链接]
1393|10
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
hfdy01|  楼主 | 2016-11-9 21:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
uchar  tt,bai,shi,ge;
uint count=300;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
sbit dula=P2^6;
sbit wela=P2^7;
sbit key1=P3^4;
sbit key2=P3^5;
void delay(uchar z);
void init();
void key();
void display(uint count);
void main()
{
        dula=1;
        P0=0;
        dula=0;
        wela=1;
        P0=0xf8;
        wela=0;
        init();
        while(1)
        {
                key();
                display(count);
               
               
        }
}

void delay(uchar z)
{
        int i,j;
        for(i=z;i>0;i--)
                for(j=110;j>0;j--);
}

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

}

void timer_0() interrupt 1
{        
        TH0=(65536-50000)/256;
        TL0=(65536-50000)%256;
        tt++;
        if(tt==20)
        {
                tt=0;
                count--;
        }        
}

void key()
{
        if(key1==0)
        {
                delay(10);
                if(key1==0)
                {
                        TR0=1;
               
                }
                while(!key1);
        }
}

void display(uint count)
{
            delay(10);
                bai=count/100;
                shi=(count-bai*100)/10;
                ge=count%10;

                dula=1;
                P0=table[bai];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xfe;
                wela=0;
                delay(2);

                dula=1;
                P0=table[shi];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xfd;
                wela=0;
                delay(3);

                dula=1;
                P0=table[ge];
                dula=0;
                P0=0xff;
                wela=1;
                P0=0xfb;
                wela=0;        
                        delay(3);
        
}

按键按下,数码管只显示最后一个个位,好无奈啊 ,试了好长时间!
沙发
CallReceiver| | 2016-11-9 21:24 | 只看该作者
while(!key1);,你程序中的这一句,意思是,等待按键松手。可见他一直在执行死循环。

使用特权

评论回复
板凳
boy1990| | 2016-11-9 21:26 | 只看该作者
感觉你应该在键盘检测时候进行软件延时消除抖动了

使用特权

评论回复
地板
sourceInsight| | 2016-11-9 21:30 | 只看该作者
显然是while(!key1);这个死循环惹祸的吧

使用特权

评论回复
5
bbapple| | 2016-11-9 21:32 | 只看该作者
数码管的扫描停止了,因此,出现那只有一个数码管亮的情况。

使用特权

评论回复
6
handleMessage| | 2016-11-9 21:35 | 只看该作者
进来看看,死循环貌似初学的时候常常会遇到类似的问题吧

使用特权

评论回复
7
icecut| | 2016-11-9 23:33 | 只看该作者
handleMessage 发表于 2016-11-9 21:35
进来看看,死循环貌似初学的时候常常会遇到类似的问题吧

的确是初学者常犯的错误...老手就不会了...
建议 lz 看http://antriver.com/mcudoc/546330dea501fb6e04d74c3b
顺便从里面的下载链接看老司机的代码

使用特权

评论回复
8
songchenping| | 2016-11-10 08:34 | 只看该作者
像这种应用方式,初学者尽量少用,多用一些直接判断的,例如if。。。else。。。    while(!key1);


就像结构体之类的,也尽量少用,可读性比较差

使用特权

评论回复
9
lihui567| | 2016-11-10 09:42 | 只看该作者
while(!key1);这个语句还必须要,如果没有的话会多次执行按键处理函数

使用特权

评论回复
10
sl_168| | 2016-11-10 10:34 | 只看该作者
按键等待里加上消影处理~

使用特权

评论回复
11
hfdy01|  楼主 | 2017-12-5 22:59 | 只看该作者
嗯,预料中的结果,先结贴吧,多谢大家啦

使用特权

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

本版积分规则

78

主题

1578

帖子

1

粉丝