找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机程序按键后怎么显示的数字不自动增加

  [复制链接]
跳转到指定楼层
楼主
ID:347814 发表于 2019-6-19 12:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
功能:我想通过按键时把一个初始值(本例是50)通过数码管显示出来,以后每按一次按键,数值就加1,
    但我仿真时,按键却不能自动增加,不知是什么原因?

单片机源程序如下:
/*两位静态数码管显示按键次数*/
//头文件
#include "reg51.h"
/* 定义 uint uchar  */
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,  
         0x92,0x82,0xf8,0x80,0x90};   //0~9的数组   (共阳极)

sbit key = P1^0;                          //定义按键
void Delay_ms(uint z);       //声明延时函数
void main(void)                           //主函数
{
uint i;     
while(1)
{   
  if(key == 0)                      //判断按键是否按下
  {
   Delay_ms(10);      //延时10ms
   if(key == 0)      //再次判断
   {
   i=50; i++;       //按键次数
    while(key == 0);    //判断是否松开按键
    if(i == 100) i=0;    //如果到达99,下一次回到0
   }
  }         
  P2 = table[i/10];          //显示十位
  P3 = table[i%10];          //显示各位   
}
}

void Delay_ms(uint z)                 //延时函数
{
while(z--) 12.000MHz
{
  unsigned char i, j;

  i = 2;
  j = 239;
  do
  {
   while (--j);
  } while (--i);
}
}

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

使用道具 举报

沙发
ID:332444 发表于 2019-6-19 15:50 | 只看该作者
i=50;移动到按钮外面
回复

使用道具 举报

板凳
ID:564631 发表于 2019-6-19 17:43 | 只看该作者
i=50;i++;这两条有问题,i=50放的位置错了,每次按键进入都重新赋值50,永远都是51的值,没有任何的变化,建议放在全局变量,或者i定义成静态全局变量
回复

使用道具 举报

地板
ID:452821 发表于 2019-6-19 19:11 | 只看该作者
每次按键计数之前先给赋50所以每次按下都是51,初值要在循环外面赋值一次即可
回复

使用道具 举报

5#
ID:565305 发表于 2019-6-19 19:56 | 只看该作者
很明显,每次进入下述代码时
   if(key == 0)      //再次判断
   {
   i=50; i++;       //按键次数
    while(key == 0);    //判断是否松开按键

你的 i 又被赋值为 50 了

把 i=50 放到初始化的地方写吧
回复

使用道具 举报

6#
ID:424598 发表于 2019-6-19 20:23 来自手机 | 只看该作者
你每次都重置i=50,变量怎么能增加
回复

使用道具 举报

7#
ID:332444 发表于 2019-6-19 20:37 | 只看该作者
修改2处uint i=50;       i=50; i++;       //按键次数   此处删除  i=50;
回复

使用道具 举报

8#
ID:567243 发表于 2019-6-19 21:01 | 只看该作者
i=50; i++;       //按键次数     你每次进按键后都赋了50,后面++,应该是在50-51这两个数了,你看对?
回复

使用道具 举报

9#
ID:567243 发表于 2019-6-19 21:03 | 只看该作者
i=50; i++;       //按键次数     你每次进按键后都赋了50,后面++,应该是在50-51这两个数了,你看对?
回复

使用道具 举报

10#
ID:293363 发表于 2019-6-19 21:08 | 只看该作者
按键处理程序没对   i=50;要放在while(1)之前,你的程序是每次按下按键都给i赋值50,然后+1肯定不会加啊
if(key == 0)                      //判断按键是否按下
  {
   Delay_ms(10);      //延时10ms
   if(key == 0)      //再次判断
   {
   i++;       //按键次数
    while(key == 0);    //判断是否松开按键
    if(i == 100) i=0;    //如果到达99,下一次回到0
   }
  }         
  P2 = table[i/10];          //显示十位
  P3 = table[i%10];          //显示各位   
}
}
回复

使用道具 举报

11#
ID:552614 发表于 2019-6-19 21:14 | 只看该作者
你把i定义成全局变量试一下,因为你一直在while语句里一直让i=50,它执行完加一跳出去再进来还是等于50
回复

使用道具 举报

12#
ID:105364 发表于 2019-6-19 21:28 | 只看该作者
  if(key == 0)      //再次判断
   {
   i=50; i++;       //按键次数
    while(key == 0);    //判断是否松开按键
    if(i == 100) i=0;    //如果到达99,下一次回到0
   }
每次进入按键代码,i都赋值50;
回复

使用道具 举报

13#
ID:567323 发表于 2019-6-19 22:05 | 只看该作者
不好弄啊
回复

使用道具 举报

14#
ID:342822 发表于 2019-6-19 22:23 | 只看该作者
#include "reg51.h"
/* 定义 uint uchar  */
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,  
         0x92,0x82,0xf8,0x80,0x90};   //0~9的数组   (共阳极)

sbit key = P1^0;                          //定义按键
void Delay_ms(uint z);       //声明延时函数
void main(void)                           //主函数
{
uint i ;
i=50;   
while(1)
{   
  if(key == 0)                      //判断按键是否按下
  {
   Delay_ms(10);      //延时10ms
   if(key == 0)      //再次判断
   {
    i++;       //按键次数
    while(key == 0);    //判断是否松开按键
    if(i == 100) i=0;    //如果到达99,下一次回到0
   }
  }         
  P2 = table[i/10];          //显示十位
  P3 = table[i%10];          //显示各位   
}
}

void Delay_ms(uint z)                 //延时函数
{
while(z--)
{
  unsigned char i, j;

  i = 2;
  j = 239;
  do
  {
   while (--j);
  } while (--i);
}
}
i=50在循环外就ok~~
回复

使用道具 举报

15#
ID:207421 发表于 2019-6-20 01:19 | 只看该作者
/*有问题的我都注释了,下面应该要有程序明细介绍*/
/************************************************************************
* 工  程  名: xxxxxxxx
* 单片机型号: xxxxxxxx
* 晶      振: xxxxxxxx
* 接口说明:
*          例如 数码管段选什么IO,位选什么IO,数码管驱动芯片有哪些,分别接到了哪些IO。
*                            按键接到哪个IO,有没有跳帽 等 等 等 等 等 等 !
* 还可以写更详细,客户一看就都知道了。
************************************************************************/
#include "reg51.h"
typedef unsigned int uint;
typedef unsigned char uchar;
uchar code table[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90};   //0~9的数组   (共阳极)
sbit key = P1^0;        //定义按键
void Delay_ms(uint z);  //声明延时函数
//主函数
void main(void)        
{
        uint i=50;   /*    i=50; 在这里初始化 ,运行程序就会显示50  */   
        while(1)
        {   
                if(key == 0)       //判断按键是否按下
                {
                        Delay_ms(10);  //延时10ms
                        if(key == 0)   //再次判断
                        {
                                i++;     /*  i=50; i++;  不能放在这里初始化,否则每一次按键都是50, i++; 留着   */          //按键次数
                                while(key == 0);    //判断是否松开按键
                                if(i == 100) i=0;    //如果到达99,下一次回到0
                        }
                }
                /*
                这里基本上全错了,P2->十位, P3->个位  这不乱套了吗?   段选有两个IO口的吗???
                位选 居然看不到 是哪个IO? 有没有驱动芯片?
                P2 = table[i/10];          //显示十位
                P3 = table[i%10];          //显示各位
                要么我猜 P2 位选?  P3 段选? 还是位选直接接了电源正极吗???
                */
                // 乱猜开始,数码管延时函数值可能要调一调,不然会闪
                P2 = 0x01;                           //位选开 P20
                P3 = table[i/10];            //显示十位 P3 段选
                Delay_ms(5);
                P2 = 0x00;                                         //关闭数码管显示
                Delay_ms(5);
                //
                P2 = 0x02;                           //位选开 P21
                P3 = table[i%10];            //显示个位 P3 段选
                Delay_ms(5);
                P2 = 0x00;                                         //关闭数码管显示
                Delay_ms(5);
                // 乱猜结束,IO不对那就自己改,问题不明确,我也没办法。
        }
}
//延时函数  12.000MHz
void Delay_ms(uint z)                 
{
        while(z--)    //while 这种少用,容易出问题,特别是while很多的时候。 用for吧,不改了,这种小程序错误实在太多
        {
                unsigned char i, j;

                i = 2;
                j = 239;
                do
                {
                        while (--j);
                } while (--i);
        }
}

回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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