按鍵按得慢的時候數字正常加一,但是按得快了之后數字就開始跳變,數字一跳跳好幾個,誰能幫我解決一下(按鍵松開加一)程序,電路圖如下
89c52按鍵LCD1602S六位數加一.PNG (98.29 KB, 下載次數: 28)
下載附件
2023-10-1 15:06 上傳
單片機源程序如下:
#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;
}
}
}
}
}
}
|