亚洲春色中文字幕久久久-三上亚,一吻二脱三床四吻胸,国产真实伦对白视频全集,在线毛片观看,精品成品入口黄网,国产毛aⅴ片久久久,亚洲AV色香蕉一区二区三区老师,萧皇后A级艳片,色情日本视频更新,99久久亚洲精品日本无码

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

半阻塞式按鍵判斷程序

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:18253 發(fā)表于 2026-2-23 22:35 | 只看該作者 回帖獎勵 |倒序?yàn)g覽 |閱讀模式
參考江協(xié)科技的定時器實(shí)現(xiàn)非阻塞式按鍵程序中對按鍵狀態(tài)判斷的思路,搞了一個半阻塞式按鍵判斷程序,挺有意思。

#include <STC8H.H>
#include "delay.h"
#include "keyx3.h"


sbit k1 = P3^2;          
sbit k2 = P3^3;       
sbit k3 = P3^4;       

unsigned char num;

//==============================
unsigned char keynum()
{
        unsigned char temp;
        temp = num;
        num = 0;
        return temp;
}

unsigned char key_getnum()//輸出與實(shí)際電平相反,有數(shù)值代表按下,0為未按下。
{
        if(k1 == 0)
        {
                return 1;
        }       

        if(k2 == 0)
        {
                return 2;
        }

        if(k3 == 0)
        {
                return 3;
        }

        return 0;
}


//--------------------------------------------
void key_tick()//在主函數(shù)輪循
{
        static unsigned char currstate, prevstate;

        delayms(20);//阻塞延時
        prevstate = currstate;           //當(dāng)前狀態(tài)傳遞到之前狀態(tài)
        currstate = key_getnum();  //按鍵值傳遞到當(dāng)前狀態(tài)

        if(currstate != 0 && prevstate == 0)
        {
                num =  currstate;
        }

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

使用道具 舉報

沙發(fā)
ID:18253 發(fā)表于 2026-3-10 22:53 | 只看該作者
51單片機(jī)非阻塞多按鍵多功能程序,基于江科協(xié)教程修改。
#ifndef _KEYX3_H_
#define _KEYX3_H_


#define key_count  3

#define key1  0
#define key2  1
#define key3  2

#define hold       0x01//按住不放
#define down           0x02//按下時刻
#define up                   0x04//松開時刻
#define single           0x08//單擊
#define ddouble           0x10//雙擊
#define llong           0x20//長按
#define repeat           0x40//重復(fù)


void key_tick();//放1ms中斷定時器中
unsigned char key_check(unsigned char n, unsigned char flag);//n按鍵名,flag按鍵動作

#endif
回復(fù)

使用道具 舉報

板凳
ID:18253 發(fā)表于 2026-3-10 22:56 | 只看該作者
基于江科協(xié)非阻塞按鍵教程修改,用于STC單片機(jī)環(huán)境多按鍵多功能按鍵程序
#ifndef _KEYX3_H_
#define _KEYX3_H_


#define key_count  3

#define key1  0
#define key2  1
#define key3  2

#define hold       0x01//按住不放
#define down           0x02//按下時刻
#define up                   0x04//松開時刻
#define single           0x08//單擊
#define ddouble           0x10//雙擊
#define llong           0x20//長按
#define repeat           0x40//重復(fù)


void key_tick();//放1ms中斷定時器中
unsigned char key_check(unsigned char n, unsigned char flag);//n按鍵名,flag按鍵動作

#endif
//=======================================================

#include <STC8H.H>
#include "keyx3.h"

#define pressed    1
#define unpressed  0

#define time_double  200
#define time_long    2000
#define time_reper   100

sbit k1 = P3^2;          
sbit k2 = P3^3;       
sbit k3 = P3^4;       
sbit led7 = P2^7;


                                                                      //7     6     5     4       3        2      1      0
unsigned char key_flag[key_count];        //空  repeat  long  double  single   up     down   hold
                                                                      //          0x40    0x20  0x10    0x08     0x04   0x02   0x01
//===========================================================

unsigned char key_getstate(unsigned char n)
{
        if(n == key1)
        {
                if(k1 == 0)
                {
                        return pressed;
                }
        }

        else if(n == key2)
        {
                if(k2 == 0)
                {
                        return pressed;
                }
        }

        else if(n == key3)
        {
                if(k3 == 0)
                {
                        return pressed;
                }
        }

        return unpressed;
}

//-------------------------------------------------------------------------
unsigned char key_check(unsigned char n, unsigned char flag)//通過對這參數(shù)各位檢查,得出結(jié)果
{
        if(key_flag[n] & flag)
        {
                if(flag != 0x01)
                {
                        key_flag[n] &= ~flag;
                }
                return 1;
        }
        return 0;

}


void key_tick()
{
        static unsigned char count, i;
        static unsigned char prevstate[key_count], currstate[key_count];
        static unsigned char s[key_count];
        static unsigned int  time[key_count];
       
        for(i = 0; i < key_count; i++)
        {
                if(time[i] > 0 )
                {
                        time[i]--;
                }
       
        }


        count++;
        if(count >= 20)
        {
                count = 0;
                led7 = ~led7;

               
                for(i = 0; i < key_count; i++)
                {
                        prevstate[i] = currstate[i];
                        currstate[i] = key_getstate(i);
               
                //--基礎(chǔ)事件---------------------------------------
                //--按下與松開,電平觸發(fā)-----------------------------               
                        if(prevstate[i] == pressed)
                        {
                                //hold = 1
                                key_flag[i] |= hold;
                        }
                        else
                        {
                                //hold = 0
                                key_flag[i] &= ~hold;
                        }
               
                //--松開后按下,下降沿觸發(fā)------------------------------               
                        if(prevstate[i] == unpressed && currstate[i] == pressed)
                        {
                                //down = 1
                                key_flag[i] |= down;
                        }
               
                //--按下后松開,上升沿觸發(fā)------------------------------
                        if(prevstate[i] == pressed && currstate[i] == unpressed)
                        {
                                //up = 1
                                key_flag[i] |= up;
                        }
               
               
                //--高級事件-----------------------------------------------
                        if(s[i] == 0)//空閑
                        {
                                if(currstate[i] == pressed)
                                {
                                        time[i] = time_long;//設(shè)定長按時間
                                        s[i] = 1;
                                }       
                        }
               
                        else if(s[i] == 1)//按鍵已按下
                        {
                                if(currstate[i] == unpressed)
                                {
                                         time[i] = time_double;//設(shè)定雙擊時間
                                        s[i] = 2;
                                }
                                else if(time[i] == 0)//長按時間到
                                {
                                        time[i] = time_reper;
                                        //llong = 1
                                        key_flag[i] |= llong;
                                        s[i] = 4;
                                }       
                        }
               
                        else if(s[i] == 2)//按鍵已松開
                        {
                                if(currstate[i] == pressed)
                                {
                                        //double = 1;
                                        key_flag[i] |= ddouble;
                                        s[i] = 3;
                                }
                                else if(time[i] == 0)//設(shè)定雙擊時間到
                                {
                                        //single = 1;
                                        key_flag[i] |= single;
                                        s[i] = 0;
                                }                       
                        }
               
                        else if(s[i] == 3)//按鍵已雙擊
                        {
                                if(currstate[i] == unpressed)
                                {
                                        s[i] = 0;
                                }       
                        }
               
                        else if(s[i] == 4)//按鍵已長按
                        {
                                if(currstate[i] == unpressed)
                                {
                                        s[i] = 0;
                                }
                                else if(time[i] == 0)//重復(fù)時間到
                                {
                                        time[i] = time_reper;
                                        //repeat = 1
                                        key_flag[i] |= repeat;
                                        s[i] = 4;
                                }
                                       
                        }
               
                }//for大括號

//------------------------------------------       
        }//20ms大括號
}//函數(shù)大括號

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的獎勵!

查看全部評分

回復(fù)

使用道具 舉報

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

本版積分規(guī)則

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

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

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