找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机数码管显示问题(按键一次,数码管加一)新人求助!

[复制链接]
跳转到指定楼层
楼主
我自己刚学,想实现一个功能,功能是:三个数码管分别显示个十百位,按键按下一次,数码管加一,就是相当于用程序编了一个计数器。
计数没有问题,进位也没有问题,但是现在的问题是:仿真开始后,没有操作的时候,只有两个数码管亮,就是不按下按键的时候前两个数码管亮,按下按键后不松开,最后一个数码管亮。我想知道我程序哪里错了,为什么不能三个数码管同时亮。还有就是是不是要用中断才能保证按下按键的时候数码管也是亮着的呢,或者用啥方法按下按键的时候三个数码管也亮着。(中断我还没看)谢谢各位大神指点。



  1. #include "reg52.h"
  2. #define smg P2   //定义数码管显示端口
  3. #define uint unsigned int
  4. sbit p1=P3^0;
  5. sbit p2=P3^1;
  6. sbit p3=P3^2;
  7. sbit p4=P3^3;
  8. sbit p5=P3^4;
  9. sbit p6=P3^5;    //定义数码管6个片选端口
  10. sbit k1=P1^0;   //定义按键

  11. uint code smgduan[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};  //共阴极数码管


  12. void delay(uint i)   //延时子程序
  13.   {
  14.    while(i--) ;
  15.   }




  16. void main()
  17. {
  18. uint g=0;
  19. uint s=0;
  20. uint b=0;
  21. uint j=0;         // 定义个十,百,位。

  22.   while(1)
  23.   {
  24.      if(k1==0)              //如果按键按下
  25.          {         
  26.             delay(100);     //削抖
  27.                 g++;         //个位加一
  28.                 if(g>9)      //判断是否向十位进位
  29.                 {
  30.                  s++;
  31.                  g=0;
  32.                 }
  33.             delay(1000);
  34.                 if(s>9)    //判断是否向百位进位   
  35.                 {
  36.                  b++;
  37.                  s=0;
  38.                 }

  39.                 if(b>9)    //判断是否归零,即到达999
  40.                 {
  41.          g=0;
  42.                  s=0;
  43.                  b=0;  
  44.                 }
  45.           }
  46.          while(k1==0)     //判断按键是否恢复
  47.            {
  48.               j=j;        //未恢复原位则循环此程序,直到恢复原位跳出,继续执行
  49.             }
  50.          
  51.          p1=0;              
  52.          p2=1;
  53.          p3=1;
  54.          p4=1;
  55.          p5=1;
  56.          p6=1;             //片选
  57.          smg=smgduan[b];   //显示百位
  58.          delay(100);

  59.                   
  60.          p1=1;
  61.          p2=0;
  62.         p3=1;
  63.          p4=1;
  64.          p5=1;
  65.          p6=1;
  66.          smg=smgduan[s];    //显示十位
  67.          delay(100);

  68.                   
  69.          p1=1;
  70.          p2=1;
  71.          p3=0;
  72.          p4=1;
  73.          p5=1;
  74.          p6=1;
  75.          smg=smgduan[g];   //显示个位
  76.          delay(100);
  77.   }
  78. }                  
复制代码
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:206560 发表于 2017-6-9 03:55 | 只看该作者
消抖动和按键放开有冲突。 消抖动是 先判断按下,然后计数,放开时检查 计数(时间),如果时间很短,认为是抖动,不予理睬,继续等待按下。
回复

使用道具 举报

板凳
ID:209318 发表于 2017-6-13 09:42 | 只看该作者
wangminfu 发表于 2017-6-9 03:55
消抖动和按键放开有冲突。 消抖动是 先判断按下,然后计数,放开时检查 计数(时间),如果时间很短,认为 ...

谢谢,那为啥我那个明明是选择了三个数码管,怎么同时只能亮一个
回复

使用道具 举报

地板
ID:210587 发表于 2017-6-13 17:09 | 只看该作者
//你的程序改起来好辛苦,从新写了个,你试试
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit k1=P1^0;
uchar bai,shi,ge;
uint code table[]=
{0x3f,0x06,0x5b,0x4f,0x66,0x6d,
0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};  //共阴极数码管
void delay(uchar xms)//x毫秒的延时程序,你的延时程序问题太大了,while不是那么用的
{
        uchar i,j;
        for(i=xms;i>0;i--)
                for(j=110;j>0;j--);
}
void display()//显示程序
{
        P3=0xff;//清屏
        delay(5);
        P3=0xfe;//位选
        P2=table[bai];
        delay(5);
        P3=0xff;
        delay(5);
        P3=0xfd;
        P2=table[shi];
        delay(5);P3=0xff;
        delay(5);
        P3=0xfb;
        P2=table[ge];
        delay(5);
}
void keyboard()//键盘扫描程序
{
        if(k1==0)
        {
                delay(10);
                if(k1==0)
                {
                        while(!k1);//等待按键释放
                        ge++;
                        if(ge>9)
                        {
                                ge=0;
                                shi++;
                        }
                        if(shi>9)
                        {
                                shi=0;
                                bai++;       
                        }
                        if(bai>9)
                        {
                                ge=0;
                                shi=0;
                                bai=0;
                        }
                }
        }
}
void main()
{
        bai=0;
        shi=0;
        ge=0;
        while(1)
        {
                display();
                keboard();
}
回复

使用道具 举报

5#
ID:884223 发表于 2021-2-21 22:09 | 只看该作者
year1987 发表于 2017-6-13 17:09
//你的程序改起来好辛苦,从新写了个,你试试
#include
#define uchar unsigned char

蟹蟹大神,i了i了
回复

使用道具 举报

6#
ID:883031 发表于 2021-2-25 11:07 | 只看该作者
消完抖以后还要判断键是否按下。
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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