按键按得慢的时候数字正常加一,但是按得快了之后数字就开始跳变,数字一跳跳好几个,谁能帮我解决一下(按键松开加一)程序,电路图如下
单片机源程序如下:
#include<REG51.H>
#define uchar unsigned char
#define unit unsigned int
sbit K1=P2^4;
sbit RS=P2^5;
sbit RW=P2^6;
sbit EN=P2^7;
unsigned char *Disp1="0123456789ABCDEF";//第一行显示的字符
unsigned char *Disp2="LCD1602";//第二行显示的字符
unit hou,min,sec;
void Delayms(unit ms)//ms*1毫秒延时函数
{
unit msi,msj;
for(msi=0;msi<ms;msi++)
for(msj=0;msj<112;msj++);
}
void Lcd1602_WriteCom(uchar com)//写命令
{
RS=0;//命令
RW=0;//写
P0=com;//准备发送命令
Delayms(5);
EN=1;//使能端为高电平时才允许数据交换
EN=0;//使能端拉低
}
void Lcd1602_WriteData(uchar dat)//写数据
{
RS=1;//数据
RW=0;//写
P0=dat;
Delayms(5);
EN=1;
EN=0;
}
void Lcd1602_init()//初始化函数
{
Lcd1602_WriteCom(0x38);//8位数据,5*7点阵,2行显示
Lcd1602_WriteCom(0x0C);//显示开,关光标,光标不闪烁
Lcd1602_WriteCom(0x06);//显示地址递增,写一个数据后,显示位置右移一位
Lcd1602_WriteCom(0x01);//显示清屏
}
void Num()
{
Lcd1602_WriteCom(0xC0);//第二行第1位
Lcd1602_WriteData(hou/10+48);//十万位
Lcd1602_WriteCom(0xC1);//第二行第2位
Lcd1602_WriteData(hou%10+48);//万位
Lcd1602_WriteCom(0xC2);//第二行第3位
Lcd1602_WriteData(min/10+48);//千位
Lcd1602_WriteCom(0xC3);//第二行第4位
Lcd1602_WriteData(min%10+48);//百位
Lcd1602_WriteCom(0xC4);//第二行第5位
Lcd1602_WriteData(sec/10+48);//十位
Lcd1602_WriteCom(0xC5);//第二行第6位
Lcd1602_WriteData(sec%10+48);//个位
}
void main()
{
Lcd1602_init();
Lcd1602_WriteCom(0x80);//0x80:第一行第一个字符的地址
while(*Disp1 !='\0')//显示第一行字符
{
Lcd1602_WriteData(*Disp1);
Delayms(50);//延时,让字一个一个出现的效果
Disp1++;
}
Lcd1602_WriteCom(0xC9);//0xC0:第二行第一个字符的地址
while(*Disp2 !='\0')//显示第二行字符
{
Lcd1602_WriteData(*Disp2);
Delayms(50);//延时,让字一个一个出现的效果
Disp2++;
}
hou=99;
min=99;
sec=0;
while(1)
{
Num();//数字显示
while(K1)//按键没有按下时
{
}
while(K1==0)//按键按下时
{
Delayms(200);//延时10毫秒,去抖
sec=sec+1;
if(sec==100)//进位并清零
{
sec=0;
min=min+1;
if(min==100)//进位并清零
{
min=0;
hou=hou+1;
if(hou==100)//清零
{
hou=0;
}
}
}
}
}
}
|