找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机怎么实现1位数码管按键下的静态显示0-9 我写的程序有问题

[复制链接]
跳转到指定楼层
楼主
这个代码有问题,按下按键不是按顺序从0-9的显示,是跳着显示,帮看看哪里错了。

单片机源程序:
  1. #include "reg52.h"
  2. #define uint unsigned int
  3. #define uchar unsigned char
  4. uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
  5.                      0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阳数码管码表
  6. sbit key_s1 = P3^2;  //独立按键S1
  7. uchar num;
  8. void delay(uint z);
  9. void main()

  10. {
  11.         uchar i;
  12.         P2 = 0xff;
  13.         while(1)
  14.         {
  15.            for(i=0;i<16;i++)
  16.            
  17.            if(key_s1 == 0)
  18.          {
  19.            delay(1000);
  20.            P0=~table[i];
  21.            
  22.            delay(20); //按键消抖
  23.            if(key_s1 == 0)
  24.            num++;
  25.            if(num == 10)
  26.            num = 0;
  27.            while(!key_s1); //松手检测
  28.          }
  29.         }
  30. }
  31.         void delay(uint z)
  32.         {
  33.          uint x,y;         for(x=z;x>0;x--)
  34.          for(y=110;y>0;y--);
  35.         }

复制代码


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

使用道具 举报

沙发
ID:164602 发表于 2018-4-25 08:42 | 只看该作者
你的程序思路不对啊。

你先for,你知道你按键时,for到哪里了?所以,你按下键时,真的是碰运气,for到哪,就是哪儿,所以,不会跟你设想的按一下,走一个字。

我是这样改你的程序的
void main()

{
        uchar i;
        P2 = 0xff;
        while(1)
        {
           if(key_s1 == 0)
         {
           delay(1000);
           P0=table[i];
           i++;
                   if (i>9)
                   i=0;
           delay(20); //按键消抖
           if(key_s1 == 0)
           num++;
           if(num == 10)
           num = 0;
           while(!key_s1); //松手检测
         }
        }
}

另外,我还不明白,你的num变量是干什么的,没什么用啊。

评分

参与人数 1黑币 +5 收起 理由
luntandianzi + 5

查看全部评分

回复

使用道具 举报

板凳
ID:315830 发表于 2018-4-25 12:01 | 只看该作者
逻辑混乱了
你现在实现的是0-f的抽奖显示吧

1.你的16次for循环应该去掉
2.要显示的应该是num,不是i
3.delay(1000)影响消抖,且你不按按键数码管显示数字不会变,这句应该去掉
暂时看到那么多
回复

使用道具 举报

地板
ID:311951 发表于 2018-4-25 12:50 | 只看该作者
怎么是乱码

265947653.jpg (41.49 KB, 下载次数: 36)

265947653.jpg
回复

使用道具 举报

5#
ID:213173 发表于 2018-4-25 14:28 | 只看该作者

数码管数组用反了吧?
回复

使用道具 举报

6#
ID:311951 发表于 2018-4-25 20:43 | 只看该作者
现在是正常了,可是怎么按下按键,直接从0跳到2,怎么回事啊,大家在帮我看看哪里出问题了。

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,
                     0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阳数码管码表
sbit key_s1 = P3^2;  //独立按键S1
uchar num;
void delay(uint z);
void main()

{
        uchar i;
        P2 = 0xff;
        while(1)
        {
           if(key_s1 == 0)
         {
           P0=~table[i];
           i++;
           if (i>9)
       i=0;
           delay(20); //按键消抖
           if(key_s1 == 0)
           num++;
           if(num == 10)
           num = 0;
           while(!key_s1); //松手检测
         }
        }
}
        void delay(uint z)
        {
         uint x,y;         for(x=z;x>0;x--)
         for(y=110;y>0;y--);
        }

回复

使用道具 举报

7#
ID:213173 发表于 2018-4-26 07:12 | 只看该作者
fenger112 发表于 2018-4-25 20:43
现在是正常了,可是怎么按下按键,直接从0跳到2,怎么回事啊,大家在帮我看看哪里出问题了。

#include " ...

#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char
uchar code table[]={
0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,                     
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71}; //共阴数码管码表0~F
sbit key_s1 = P3^2;  //独立按键S1
//uchar num;
void delay(uint z);
void main()
{
        uchar i=0;
        P2 = 0xff;
        P0=~table;
        while(1)
        {
                if(key_s1 == 0)
                {
                        delay(20); //按键消抖
                        if(key_s1 == 0)
                        {
                                i++;
                                if(i>9)
                                        i=0;
                                P0=~table;
                                while(!key_s1); //松手检测
//                                num++;
//                                if(num == 10)
//                                num = 0;
                        }
                }
        }
}
void delay(uint z)
{
        uint x,y;         
        for(x=z;x>0;x--)
                for(y=110;y>0;y--);
}
回复

使用道具 举报

8#
ID:311951 发表于 2018-4-26 19:16 | 只看该作者
wulin 发表于 2018-4-26 07:12
#include "reg52.h"
#define uint unsigned int
#define uchar unsigned char

谢谢了,不过P0=~table;这句要改成P0=~table;才行
回复

使用道具 举报

9#
ID:311604 发表于 2018-4-26 19:48 | 只看该作者
对啦,我也刚看明白,学习了
回复

使用道具 举报

10#
ID:213173 发表于 2018-4-26 20:34 | 只看该作者
fenger112 发表于 2018-4-26 19:16
谢谢了,不过P0=~table;这句要改成P0=~table;才行

这是与你使用的数码管是共阴或共阳来确定的
回复

使用道具 举报

11#
ID:317386 发表于 2018-4-26 21:37 | 只看该作者
共阳数码管段码不对吧
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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