久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3232|回復(fù): 18
打印 上一主題 下一主題
收起左側(cè)

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

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
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;//計量按鍵時間,并避免數(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;}
}

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:213173 發(fā)表于 2021-7-5 07:23 | 只看該作者
#define d 250//按實際需要定義數(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ù)值
#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ù)值
#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;//計量按鍵時間,并避免數(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ù)

使用道具 舉報

5#
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ù)值
#define c 50*d

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

使用道具 舉報

6#
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ù)

使用道具 舉報

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

使用道具 舉報

8#
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ù)

使用道具 舉報

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


回復(fù)

使用道具 舉報

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

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

使用道具 舉報

11#
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ù)值,擴(kuò)大10倍試試。
回復(fù)

使用道具 舉報

12#
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)行,短按消抖時間和長按時間的計數(shù)值是以主函數(shù)周期計算的。
回復(fù)

使用道具 舉報

13#
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ù)

使用道具 舉報

14#
ID:137005 發(fā)表于 2021-7-6 08:01 | 只看該作者
wulin 發(fā)表于 2021-7-5 19:09
你的按鍵功能需求可以在這程序中找到

謝謝!
回復(fù)

使用道具 舉報

15#
ID:140489 發(fā)表于 2021-7-8 10:32 | 只看該作者
去看看吳堅鴻的教程,會有意想不到的收獲
回復(fù)

使用道具 舉報

16#
ID:140489 發(fā)表于 2021-7-8 10:45 | 只看該作者
你看看這個帖子,有吳堅鴻教程的PDF文檔,http://www.zg4o1577.cn/bbs/dpj-55036-1.html

評分

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

查看全部評分

回復(fù)

使用道具 舉報

17#
ID:137005 發(fā)表于 2021-7-8 11:02 | 只看該作者
lids 發(fā)表于 2021-7-8 10:45
你看看這個帖子,有吳堅鴻教程的PDF文檔,http://www.zg4o1577.cn/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ù)

使用道具 舉報

18#
ID:137005 發(fā)表于 2021-9-26 13:54 | 只看該作者
如附件紅色圈這種金屬按鈕,按鍵檢測異常。

an.zip

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

回復(fù)

使用道具 舉報

19#
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)缺點(優(yōu)點:主要想實現(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ù) 返回頂部 返回列表
主站蜘蛛池模板: 精品国产一区二区三区性色av | 狠狠干av | 欧美视频一区二区三区 | 91xx在线观看 | 欧美日韩亚洲二区 | 在线免费国产视频 | 久草在线视频中文 | 亚洲福利在线观看 | 超碰最新在线 | 国产精品一级在线观看 | 国产精品免费视频一区 | 91综合网 | 亚洲国产高清在线观看 | 久久午夜精品福利一区二区 | 黑人粗黑大躁护士 | 欧美乱码精品一区二区三区 | 日本在线视频中文字幕 | 亚洲一区二区三区在线视频 | 亚洲男人天堂2024 | 亚洲自拍一区在线观看 | 精品亚洲一区二区三区 | 日韩av美女电影 | 日韩久久精品 | 欧美日本在线 | 久久精品视频12 | 欧美最猛黑人xxxx黑人 | 国产精品亚洲综合 | 久久久涩 | 国产精品一区一区三区 | 国产高清免费视频 | 中文字幕亚洲精品 | 亚洲午夜视频 | 精品国产一区二区三区久久久四川 | 久久久久国产精品免费免费搜索 | 91啪亚洲精品 | 蜜臀久久99精品久久久久久宅男 | 久久av一区二区三区 | 中文字幕第十一页 | 99久久久久久 | 国产精品久久久久久久久久久久冷 | 97伦理电影 |