找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3351|回復(fù): 18
收起左側(cè)

求助:單片機(jī)單按鍵功能修改成長短按鍵功能程序問題

[復(fù)制鏈接]
ID:137005 發(fā)表于 2021-7-4 22:13 | 顯示全部樓層 |閱讀模式
各位好!
  請教一下,單按鍵功能修改成長短按功能不生功能,問題出在哪里?
單按鍵功能代碼如下:
void keyscan() //按鍵掃描
{
        if((IN_1==0)&&(bz1==0)){bz1=1;k1=1;}
        if((IN_1==1)&&(bz1==1)){bz1=0;k1=1;}

}


修改成長短按鍵功能代碼如下:
void keyscan() //按鍵掃描
{
        static unsigned int key_press_time = 0;  // ……請記得標(biāo)為靜態(tài)變量
    if((IN_1==0)&&(bz1==0))
        {
        if(++key_press_time <=0 ) --key_press_time;//計(jì)量按鍵時間,并避免數(shù)據(jù)溢出
        if(key_press_time==1500){
            bz1=1;k2=1;//新增功能,按鍵長按3s時要做的事情;
        }
    }
        else
        {
        if(20<=key_press_time && key_press_time < 1500){
            bz1=1;k1=1;//大于20ms小于3s,視為短按
        }
        key_press_time=0;
    }
        if((IN_1==1)&&(bz1==1)){bz1=0;k1=1;}
}

回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-7-5 07:23 | 顯示全部樓層
#define d 250//按實(shí)際需要定義數(shù)值
#define c 50*d

void keyscan() //按鍵掃描
{
        static unsigned int key_press_time = 0;  //靜態(tài)變量
        if(IN_1)//松手
        {
                if(key_press_time > d && key_press_time < c)
                {
                        bz1=1;k2=1;//短按任務(wù)
                }
                key_press_time = 0;
        }
        else //按下
        {
                key_press_time++;
                if(key_press_time == c)
                {
                        bz1=1;k1=1;//長按任務(wù)
                }
                if(key_press_time>c)
                        key_press_time = c+1;//防止溢出
        }
}
回復(fù)

使用道具 舉報

ID:137005 發(fā)表于 2021-7-5 08:00 | 顯示全部樓層
wulin 發(fā)表于 2021-7-5 07:23
#define d 250//按實(shí)際需要定義數(shù)值
#define c 50*d

謝謝!晚上回去試試。
回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2021-7-5 08:29 來自手機(jī) | 顯示全部樓層
wulin 發(fā)表于 2021-7-5 07:23
#define d 250//按實(shí)際需要定義數(shù)值
#define c 50*d


有什么問題?要我們推理出來嗎?
女子口巴,閒的發(fā)慌,我就推一推
void keyscan() //按鍵掃描
{
        if((IN_1==0)&&(bz1==0)){bz1=1;k1=1;}//這是按下吧?
        if((IN_1==1)&&(bz1==1)){bz1=0;k1=1;}//這是放開吧?
}
發(fā)現(xiàn)k1=1出現(xiàn)了兩次
由于短按時間短,所以只當(dāng)作用一次也沒什么

void keyscan() //按鍵掃描
{
        static unsigned int key_press_time = 0;  // ……請記得標(biāo)為靜態(tài)變量
    if((IN_1==0)&&(bz1==0))
        {
        if(++key_press_time <=0 ) --key_press_time;//計(jì)量按鍵時間,并避免數(shù)據(jù)溢出
        if(key_press_time==1500){
            bz1=1;k2=1;//新增功能,按鍵長按3s時要做的事情;
        }
    }
        else
        {
        if(20<=key_press_time && key_press_time < 1500){
            bz1=1;k1=1;//大于20ms小于3s,視為短按
        }
        key_press_time=0;
    }
        if((IN_1==1)&&(bz1==1)){bz1=0;k1=1;}
}
新代碼又發(fā)現(xiàn)k=1出現(xiàn)了兩次
這次不能當(dāng)沒事發(fā)生了
當(dāng)長按之后(k2=1)一放開,k1=1又來了
不知道k2=1和k1=1所代表的意義有沒有沖突
但我建議把最后一句改為:
if((IN_1==1)&&(bz1==1)){bz1=0;}

當(dāng)然,如果你只求一個可用的代碼
就直接用二樓的吧~

評分

參與人數(shù) 1黑幣 +5 收起 理由
ax6808 + 5

查看全部評分

回復(fù)

使用道具 舉報

ID:137005 發(fā)表于 2021-7-5 08:59 | 顯示全部樓層
本帖最后由 molo 于 2021-7-5 09:25 編輯
wulin 發(fā)表于 2021-7-5 07:23
#define d 250//按實(shí)際需要定義數(shù)值
#define c 50*d

單片機(jī)是STC8F2K16S,頻率11.0592,測試了一下,無論長短按,都是長按的結(jié)果。
回復(fù)

使用道具 舉報

ID:137005 發(fā)表于 2021-7-5 09:10 | 顯示全部樓層
lkc8210 發(fā)表于 2021-7-5 08:29
有什么問題?要我們推理出來嗎?
女子口巴,閒的發(fā)慌,我就推一推
void keyscan() //按鍵掃描

K1,K2是按鈕操作后,發(fā)送不同命令參數(shù)。按下的K1,K2寫好了,但松開后的還沒寫,臨時用了K1
回復(fù)

使用道具 舉報

ID:81196 發(fā)表于 2021-7-5 09:21 | 顯示全部樓層
一般,我做這個長按短按,結(jié)合定時器做,這樣可以記錄到每個那件按下的時間長度及觸發(fā)長按的時間設(shè)置,不同時間對應(yīng)不同的效果.
回復(fù)

使用道具 舉報

ID:137005 發(fā)表于 2021-7-5 09:41 | 顯示全部樓層
shumivan 發(fā)表于 2021-7-5 09:21
一般,我做這個長按短按,結(jié)合定時器做,這樣可以記錄到每個那件按下的時間長度及觸發(fā)長按的時間設(shè)置,不同時間 ...

void keyscan() //按鍵掃描
{
        if((IN_1==0)&&(bz1==0)){bz1=1;k1=1;}
        if((IN_1==1)&&(bz1==1)){bz1=0;k1=1;}

}
以上這部分代碼在程序中運(yùn)行是可以的。只是想增加功能,區(qū)分長按和短按。
我自己寫了一個,有問題,求助怎么把原來程序修改增加長、短按功能。
回復(fù)

使用道具 舉報

ID:123289 發(fā)表于 2021-7-5 09:52 | 顯示全部樓層
要點(diǎn):
1、按下時間的界定值,不要直接用常數(shù),而用變量AN,將界定值放入AN,這樣只要改變AN中的數(shù)值就達(dá)成目的了。
2、制作的一個計(jì)時器,統(tǒng)計(jì)按下的時間。不要用DELAY,死板,且不能解決中途停按,可長按超時(按了20秒,你認(rèn)為按了一次還是多次)。
3、確定:計(jì)時的起點(diǎn),這是要點(diǎn)。
4、確定:計(jì)時的終點(diǎn),這是要點(diǎn)。(建議:1、彈起時結(jié)束計(jì)時;2、計(jì)時超限時計(jì)時器不再計(jì)數(shù))
5、比較計(jì)器計(jì)時終點(diǎn)值與AN的大小,就達(dá)成目的了。


回復(fù)

使用道具 舉報

ID:161164 發(fā)表于 2021-7-5 11:55 | 顯示全部樓層
molo 發(fā)表于 2021-7-5 09:10
K1,K2是按鈕操作后,發(fā)送不同命令參數(shù)。按下的K1,K2寫好了,但松開后的還沒寫,臨時用了K1

所以你的問題是什么?
我的推理正確嗎?
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-7-5 16:31 | 顯示全部樓層
molo 發(fā)表于 2021-7-5 08:59
單片機(jī)是STC8F2K16S,頻率11.0592,測試了一下,無論長短按,都是長按的結(jié)果。

這是按標(biāo)準(zhǔn)51/12T寫的,你用1T單片機(jī),這句你沒有理解:#define d 250//按實(shí)際需要定義數(shù)值,擴(kuò)大10倍試試。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-7-5 18:14 | 顯示全部樓層
molo 發(fā)表于 2021-7-5 08:59
單片機(jī)是STC8F2K16S,頻率11.0592,測試了一下,無論長短按,都是長按的結(jié)果。

這個簡單按鍵長短按程序適合放在主函數(shù)周期相對穩(wěn)定的環(huán)境運(yùn)行,短按消抖時間和長按時間的計(jì)數(shù)值是以主函數(shù)周期計(jì)算的。
回復(fù)

使用道具 舉報

ID:213173 發(fā)表于 2021-7-5 19:09 | 顯示全部樓層
molo 發(fā)表于 2021-7-5 09:41
void keyscan() //按鍵掃描
{
        if((IN_1==0)&&(bz1==0)){bz1=1;k1=1;}

你的按鍵功能需求可以在這程序中找到
4位數(shù)碼管時鐘溫度表仿真.zip (228.25 KB, 下載次數(shù): 10)

回復(fù)

使用道具 舉報

ID:137005 發(fā)表于 2021-7-6 08:01 | 顯示全部樓層
wulin 發(fā)表于 2021-7-5 19:09
你的按鍵功能需求可以在這程序中找到

謝謝!
回復(fù)

使用道具 舉報

ID:140489 發(fā)表于 2021-7-8 10:32 | 顯示全部樓層
去看看吳堅(jiān)鴻的教程,會有意想不到的收獲
回復(fù)

使用道具 舉報

ID:140489 發(fā)表于 2021-7-8 10:45 | 顯示全部樓層
你看看這個帖子,有吳堅(jiān)鴻教程的PDF文檔,http://www.torrancerestoration.com/bbs/dpj-55036-1.html

評分

參與人數(shù) 1黑幣 +5 收起 理由
ax6808 + 5 已下載,拜讀了,其中不少實(shí)戰(zhàn)經(jīng)驗(yàn).

查看全部評分

回復(fù)

使用道具 舉報

ID:137005 發(fā)表于 2021-7-8 11:02 | 顯示全部樓層
lids 發(fā)表于 2021-7-8 10:45
你看看這個帖子,有吳堅(jiān)鴻教程的PDF文檔,http://www.torrancerestoration.com/bbs/dpj-55036-1.html

好的,我看看。
原來那2句挻好用的,增加了長短按,試了很多長程序,感覺短按沒有原來的好用一樣,再努力學(xué)習(xí)改進(jìn),謝謝分享。
void keyscan() //按鍵掃描
{
        if((IN_1==0)&&(bz1==0)){bz1=1;k1=1;}
        if((IN_1==1)&&(bz1==1)){bz1=0;k1=1;}

}
回復(fù)

使用道具 舉報

ID:137005 發(fā)表于 2021-9-26 13:54 | 顯示全部樓層
如附件紅色圈這種金屬按鈕,按鍵檢測異常。

an.zip

121.48 KB, 下載次數(shù): 6

回復(fù)

使用道具 舉報

ID:975054 發(fā)表于 2022-11-29 18:54 | 顯示全部樓層
我近日搞了個最簡stc8(SOP8腳)+單按鍵監(jiān)控小系統(tǒng),1腳接按鍵,1腳接充電檢測,剩余4腳控制N種運(yùn)行模式(如接4種LED),單節(jié)鋰電池供電無需外加LDO降壓,就可直接利用內(nèi)部電源監(jiān)控電壓(電池電量,省1腳),目前首選方案比較簡單:按鍵直接用復(fù)位腳(P54),工作時用EEPR記錄復(fù)位次數(shù)(N次歸0),按1次復(fù)位1次改變1種工作模式(N次歸0,待機(jī)模式極其省電,才3μA),代碼主要多了EEPR標(biāo)準(zhǔn)代碼,其余代碼極其簡單可靠.
有空我再研究一下利用中斷監(jiān)控長短按的優(yōu)缺點(diǎn)(優(yōu)點(diǎn):主要想實(shí)現(xiàn)長按可靠進(jìn)入待機(jī)狀態(tài),短按改模式),力求簡單可靠.
回復(fù)

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表