标题:
单片机程序按键后怎么显示的数字不自动增加
[打印本页]
作者:
huangbibo
时间:
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);
}
}
作者:
xianfajushi
时间:
2019-6-19 15:50
i=50;移动到按钮外面
作者:
quanquan12
时间:
2019-6-19 17:43
i=50;i++;这两条有问题,i=50放的位置错了,每次按键进入都重新赋值50,永远都是51的值,没有任何的变化,建议放在全局变量,或者i定义成静态全局变量
作者:
尹子归来
时间:
2019-6-19 19:11
每次按键计数之前先给赋50所以每次按下都是51,初值要在循环外面赋值一次即可
作者:
egypt
时间:
2019-6-19 19:56
很明显,每次进入下述代码时
if(key == 0) //再次判断
{
i=50; i++; //按键次数
while(key == 0); //判断是否松开按键
你的 i 又被赋值为 50 了
把 i=50 放到初始化的地方写吧
作者:
ssk7793
时间:
2019-6-19 20:23
你每次都重置i=50,变量怎么能增加
作者:
xianfajushi
时间:
2019-6-19 20:37
修改2处uint i=50; i=50; i++; //按键次数 此处删除 i=50;
作者:
WZY12306
时间:
2019-6-19 21:01
i=50; i++; //按键次数 你每次进按键后都赋了50,后面++,应该是在50-51这两个数了,你看对?
作者:
WZY12306
时间:
2019-6-19 21:03
i=50; i++; //按键次数 你每次进按键后都赋了50,后面++,应该是在50-51这两个数了,你看对?
作者:
陈润源home
时间:
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]; //显示各位
}
}
作者:
charles11
时间:
2019-6-19 21:14
你把i定义成全局变量试一下,因为你一直在while语句里一直让i=50,它执行完加一跳出去再进来还是等于50
作者:
47okey
时间:
2019-6-19 21:28
if(key == 0) //再次判断
{
i=50;
i++; //按键次数
while(key == 0); //判断是否松开按键
if(i == 100) i=0; //如果到达99,下一次回到0
}
每次进入按键代码,i都赋值50;
作者:
ppt168
时间:
2019-6-19 22:05
不好弄啊
作者:
taotie
时间:
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~~
作者:
lwh999995
时间:
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);
}
}
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1