欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136
標題:
51單片機單按鍵多擊程序修改
[打印本頁]
作者:
daiya
時間:
2020-7-5 09:33
標題:
51單片機單按鍵多擊程序修改
本帖最后由 daiya 于 2020-7-5 17:06 編輯
寫了一個響應單按鍵多擊的程序,按鍵彈起大于0.5S后返回鍵值,有問題,無法運行。可是我才疏學淺,找不到問題出在哪里。請各位高人幫忙看看問題出在哪?
#include <reg52.h>
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit KEY1 = P3^2;
unsigned int count = 0,ClickFlag = 0,ClickFlagCount = 0,LongClickFlag = 0;
unsigned char i = 0,Click = 0;
unsigned char keynum = 0;
unsigned char keyscan(void)
{
if(KEY1)
{
if(count > 30 && count < 3000)
{
ClickFlag = 1;
keynum++;
}
count = 0;
if(ClickFlag == 1)
{
if(ClickFlagCount++ > 500)
{
ClickFlag = 0;
ClickFlagCount = 0;
return keynum;
keynum = 0;
}
else
{
ClickFlag = 0;
ClickFlagCount = 0;
}
}
else
{
ClickFlagCount = 0;
}
}
else
{
count++;
if(count > 3000)
count = 3001;
}
return 0;
}
void main()
{
EA = 1; //使能總中斷
TMOD = 0x01; //設置T0為模式1
TH0 = 0xFC; //為T0賦初值0xFC67,定時1ms
TL0 = 0x67;
ET0 = 1; //使能T0中斷
TR0 = 1; //啟動T0
while (1)
{
if(i==1)
LED0 = ~LED0;
if(i==2)
LED1 = ~LED1;
if(i==3)
LED2 = ~LED2;
}
}
/* 定時器0中斷服務函數(shù) */
void InterruptTimer0() interrupt 1
{
TH0 = 0xFC; //重新加載初值
TL0 = 0x67;
i = keyscan();
}
作者:
xxpp2011
時間:
2020-7-5 12:09
本帖最后由 xxpp2011 于 2020-7-6 10:13 編輯
while(Key==0)//如果有按鍵按下
{ count=0;
while(Key==1)//等待按鍵彈起
{
if(Key==0)//如果按鍵再次按下
{
執(zhí)行雙擊操作;
break;//結(jié)束循環(huán)
}
count++;//計數(shù)
if(count==100)//如果100個周期內(nèi)無第二次按鍵則執(zhí)行單擊操作
{
執(zhí)行單擊操作;
break;//結(jié)束循環(huán)
}
}
if(count!=0)break;
}
作者:
daiya
時間:
2020-7-6 08:30
你給的程序只是雙擊按鍵,和我的程序的要求不同
作者:
Y_G_G
時間:
2020-7-6 08:51
哥們,你另一個帖子已經(jīng)有幾個人幫你了,有C,有匯編,有代碼,有算法,有偽代碼,就差幫你把所有代碼寫出來了
單擊,雙擊,長按.短按,這是一個單片機按鍵應用非常入門的,相對簡單的知識
這只是按鍵問題,用不到定時器的
按鍵按下之后是一定要去抖動的,可以是5mS的延時,然后,一邊延時一邊檢測按鍵有沒有松開,順便記錄松開的時間,用來判斷是長按,短按,還是雙擊
你還要檢測一下超過長按的時間,比如是一直按下那要怎么做...........
作者:
wulin
時間:
2020-7-6 08:51
按鍵初次按下開始計時,0.5s后輸出鍵值1~3有效,超過3此按3次計。
#include <reg52.h>
sbit LED0 = P1^0;
sbit LED1 = P1^1;
sbit LED2 = P1^2;
sbit KEY1 = P3^2;
unsigned char count=0;
bit ClickFlag=0,Click=0;
unsigned char i = 0;
unsigned char keynum = 0;
unsigned int num;
void keyscan(void)
{
if(!KEY1)
{
if(++count>10 && ClickFlag==0)
{
ClickFlag=1;
Click=1;
if(keynum<3)
keynum++;
}
}
else
{
count=0;
ClickFlag=0;
}
}
void main()
{
TMOD= 0x01;
TL0 = 0x18; //1毫秒@12.000MHz
TH0 = 0xFC;
TR0 = 1; //定時器0開始計時
ET0 = 1; //使能T0中斷
EA = 1; //使能總中斷
while (1)
{
if(i>0)
{
if(i==1)
LED0 = ~LED0;
if(i==2)
LED1 = ~LED1;
if(i>=3)
LED2 = ~LED2;
i=0;//清0
}
}
}
/* 定時器0中斷服務函數(shù) */
void InterruptTimer0() interrupt 1
{
TL0 = 0x18;
TH0 = 0xFC;
keyscan();
if(Click)//開始計時
{
num++;
if(num>=500)//0.5s
{
num=0; //清0
i=keynum;//取鍵值
keynum=0;//鍵值清0
Click=0; //停止計時
}
}
}
復制代碼
作者:
笨笨兔
時間:
2020-7-6 09:03
unsigned char keyscan(void)
只是看到邏輯混亂啊。。。。。。
作者:
daiya
時間:
2020-7-6 11:16
我添加了注釋,不知道可不可以看清楚邏輯了?
unsigned char keyscan(void)
{
if(KEY1)
{
if(count > 30 && count < 3000) //如果按下時間30ms~3s,認為是單擊
{
ClickFlag = 1; //按鍵抬起標志置1
keynum++; //鍵號加1
}
count = 0; // 鍵按下時間計數(shù)器清0
if(ClickFlag == 1) //如果按鍵抬起標志為1
{
if(ClickFlagCount++ > 500) //按鍵抬起時間大于0.5s
{
ClickFlag = 0; //按鍵抬起標志清0
return keynum; //返回鍵號
keynum = 0; //鍵號清0
}
else //按鍵抬起時間小于0.5s
{
ClickFlag = 0;
}
}
else //如果按鍵抬起標志為0
{
ClickFlagCount = 0; //清0按鍵抬起時間計數(shù)器
}
}
else
{
count++; //按鍵按下時間計數(shù)器加1
if(count > 3000) //防止數(shù)據(jù)溢出
count = 3001;
}
return 0;
}
歡迎光臨 (http://m.raoushi.com/bbs/)
Powered by Discuz! X3.1