標(biāo)題: C51單片機(jī)的按鍵復(fù)用控制兩個燈 [打印本頁]
作者: A142989 時間: 2018-8-30 20:57
標(biāo)題: C51單片機(jī)的按鍵復(fù)用控制兩個燈
請大神幫幫忙,看下有的程序有什么問題
原想著用一個按鍵控制兩個燈,短按控制第一個燈,長按控制第二個燈,F(xiàn)在長按的話,第二個燈能控制,也能影響第一個燈。這下不會改了
代碼在2樓
作者: wulin 時間: 2018-8-30 20:57
使用計數(shù)法識別長短按,給你改了一下,你試試。
#include<reg52.h>
#define key_S 1000 //宏定義短按(約20ms)
#define key_L key_S*50 //宏定義長按(約1s)
//定義端口
sbit KEY=P1^4;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
unsigned int count=0;//計數(shù)變量
int main (void)
{
LED1=1;
LED2=1;
KEY=1; //按鍵輸入端口電平置高
while(1) //主循環(huán)
{
if(!KEY) //如果檢測到低電平,說明按鍵按下
{
count++;
if(count==key_L) //長按
LED2=!LED2;
if(count>key_L)
count=key_L+1; //防止count溢出
}
else //按鍵抬起
{
if(count>key_S && count<key_L)//短按
LED1=!LED1;
count=0; //count清0
}
}
}
作者: A142989 時間: 2018-8-30 20:59
- #include<reg52.h>
- //定義端口
- sbit KEY=P1^4;
- sbit LED1 = P2^0;
- sbit LED2 = P2^1;
- void DelayUs2x(unsigned char t);//函數(shù)聲明
- void DelayMs(unsigned char t);
- int main (void)
- {
- unsigned char num=0,key_press_num;
- LED1=1;
- LED2=1;
- KEY=1; //按鍵輸入端口電平置高
- while(1) //主循環(huán)
- {
- if(!KEY) //如果檢測到低電平,說明按鍵按下
- {
- DelayMs(20); //延時去抖,一般10-20ms
- if(!KEY) //再次確認(rèn)按鍵是否按下,沒有按下則退出
- {
- while(!KEY)
- {
- key_press_num++;
- DelayMs(10); //10x200=2000ms=2s
- if(key_press_num==200) //大約2s
- {
- //如果達(dá)到長按鍵標(biāo)準(zhǔn)
- //則進(jìn)入長按鍵動作
- //這里用于識別是否按
- //鍵還在按下,如果按
- //下執(zhí)行相關(guān)動作,否則退出
- while(!KEY)
- {
- LED2=!LED2;
- DelayMs(200);
-
- }
- }
- }
- LED1=!LED1;
- }
-
- }
- }
- }
- //uS延時函數(shù)
- void DelayUs2x(unsigned char t)
- {
- while(--t);
- }
- //mS延時函數(shù)
- void DelayMs(unsigned char t)
- {
-
- while(t--)
- {
- //大致延時1mS
- DelayUs2x(245);
- DelayUs2x(245);
- }
- }
復(fù)制代碼
作者: 人中狼 時間: 2018-8-30 23:11
不應(yīng)該用延時來判斷按鍵時間,應(yīng)該用定時器來記錄按鍵按下的時間,再來判斷是短按,還是長按
作者: 祥祥俱樂部 時間: 2018-8-31 01:24
試試我寫的這個,看看行不行。我也是新手
if(key_up==key_press)
{
Delay5ms(2);
if(key_up==key_press)
{
hold_time=0;
while((key_up==key_press)&&(hold_time<20))
{
Delay5ms(10);
hold_time++;
}
if((hold_time>1)&&(hold_time<=10))
key_press_num=key_up_code;
else if((hold_time>10)&&(hold_time<=20))
key_press_num=key_down_code;
}
}while(!key_up);
作者: 726434632 時間: 2018-8-31 08:53
1、定義一個局部變量
2、長按之后將該標(biāo)志位置為1
3、在松手之后判斷該標(biāo)志位是否為1
4、如果不為1,確認(rèn)是短按松開、執(zhí)行短按功能
5、如果為1,則是長按松開、不執(zhí)行短按功能
6、按鍵不要用delay延時,可以在定義一個變量在定時器里面以1ms時基自加,按鍵函數(shù)每當(dāng)該變量大于9即10ms掃描一次按鍵狀態(tài)、如果按鍵按下將一個靜態(tài)變量自加,,連續(xù)判斷到5次以上200次以下是短按,判斷到200次以上是長按,5次以下認(rèn)為是抖動。
作者: 昆明路口賣提莫 時間: 2018-8-31 19:36
用延時判斷的話 主要是防抖程序后面還要加一個判斷 看按鍵是否離開 然后在讀取鍵值
作者: 15873002171 時間: 2018-9-1 10:28
用定時器記錄按鍵的商家長短就可以了
作者: Apollo-zzm 時間: 2018-9-1 13:24
用定時器計數(shù)
循環(huán)判斷
按下時計數(shù)器加一
抬起時判斷計數(shù)器值,
1 執(zhí)行長按程序, 計數(shù)器清零,否則
2執(zhí)行短安程序, 計數(shù)器清零
否則空操作(去抖)
作者: 詮哥 時間: 2018-9-2 22:14
根據(jù)你的程序思路來看存在一個無法解決的問題,那就是在下面這段程序中
- while(!KEY)
- {
- key_press_num++;
- DelayMs(10); //10x200=2000ms=2s
- if(key_press_num==200) //大約2s
- {
- //如果達(dá)到長按鍵標(biāo)準(zhǔn)
- //則進(jìn)入長按鍵動作
- //這里用于識別是否按
- //鍵還在按下,如果按
- //下執(zhí)行相關(guān)動作,否則退出
- while(!KEY)
- {
- LED2=!LED2;
- DelayMs(200);
-
- }
- }
- }
- LED1=!LED1;
復(fù)制代碼
本來你設(shè)置為當(dāng)按鍵沒有釋放時,就會進(jìn)行計數(shù),而不會點亮LED1。
但是一旦計數(shù)值到達(dá)標(biāo)準(zhǔn),LED2就會被點亮,然后延時0.2s,結(jié)束當(dāng)前的while(!KEY)循環(huán),由于程序BUG
1.如果按鍵仍然不釋放LED2就會反復(fù)亮滅
2.或當(dāng)按鍵釋放while(!KEY)循環(huán)結(jié)束,程序循序執(zhí)行LED1=!LED1
所以你的設(shè)計思路有點小問題
作者: 詮哥 時間: 2018-9-2 22:31
加一個標(biāo)志位就行了
#include<reg52.h>
//定義端口
sbit KEY=P1^4;
sbit LED1 = P2^0;
sbit LED2 = P2^1;
void DelayUs2x(unsigned char t);//函數(shù)聲明
void DelayMs(unsigned char t);
int main (void)
{
unsigned char num=0,key_press_num,marker_bits;
LED1=1;
LED2=1;
KEY=1; //按鍵輸入端口電平置高
while(1) //主循環(huán)
{
if(!KEY) //如果檢測到低電平,說明按鍵按下
{
marker_bits = 1;
DelayMs(20); //延時去抖,一般10-20ms
if(!KEY) //再次確認(rèn)按鍵是否按下,沒有按下則退出
{
while(!KEY)
{
key_press_num++;
DelayMs(10); //10x200=2000ms=2s
if(key_press_num==200) //大約2s
{
//如果達(dá)到長按鍵標(biāo)準(zhǔn)
//則進(jìn)入長按鍵動作
//這里用于識別是否按
//鍵還在按下,如果按
//下執(zhí)行相關(guān)動作,否則退出
while(!KEY)
{
marker_bits =! marker_bits;
LED2=!LED2;
DelayMs(200);
}
}
}
if (marker_bits)
{
LED1=!LED1;
}
}
}
}
}
//uS延時函數(shù)
void DelayUs2x(unsigned char t)
{
while(--t);
}
//mS延時函數(shù)
void DelayMs(unsigned char t)
{
while(t--)
{
//大致延時1mS
DelayUs2x(245);
DelayUs2x(245);
}
}
| 歡迎光臨 (http://www.raoushi.com/bbs/) |
Powered by Discuz! X3.1 |