打印

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

[复制链接]
2076|20
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
yufe|  楼主 | 2019-2-20 13:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
#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);
        
}

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

使用特权

评论回复
板凳
wangpe| | 2019-2-20 13:24 | 只看该作者

感觉你应该在键盘检测时候进行软件延时消除抖动了

使用特权

评论回复
地板
wangzsa| | 2019-2-20 13:28 | 只看该作者
显然是while(!key1);这个死循环惹祸的吧

使用特权

评论回复
5
zhuww| | 2019-2-20 13:32 | 只看该作者
数码管的扫描停止了,因此,出现那只有一个数码管亮的情况。

使用特权

评论回复
6
zhanglli| | 2019-2-20 13:35 | 只看该作者
进来看看,死循环貌似初学的时候常常会遇到类似的问题吧

使用特权

评论回复
7
lium| | 2019-2-20 13:39 | 只看该作者

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

使用特权

评论回复
8
guoyt| | 2019-2-20 13:43 | 只看该作者
像这种应用方式,初学者尽量少用,多用一些直接判断的,例如if。。。else。。。    while(!key1);


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

使用特权

评论回复
9
llia| | 2019-2-20 13:46 | 只看该作者

while(!key1);这个语句还必须要,如果没有的话会多次执行按键处理函数

使用特权

评论回复
10
wangpe| | 2019-2-20 13:50 | 只看该作者

按键等待里加上消影处理~

使用特权

评论回复
11
yufe|  楼主 | 2019-2-20 13:53 | 只看该作者
嗯,预料中的结果,先结贴吧,多谢大家啦

使用特权

评论回复
12
smilingangel| | 2019-2-24 21:38 | 只看该作者
这不是简单的按键中断识别驱动IO口的么?

使用特权

评论回复
13
tongbu2015| | 2019-2-27 23:59 | 只看该作者
这个是IO口的配置有问题的多检查下你的程序的

使用特权

评论回复
14
chuntian2016| | 2019-2-28 20:53 | 只看该作者
还是加强程序的设计的吧

使用特权

评论回复
15
chuntian2016| | 2019-2-28 20:54 | 只看该作者
这个要调节好延时的长短

使用特权

评论回复
16
vibra2016| | 2019-2-28 21:04 | 只看该作者
这个最重要的是调整延时时间的

使用特权

评论回复
17
vibra2016| | 2019-2-28 21:05 | 只看该作者
吧这个delay(10)的搞掉的看看效果的

使用特权

评论回复
18
mcufz| | 2019-3-13 09:25 | 只看该作者
while(!key1);,你程序中的这一句,意思是,等待按键松手。可见他一直在执行死循环。

使用特权

评论回复
19
tongbu2015| | 2019-3-23 22:07 | 只看该作者
这个原本要实现的功能是什么的?

使用特权

评论回复
20
tongbu2015| | 2019-3-23 22:08 | 只看该作者
这个有可能是按键事件处理的时候影响了灯的驱动的

使用特权

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

本版积分规则

983

主题

10170

帖子

1

粉丝