找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

c51單片機按鍵程序問題,求大神解答!

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:344175 發(fā)表于 2018-6-3 19:57 | 只看該作者 回帖獎勵 |倒序瀏覽 |閱讀模式
小弟最近在制作一個單片機倒計時器,時間可調(diào),但是只能每次按一下加1。想實現(xiàn)按著不動自己也會加,但是不知道怎么搞?求前輩賜教!!
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復(fù)

使用道具 舉報

沙發(fā)
ID:277550 發(fā)表于 2018-6-3 23:06 | 只看該作者
那就是在一般的按鍵寫法,修改一下,類似這樣


if(k1==0){
        delay(1);
        if(k1==0){
                while(k1==0){
                        value++;
                        delay(100);
                }
        }
}

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

板凳
ID:287575 發(fā)表于 2018-6-3 23:30 | 只看該作者
你可以編一個定時器中斷,再用個定時器,如有按鍵按下啟動定時器,比如這定時器超過1秒了,表示長按鍵連減或連加了,就啟動定時器中斷比如0.5秒改變到計時的值就可以了

評分

參與人數(shù) 1黑幣 +20 收起 理由
admin + 20 回帖助人的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

地板
ID:213173 發(fā)表于 2018-6-4 07:40 | 只看該作者
給你一個短按加減1,長按連加減的示例程序參考。按鍵端口按你的實際電路更改。
#include <REG51.H>
#define uint unsigned int                         //宏定義數(shù)據(jù)類型uint
#define uchar unsigned char                 //宏定義數(shù)據(jù)類型uchar
#define key_S 1000                                        //宏定義短按(約20ms)
#define key_L 30000                                        //宏定義長按(約2/3s)
#define key_M 20000                                        //宏定義長按(約1/3s)
sbit key1=P3^6;                                                //加鍵
sbit key2=P3^7;                                                //減鍵
uchar num=1;

void keyscan()                                                        //按鍵掃描
{
        static uint count1=0,count2=0;//計數(shù)變量
        if(!key1)   
        {  
                count1++;  
                if(count1>=key_L)                                //長按
                {
                        if(num<255)
                                num++;        
                        count1=key_M;
                }
        }  
        else                                                                        //按鍵抬起
        {  
                if(count1>key_S && count1<key_L)//短按
                {
                        if(num<255)
                                num++;
                }
                count1=0;                                                        //count1清0
        }   
        if(!key2)   
        {  
                count2++;  
                if(count2>=key_L)                                //長按
                {
                        if(num>0)
                                num--;        
                        count2=key_M;
                }
        }  
        else                                                                        //按鍵抬起
        {  
                if(count2>key_S && count2<key_L)//短按
                {
                        if(num>0)
                                num--;
                }
                count2=0;                                                        //count2清0
        }
}

void main()
{
        while(1)
        {
                keyscan();                                //按鍵掃描
                P1=~num;                                        //LED顯示,低電平亮
        }
}
回復(fù)

使用道具 舉報

5#
ID:7485 發(fā)表于 2018-6-4 08:38 | 只看該作者
思路就是掃描檢測按鍵,設(shè)置一個循環(huán)次數(shù)計數(shù)單元,如果循環(huán)達到N次(根據(jù)你自己的要求和掃描延時10~40次,一般總共半秒為宜)如果還是按下狀態(tài),就加1,然后循環(huán)次數(shù)計數(shù)置0,繼續(xù)檢測......。循環(huán)次數(shù)也可以逐漸減小,也就是加1的時間逐漸加快,自己試驗著調(diào)。
回復(fù)

使用道具 舉報

6#
ID:344466 發(fā)表于 2018-6-4 10:46 | 只看該作者
編一個定時器中斷程序,設(shè)置數(shù)碼管動態(tài)顯示。
回復(fù)

使用道具 舉報

7#
ID:329794 發(fā)表于 2018-6-4 20:32 來自觸屏版 | 只看該作者
利用中斷,如果有需要,我有60秒倒計時,可改
回復(fù)

使用道具 舉報

8#
ID:344175 發(fā)表于 2018-7-15 21:27 | 只看該作者
devcang 發(fā)表于 2018-6-3 23:06
那就是在一般的按鍵寫法,修改一下,類似這樣

小弟試試,謝謝
回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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