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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3309|回復: 18
打印 上一主題 下一主題
收起左側

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

[復制鏈接]
跳轉到指定樓層
樓主
ID:137005 發表于 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;}
}

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

使用道具 舉報

沙發
ID:213173 發表于 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;//防止溢出
        }
}
回復

使用道具 舉報

板凳
ID:137005 發表于 2021-7-5 08:00 | 只看該作者
wulin 發表于 2021-7-5 07:23
#define d 250//按實際需要定義數值
#define c 50*d

謝謝!晚上回去試試。
回復

使用道具 舉報

地板
ID:161164 發表于 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;}

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

評分

參與人數 1黑幣 +5 收起 理由
ax6808 + 5

查看全部評分

回復

使用道具 舉報

5#
ID:137005 發表于 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,測試了一下,無論長短按,都是長按的結果。
回復

使用道具 舉報

6#
ID:137005 發表于 2021-7-5 09:10 | 只看該作者
lkc8210 發表于 2021-7-5 08:29
有什么問題?要我們推理出來嗎?
女子口巴,閒的發慌,我就推一推
void keyscan() //按鍵掃描

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

使用道具 舉報

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

使用道具 舉報

8#
ID:137005 發表于 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;}

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

使用道具 舉報

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


回復

使用道具 舉報

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

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

使用道具 舉報

11#
ID:213173 發表于 2021-7-5 16:31 | 只看該作者
molo 發表于 2021-7-5 08:59
單片機是STC8F2K16S,頻率11.0592,測試了一下,無論長短按,都是長按的結果。

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

使用道具 舉報

12#
ID:213173 發表于 2021-7-5 18:14 | 只看該作者
molo 發表于 2021-7-5 08:59
單片機是STC8F2K16S,頻率11.0592,測試了一下,無論長短按,都是長按的結果。

這個簡單按鍵長短按程序適合放在主函數周期相對穩定的環境運行,短按消抖時間和長按時間的計數值是以主函數周期計算的。
回復

使用道具 舉報

13#
ID:213173 發表于 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)

回復

使用道具 舉報

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

謝謝!
回復

使用道具 舉報

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

使用道具 舉報

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

評分

參與人數 1黑幣 +5 收起 理由
ax6808 + 5 已下載,拜讀了,其中不少實戰經驗.

查看全部評分

回復

使用道具 舉報

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

}
回復

使用道具 舉報

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

an.zip

121.48 KB, 下載次數: 6

回復

使用道具 舉報

19#
ID:975054 發表于 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標準代碼,其余代碼極其簡單可靠.
有空我再研究一下利用中斷監控長短按的優缺點(優點:主要想實現長按可靠進入待機狀態,短按改模式),力求簡單可靠.
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 日本精品一区二区三区视频 | 成年人免费看的视频 | 亚洲日韩欧美一区二区在线 | 免费在线观看一区二区 | 五月激情久久 | 自拍偷拍第1页 | 91精品国产91久久久久久 | 中文天堂在线一区 | 久久一区精品 | 九九综合| 亚洲一区| 日韩福利视频 | 国产精品一区在线 | 91资源在线观看 | xxxxx黄色片 欧美一区免费 | www国产成人免费观看视频 | av在线成人 | 久久免费视频在线 | 久久精品一| 国产高清久久久 | 成年视频在线观看福利资源 | 欧美久久一级特黄毛片 | 红桃成人在线 | 黑人巨大精品欧美一区二区一视频 | 精品日韩欧美一区二区 | 精品国产乱码久久久久久蜜退臀 | 欧美日韩成人 | 亚洲电影一级片 | 日韩电影一区 | 日本免费黄色一级片 | 一区二区三区国产好的精 | 亚洲精品九九 | 欧美a级网站 | 三区在线观看 | 国产污视频在线 | 中文字幕在线精品 | 久在线精品视频 | 国产激情在线 | 99久久精品免费看国产免费软件 | 国产一区二区三区免费观看视频 | 亚洲一区二区三区免费在线观看 |