|
按鍵按得慢的時(shí)候數(shù)字正常加一,但是按得快了之后數(shù)字就開(kāi)始跳變,數(shù)字一跳跳好幾個(gè),誰(shuí)能幫我解決一下(按鍵松開(kāi)加一)程序,電路圖如下
單片機(jī)源程序如下:
#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毫秒延時(shí)函數(shù)
{
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;//準(zhǔn)備發(fā)送命令
Delayms(5);
EN=1;//使能端為高電平時(shí)才允許數(shù)據(jù)交換
EN=0;//使能端拉低
}
void Lcd1602_WriteData(uchar dat)//寫數(shù)據(jù)
{
RS=1;//數(shù)據(jù)
RW=0;//寫
P0=dat;
Delayms(5);
EN=1;
EN=0;
}
void Lcd1602_init()//初始化函數(shù)
{
Lcd1602_WriteCom(0x38);//8位數(shù)據(jù),5*7點(diǎn)陣,2行顯示
Lcd1602_WriteCom(0x0C);//顯示開(kāi),關(guān)光標(biāo),光標(biāo)不閃爍
Lcd1602_WriteCom(0x06);//顯示地址遞增,寫一個(gè)數(shù)據(jù)后,顯示位置右移一位
Lcd1602_WriteCom(0x01);//顯示清屏
}
void Num()
{
Lcd1602_WriteCom(0xC0);//第二行第1位
Lcd1602_WriteData(hou/10+48);//十萬(wàn)位
Lcd1602_WriteCom(0xC1);//第二行第2位
Lcd1602_WriteData(hou%10+48);//萬(wàn)位
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);//個(gè)位
}
void main()
{
Lcd1602_init();
Lcd1602_WriteCom(0x80);//0x80:第一行第一個(gè)字符的地址
while(*Disp1 !='\0')//顯示第一行字符
{
Lcd1602_WriteData(*Disp1);
Delayms(50);//延時(shí),讓字一個(gè)一個(gè)出現(xiàn)的效果
Disp1++;
}
Lcd1602_WriteCom(0xC9);//0xC0:第二行第一個(gè)字符的地址
while(*Disp2 !='\0')//顯示第二行字符
{
Lcd1602_WriteData(*Disp2);
Delayms(50);//延時(shí),讓字一個(gè)一個(gè)出現(xiàn)的效果
Disp2++;
}
hou=99;
min=99;
sec=0;
while(1)
{
Num();//數(shù)字顯示
while(K1)//按鍵沒(méi)有按下時(shí)
{
}
while(K1==0)//按鍵按下時(shí)
{
Delayms(200);//延時(shí)10毫秒,去抖
sec=sec+1;
if(sec==100)//進(jìn)位并清零
{
sec=0;
min=min+1;
if(min==100)//進(jìn)位并清零
{
min=0;
hou=hou+1;
if(hou==100)//清零
{
hou=0;
}
}
}
}
}
}
|
|