欧美极品高清xxxxhd,国产日产欧美最新,无码AV国产东京热AV无码,国产精品人与动性XXX,国产传媒亚洲综合一区二区,四库影院永久国产精品,毛片免费免费高清视频,福利所导航夜趣136

標題: 求助:單片機單按鍵功能修改成長短按鍵功能程序問題 [打印本頁]

作者: molo    時間: 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;  // ……請記得標為靜態變量
    if((IN_1==0)&&(bz1==0))
        {
        if(++key_press_time <=0 ) --key_press_time;//計量按鍵時間,并避免數據溢出
        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;}
}


作者: wulin    時間: 2021-7-5 07:23
#define d 250//按實際需要定義數值
#define c 50*d

void keyscan() //按鍵掃描
{
        static unsigned int key_press_time = 0;  //靜態變量
        if(IN_1)//松手
        {
                if(key_press_time > d && key_press_time < c)
                {
                        bz1=1;k2=1;//短按任務
                }
                key_press_time = 0;
        }
        else //按下
        {
                key_press_time++;
                if(key_press_time == c)
                {
                        bz1=1;k1=1;//長按任務
                }
                if(key_press_time>c)
                        key_press_time = c+1;//防止溢出
        }
}
作者: molo    時間: 2021-7-5 08:00
wulin 發表于 2021-7-5 07:23
#define d 250//按實際需要定義數值
#define c 50*d

謝謝!晚上回去試試。
作者: lkc8210    時間: 2021-7-5 08:29
wulin 發表于 2021-7-5 07:23
#define d 250//按實際需要定義數值
#define c 50*d


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

void keyscan() //按鍵掃描
{
        static unsigned int key_press_time = 0;  // ……請記得標為靜態變量
    if((IN_1==0)&&(bz1==0))
        {
        if(++key_press_time <=0 ) --key_press_time;//計量按鍵時間,并避免數據溢出
        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;}
}
新代碼又發現k=1出現了兩次
這次不能當沒事發生了
當長按之后(k2=1)一放開,k1=1又來了
不知道k2=1和k1=1所代表的意義有沒有沖突
但我建議把最后一句改為:
if((IN_1==1)&&(bz1==1)){bz1=0;}

當然,如果你只求一個可用的代碼
就直接用二樓的吧~
作者: molo    時間: 2021-7-5 08:59
本帖最后由 molo 于 2021-7-5 09:25 編輯
wulin 發表于 2021-7-5 07:23
#define d 250//按實際需要定義數值
#define c 50*d

單片機是STC8F2K16S,頻率11.0592,測試了一下,無論長短按,都是長按的結果。
作者: molo    時間: 2021-7-5 09:10
lkc8210 發表于 2021-7-5 08:29
有什么問題?要我們推理出來嗎?
女子口巴,閒的發慌,我就推一推
void keyscan() //按鍵掃描

K1,K2是按鈕操作后,發送不同命令參數。按下的K1,K2寫好了,但松開后的還沒寫,臨時用了K1
作者: shumivan    時間: 2021-7-5 09:21
一般,我做這個長按短按,結合定時器做,這樣可以記錄到每個那件按下的時間長度及觸發長按的時間設置,不同時間對應不同的效果.
作者: molo    時間: 2021-7-5 09:41
shumivan 發表于 2021-7-5 09:21
一般,我做這個長按短按,結合定時器做,這樣可以記錄到每個那件按下的時間長度及觸發長按的時間設置,不同時間 ...

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

}
以上這部分代碼在程序中運行是可以的。只是想增加功能,區分長按和短按。
我自己寫了一個,有問題,求助怎么把原來程序修改增加長、短按功能。
作者: yzwzfyz    時間: 2021-7-5 09:52
要點:
1、按下時間的界定值,不要直接用常數,而用變量AN,將界定值放入AN,這樣只要改變AN中的數值就達成目的了。
2、制作的一個計時器,統計按下的時間。不要用DELAY,死板,且不能解決中途停按,可長按超時(按了20秒,你認為按了一次還是多次)。
3、確定:計時的起點,這是要點。
4、確定:計時的終點,這是要點。(建議:1、彈起時結束計時;2、計時超限時計時器不再計數)
5、比較計器計時終點值與AN的大小,就達成目的了。



作者: lkc8210    時間: 2021-7-5 11:55
molo 發表于 2021-7-5 09:10
K1,K2是按鈕操作后,發送不同命令參數。按下的K1,K2寫好了,但松開后的還沒寫,臨時用了K1

所以你的問題是什么?
我的推理正確嗎?
作者: wulin    時間: 2021-7-5 16:31
molo 發表于 2021-7-5 08:59
單片機是STC8F2K16S,頻率11.0592,測試了一下,無論長短按,都是長按的結果。

這是按標準51/12T寫的,你用1T單片機,這句你沒有理解:#define d 250//按實際需要定義數值,擴大10倍試試。

作者: wulin    時間: 2021-7-5 18:14
molo 發表于 2021-7-5 08:59
單片機是STC8F2K16S,頻率11.0592,測試了一下,無論長短按,都是長按的結果。

這個簡單按鍵長短按程序適合放在主函數周期相對穩定的環境運行,短按消抖時間和長按時間的計數值是以主函數周期計算的。
作者: wulin    時間: 2021-7-5 19:09
molo 發表于 2021-7-5 09:41
void keyscan() //按鍵掃描
{
        if((IN_1==0)&&(bz1==0)){bz1=1;k1=1;}

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


作者: molo    時間: 2021-7-6 08:01
wulin 發表于 2021-7-5 19:09
你的按鍵功能需求可以在這程序中找到

謝謝!
作者: lids    時間: 2021-7-8 10:32
去看看吳堅鴻的教程,會有意想不到的收獲
作者: lids    時間: 2021-7-8 10:45
你看看這個帖子,有吳堅鴻教程的PDF文檔,http://m.raoushi.com/bbs/dpj-55036-1.html
作者: molo    時間: 2021-7-8 11:02
lids 發表于 2021-7-8 10:45
你看看這個帖子,有吳堅鴻教程的PDF文檔,http://m.raoushi.com/bbs/dpj-55036-1.html

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

}
作者: molo    時間: 2021-9-26 13:54
如附件紅色圈這種金屬按鈕,按鍵檢測異常。

an.zip

121.48 KB, 下載次數: 6


作者: ax6808    時間: 2022-11-29 18:54
我近日搞了個最簡stc8(SOP8腳)+單按鍵監控小系統,1腳接按鍵,1腳接充電檢測,剩余4腳控制N種運行模式(如接4種LED),單節鋰電池供電無需外加LDO降壓,就可直接利用內部電源監控電壓(電池電量,省1腳),目前首選方案比較簡單:按鍵直接用復位腳(P54),工作時用EEPR記錄復位次數(N次歸0),按1次復位1次改變1種工作模式(N次歸0,待機模式極其省電,才3μA),代碼主要多了EEPR標準代碼,其余代碼極其簡單可靠.
有空我再研究一下利用中斷監控長短按的優缺點(優點:主要想實現長按可靠進入待機狀態,短按改模式),力求簡單可靠.




歡迎光臨 (http://m.raoushi.com/bbs/) Powered by Discuz! X3.1