找回密码
 立即注册

QQ登录

只需一步,快速开始

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

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

  [复制链接]
跳转到指定楼层
#
ID:74603 发表于 2015-3-23 19:43 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
#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);
        
}

按键按下,数码管只显示最后一个个位,好无奈啊 ,试了好长时间!
刚开始学51,希望大虾们详细给说一下什么原因,要怎么修改。。。

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

使用道具 举报

18#
ID:893997 发表于 2021-12-30 15:59 | 只看该作者
循环被中断了
回复

使用道具 举报

17#
ID:843860 发表于 2021-12-13 18:41 | 只看该作者
加三极管和译码器了吗,你得锁住
回复

使用道具 举报

16#
ID:899663 发表于 2021-12-13 18:18 | 只看该作者
你的按键是轮询方式,将按键改用中断处理,就不会有这个问题
回复

使用道具 举报

15#
ID:163125 发表于 2021-12-13 09:48 | 只看该作者
去GitHub找个按键的驱动吧,比自己写的强多了,功能还多
回复

使用道具 举报

14#
ID:523803 发表于 2021-12-13 08:54 | 只看该作者
把数码管显示放进定时器也行,同时在大循环运行会有影响
回复

使用道具 举报

13#
ID:968760 发表于 2021-12-9 15:26 | 只看该作者
消除按键抖动
回复

使用道具 举报

12#
ID:161164 发表于 2021-12-9 14:16 | 只看该作者
阮经天下 发表于 2021-12-7 18:40
怎么改的,大神,请详细指教一下,我也是新手,多谢

        if (K1==0)
                {
                        delayms(10);
                        if (K1==0 && K1_Bit == 0)
                        {
                                num=0;
                                K1_Bit = 1;//bit K1_Bit
                        }
        }else{
                K1_Bit = 0;
        }
回复

使用道具 举报

11#
ID:985389 发表于 2021-12-7 18:40 来自手机 | 只看该作者
yyqwade1028 发表于 2016-10-17 20:36
大神 请收下我的膝盖 完美的解决了我的问题 太厉害了!!

怎么改的,大神,请详细指教一下,我也是新手,多谢
回复

使用道具 举报

10#
ID:150728 发表于 2016-11-28 15:01 | 只看该作者
要贴上原理图,才能更好理解你的程序。貌似key()函数里有问题:判断KEY变量,启动T0计时器,后面又是while循环语句。感觉MCU在这里耗时了,影响数码管的动态扫描。
回复

使用道具 举报

9#
ID:150712 发表于 2016-11-28 12:05 | 只看该作者
分时复用了引脚吧
回复

使用道具 举报

8#
ID:150703 发表于 2016-11-28 11:10 | 只看该作者
死循环,等待按键松手,程序没有执行扫描数码管
回复

使用道具 举报

7#
ID:150658 发表于 2016-11-28 10:54 | 只看该作者
你好!你写数码管的显示函数那部分都有bai shi ge 三个变量,则你在声明函数时也要给三个参数.
回复

使用道具 举报

6#
ID:150381 发表于 2016-11-26 18:33 | 只看该作者
努力。细心点吧。加油
回复

使用道具 举报

5#
ID:111634 发表于 2016-11-26 17:39 | 只看该作者
应该在保持显示的同时,检测键盘。
回复

使用道具 举报

地板
ID:74868 发表于 2016-11-26 15:07 | 只看该作者
应该把显示时间延长一些
回复

使用道具 举报

板凳
ID:143116 发表于 2016-10-17 20:36 | 只看该作者
admin 发表于 2015-3-23 22:21
while(!key1);,你程序中的这一句,意思是,等待按键松手。可见他一直在执行死循环。所以这个时候,数码管 ...

大神 请收下我的膝盖 完美的解决了我的问题 太厉害了!!
回复

使用道具 举报

沙发
ID:75575 发表于 2015-3-29 14:09 | 只看该作者
  1. if (K1==0)
  2.                 {
  3.                         delayms(10);
  4.                         if (K1==0)
  5.                         {
  6.                                 num=0;
  7.                                 while(!K1);
  8.                         }
复制代码
感觉你应该在键盘检测时候进行软件延时消除抖动   比如这个程序

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的积分奖励!

查看全部评分

回复

使用道具 举报

楼主
ID:1 发表于 2015-3-23 22:21 来自手机 | 只看该作者
while(!key1);,你程序中的这一句,意思是,等待按键松手。可见他一直在执行死循环。所以这个时候,数码管的扫描也停止了,因此,出现那只有一个数码管亮的情况。不知道这样说你能不能够理解
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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