国产亚洲精品福利在线无卡一,国产精久久一区二区三区,亚洲精品无码国模,精品久久久久久无码专区不卡

當前位置: 首頁 > news >正文

網(wǎng)站制作論壇網(wǎng)站推廣怎么弄

網(wǎng)站制作論壇,網(wǎng)站推廣怎么弄,海外精品網(wǎng)站建設(shè),網(wǎng)站開發(fā)后端最新技術(shù)其實筆者以前學(xué)51的時候按鍵功能就包含非阻塞式的,而且還包括矩陣按鍵的非組塞式按鍵實現(xiàn)。開關(guān)的長短鍵功能筆者在之前的51博文中筆者自己嘗試寫過,功能是有了但寫的其實很混亂,幾乎沒有移植的價值。這次江科大剛好出了新的教程,…

????????其實筆者以前學(xué)51的時候按鍵功能就包含非阻塞式的,而且還包括矩陣按鍵的非組塞式按鍵實現(xiàn)。開關(guān)的長短鍵功能筆者在之前的51博文中筆者自己嘗試寫過,功能是有了但寫的其實很混亂,幾乎沒有移植的價值。這次江科大剛好出了新的教程,又重新學(xué)習(xí)了一下。剛好學(xué)到江科大關(guān)于串口通信部分,了解了狀態(tài)機的形式,思路相比以前突然打開了,以前自己寫代碼總覺得狀態(tài)標志是個很好的參數(shù),因為他可以幫助區(qū)分工作流程的各個狀態(tài)。

? ? ? ? 這次江科大的代碼沒了注釋筆者自己注釋了一下。

key.c

#include "stm32f10x.h"                  // Device header
#include "Key.h"/*映射區(qū)還有一些在頭文件Key.h文件里*/
#define KEY_PRESSED				1 //按鍵按下
#define KEY_UNPRESSED			0//按鍵松開#define KEY_TIME_DOUBLE			200
#define KEY_TIME_LONG			2000
#define KEY_TIME_REPEAT			100
/* Key_Flag bit6~bit0 分別代表REPEAT(bit6)、Long、Double、Single、UP、Down、HOLD,bit7是空位   */
uint8_t Key_Flag[KEY_COUNT];//定義全局變量標志位每個標志位互相獨立,不同的標志位代表不同的事件void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/*按鍵使能GPIO初始化,常態(tài)是高電平按下是低電平*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1 | GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);/*按鍵使能GPIO初始化,常態(tài)是低電平按下是高電平*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13 | GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOB, &GPIO_InitStructure);
}uint8_t Key_GetState(uint8_t n) //檢測當前按鍵的電平,并返回相應(yīng)的電平信息
{if (n == KEY_1){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){return KEY_PRESSED;}}else if (n == KEY_2){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0){return KEY_PRESSED;}}else if (n == KEY_3){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 1){return KEY_PRESSED;}}else if (n == KEY_4){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15) == 1){return KEY_PRESSED;}}return KEY_UNPRESSED;
}
/*** 函    數(shù):開關(guān)狀態(tài)檢測函數(shù)* 參    數(shù):uint8_t n 指定開關(guān)編號,可在 KEY_1  KEY_2 KEY_3 KEY_4選擇如需擴展可在KEY.h中添加,KEY_1的值是0 KEY_2的值是1,看頭文件的定義* 參    數(shù):uint8_t Flag指定開關(guān)的狀態(tài)可在下面參數(shù)中現(xiàn)在
//                 KEY_HOLD :按住開關(guān)
//                 KEY_DOWN :按下開關(guān)
//                 KEY_UP   :開關(guān)彈起 這三項一般不作為參數(shù)檢測KEY_SINGLE :單擊KEY_DOUBLE :雙擊KEY_LONG   : 長按KEY_REPEAT : 重復(fù),即一直按住。 后4項狀態(tài)是互斥的但是和前三項可以
* 返 回 值:如果開關(guān)狀態(tài)是例舉(uint8_t Flag)的狀態(tài)則返回1,如果不是則返回0
* 注意事項:開關(guān)狀態(tài)Key_Flag[n]不一定和uint8_t Flag*/
uint8_t Key_Check(uint8_t n, uint8_t Flag)//開關(guān)狀態(tài)檢測
{if (Key_Flag[n] & Flag)//開關(guān)的7個狀態(tài)FLAG是互斥,一個狀態(tài)只占一位比如單擊 0000 1000,只有開關(guān)確實是處于單擊狀態(tài)開關(guān)的結(jié)果才是非0的{if (Flag != KEY_HOLD) //這個函數(shù)就是保證不清除bit0位置的狀態(tài){Key_Flag[n] &= ~Flag; //相應(yīng)的bit控制位清0,其它位保持}return 1;}return 0;
}void Key_Tick(void)
{static uint8_t Count, i;//定義靜態(tài)變量i和Countstatic uint8_t CurrState[KEY_COUNT], PrevState[KEY_COUNT];//定義現(xiàn)態(tài)和前態(tài)static uint8_t S[KEY_COUNT];//定義狀態(tài)static uint16_t Time[KEY_COUNT];//for (i = 0; i < KEY_COUNT; i ++)//KEY_COUNT的值在Key.H中定義了{if (Time[i] > 0){Time[i] --; //對應(yīng)開關(guān)的時間減1}}Count ++;if (Count >= 20)//每20ms進入一次這個函數(shù){Count = 0;for (i = 0; i < KEY_COUNT; i ++)//歷遍所有的開關(guān)狀態(tài){PrevState[i] = CurrState[i];//當Key_GetState(i)獲得新狀態(tài)時代表著CurrState里面的狀態(tài)就是前態(tài)了CurrState[i] = Key_GetState(i);//把開關(guān)狀態(tài)賦值給現(xiàn)態(tài)if (CurrState[i] == KEY_PRESSED)//如果檢測到開關(guān)按下則標志位HOLD置1{Key_Flag[i] |= KEY_HOLD; //KEY_HOLD = 0000 0001則bit 0 置1其它位保持。}else//如果沒檢測到開關(guān)按下則標志位HOLD置0{Key_Flag[i] &= ~KEY_HOLD;//,~KEY_HOLD = 1111 1110 則bit 0置0其它位保持。}if (CurrState[i] == KEY_PRESSED && PrevState[i] == KEY_UNPRESSED)//如果現(xiàn)態(tài)是按下前態(tài)是沒有按下{Key_Flag[i] |= KEY_DOWN;   // KEY_DOWN = 0000 0010 則bit 1置1其它位保持}if (CurrState[i] == KEY_UNPRESSED && PrevState[i] == KEY_PRESSED)//如果現(xiàn)態(tài)是彈起前態(tài)是按下{Key_Flag[i] |= KEY_UP;  // KEY_UP = 0000 0100則bit 2 置1其它位保持}if (S[i] == 0) //如果對應(yīng)開關(guān)處于空閑狀態(tài){if (CurrState[i] == KEY_PRESSED) //如果現(xiàn)態(tài)的開關(guān)狀態(tài)時按下{Time[i] = KEY_TIME_LONG; //對應(yīng)開關(guān)的時間設(shè)置為2000即長按檢測S[i] = 1;//開關(guān)由0態(tài)進入1態(tài)}}else if (S[i] == 1) //如果對應(yīng)開關(guān)處于狀態(tài)1{if (CurrState[i] == KEY_UNPRESSED)//如果現(xiàn)態(tài)開關(guān)狀態(tài)是彈起{Time[i] = KEY_TIME_DOUBLE; //對應(yīng)開關(guān)時間設(shè)置為200S[i] = 2;//開關(guān)由1態(tài)進入2態(tài)}else if (Time[i] == 0) //如果對應(yīng)開關(guān)時間為0{Time[i] = KEY_TIME_REPEAT; //開關(guān)時間設(shè)置為100Key_Flag[i] |= KEY_LONG;//KEY_LONG = 0010 0000,則對應(yīng)標志位bit5 置1其它位保持S[i] = 4;  //開關(guān)由1態(tài)進人4態(tài),}}else if (S[i] == 2) //如果對應(yīng)開關(guān)處于2態(tài){if (CurrState[i] == KEY_PRESSED)//如果檢測到開關(guān)處于按住狀態(tài){Key_Flag[i] |= KEY_DOUBLE;//對應(yīng)開關(guān)設(shè)置標志位 KEY_DOUBLE = 0001 0000,bit4 置1其它位保持S[i] = 3;//開關(guān)進入狀態(tài)3,說明按鍵已然雙擊}else if (Time[i] == 0)//否則的話檢測對應(yīng)開關(guān)的時間是否為0{Key_Flag[i] |= KEY_SINGLE; //對應(yīng)開關(guān)設(shè)置標志位 KEY_SINGLE = 0000 1000,bit3 置1其它位保持S[i] = 0;  //開關(guān)狀態(tài)由2態(tài)回到狀態(tài)0}}else if (S[i] == 3)//如果對應(yīng)開關(guān)處于狀態(tài)3{if (CurrState[i] == KEY_UNPRESSED)//如果對應(yīng)開關(guān)現(xiàn)態(tài)是彈起{S[i] = 0;//開關(guān)由3態(tài)回到狀態(tài)0}}else if (S[i] == 4)//如果對應(yīng)開關(guān)處于狀態(tài)4{if (CurrState[i] == KEY_UNPRESSED)//如果對應(yīng)開關(guān)現(xiàn)態(tài)是彈起{S[i] = 0;//開關(guān)由4態(tài)回到狀態(tài)0}else if (Time[i] == 0)//如果對應(yīng)時間是0{Time[i] = KEY_TIME_REPEAT; //對應(yīng)開關(guān)設(shè)置為重復(fù)按鍵時間100Key_Flag[i] |= KEY_REPEAT; //對應(yīng)開關(guān)標志位設(shè)置為 KEY_REPEAT = 0100 0000 bit6 置1其它位保持S[i] = 4;//開關(guān)已然處于4態(tài)}}}}
}

添一下編程思路


當然這篇也不是來分享注釋的,縱觀江科大的代碼,在開關(guān)穩(wěn)態(tài)的判斷上稍顯簡陋。因此筆者擴展了一下代碼,1)現(xiàn)在代碼對穩(wěn)態(tài)有了更強的判斷 2)對數(shù)組的邊界進行了判斷,防止超過邊界程序不工作。

????????對應(yīng)代碼移植的注意點:1)確定KEY_COUNT的值以降低資源的消耗不一定要一直設(shè)置為4,用幾個設(shè)置幾個就行? 2)添加了按鍵開關(guān)宏定義? ?3)添加了GPIO口宏定義?

在這幾個宏定義里修改參數(shù)無需在模塊中修改即可拿來使用。一般來說雙擊是很少用的功能,關(guān)于如果屏蔽這個功能,宏定義中#define KEY_TIME_DOUBLE? ?1原先的200改成1,程序就不會檢測到雙擊,就只剩單擊和長按功能了。

筆者的穩(wěn)態(tài)加強判斷代碼:

/*有歷史的開關(guān)狀態(tài)判定*/
uint16_t Key_SteadyState(uint8_t n) 
{if (n >= KEY_COUNT) {return 0;  // 索引越界時直接返回0,不執(zhí)行后續(xù)操作}
if (n == KEY_1){if (Keybuf[KEY_1] == 0xFFFF){return KEY_PRESSED;}}if (n == KEY_2){if (Keybuf[KEY_2] == 0xFFFF){return KEY_PRESSED;}}if (n == KEY_3){if (Keybuf[KEY_3] == 0xFFFF){return KEY_PRESSED;}}   if (n == KEY_4){if (Keybuf[KEY_4] == 0xFFFF){return KEY_PRESSED;}} return KEY_UNPRESSED;
}

????????這也是筆者學(xué)51時候宋老師給出的編程思路,按下開關(guān)獲得的狀態(tài)是1,每1ms進入中斷一次并移位一次,因此只要判斷Keybuf的值就能知道過去的16ms是不是處于穩(wěn)態(tài)。如果keybuf[i] =0x0000,則說明前16ms開關(guān)一直松開,如果keybuf[i] = 0xffff,則說明開關(guān)一直按著。

key.c

#include "stm32f10x.h"                  // Device header
#include "Key.h"
/*映射區(qū)*/#define KEY_PRESSED				1 //按鍵按下
#define KEY_UNPRESSED			0//按鍵松開/*開關(guān)閾值時間*/
#define KEY_TIME_DOUBLE			200//把該處的值調(diào)低比如設(shè)置為1那么程序就不可能檢測到雙擊,變相的屏蔽了雙擊功能
#define KEY_TIME_LONG			2000
#define KEY_TIME_REPEAT			100
/*GPIO口宏定義開關(guān)KEY_1 KEY_2都是GPIOB,第二組KEY_3 KEY_4也是GPIOB*/
#define GPIO_KEY_1 GPIO_Pin_1  
#define GPIO_KEY_2 GPIO_Pin_11
#define GPIOX_KEY1_KEY2     GPIOB
#define GPIO_KEY_3 GPIO_Pin_13
#define GPIO_KEY_4 GPIO_Pin_15
#define GPIOX_KEY3_KEY4     GPIOB/* Key_Flag bit6~bit0 分別代表REPEAT(bit6)、Long、Double、Single、UP、Down、HOLD,bit7是空位   */
uint8_t Key_Flag[KEY_COUNT] = {0};//定義全局變量標志位每個標志位互相獨立,不同的標志位代表不同的事件
uint16_t Keybuf[KEY_COUNT] = {0x0000};void Key_Init(void)
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);/*按鍵使能GPIO初始化,常態(tài)是高電平按下是低電平*/GPIO_InitTypeDef GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin = GPIO_KEY_1 | GPIO_KEY_2;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOX_KEY1_KEY2, &GPIO_InitStructure);/*按鍵使能GPIO初始化,常態(tài)是低電平按下是高電平*/GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Pin = GPIO_KEY_3 | GPIO_KEY_4;GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;GPIO_Init(GPIOX_KEY3_KEY4, &GPIO_InitStructure);
}
/*檢測當前按鍵的電平,并返回相應(yīng)的電平信息即開關(guān)狀態(tài)*/
uint16_t Key_GetState(uint8_t n) 
{if (n >= KEY_COUNT) {return 0;  // 索引越界時直接返回0,不執(zhí)行后續(xù)操作}if (n == KEY_1){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_1) == 0){return KEY_PRESSED;}}else if (n == KEY_2){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_11) == 0){return KEY_PRESSED;}}else if (n == KEY_3){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_13) == 1){return KEY_PRESSED;}}else if (n == KEY_4){if (GPIO_ReadInputDataBit(GPIOB, GPIO_Pin_15) == 1){return KEY_PRESSED;}}return KEY_UNPRESSED;
}
/*有歷史的開關(guān)狀態(tài)判定*/
uint16_t Key_SteadyState(uint8_t n) 
{if (n >= KEY_COUNT) {return 0;  // 索引越界時直接返回0,不執(zhí)行后續(xù)操作}
if (n == KEY_1){if (Keybuf[KEY_1] == 0xFFFF){return KEY_PRESSED;}}if (n == KEY_2){if (Keybuf[KEY_2] == 0xFFFF){return KEY_PRESSED;}}if (n == KEY_3){if (Keybuf[KEY_3] == 0xFFFF){return KEY_PRESSED;}}   if (n == KEY_4){if (Keybuf[KEY_4] == 0xFFFF){return KEY_PRESSED;}} return KEY_UNPRESSED;
}/*** 函    數(shù):開關(guān)狀態(tài)檢測函數(shù)* 參    數(shù):uint8_t n 指定開關(guān)編號,可在 KEY_1  KEY_2 KEY_3 KEY_4選擇如需擴展可在KEY.h中添加,KEY_1的值是0 KEY_2的值是1,看頭文件的定義* 參    數(shù):uint8_t Flag指定開關(guān)的狀態(tài)可在下面參數(shù)中選擇
//                 KEY_HOLD :按住開關(guān)
//                 KEY_DOWN :按下開關(guān)
//                 KEY_UP   :開關(guān)彈起 這三項一般不作為參數(shù)檢測KEY_SINGLE :單擊KEY_DOUBLE :雙擊KEY_LONG   : 長按KEY_REPEAT : 重復(fù),即一直按住。 后4項狀態(tài)是互斥的但是和前三項可以共存
* 返 回 值:如果開關(guān)狀態(tài)是例舉(uint8_t Flag)的狀態(tài)則返回1,如果不是則返回0
* 注意事項:開關(guān)狀態(tài)Key_Flag[n]不一定和uint8_t Flag相同*/
uint8_t Key_Check(uint8_t n, uint8_t Flag)//開關(guān)狀態(tài)檢測
{/* 添加邊界檢查:確保 n 在有效索引范圍內(nèi) */if (n >= KEY_COUNT) {return 0;  // 索引越界時直接返回0,不執(zhí)行后續(xù)操作}if (Key_Flag[n] & Flag)//開關(guān)的7個狀態(tài)FLAG一個狀態(tài)只占一位比如單擊 0000 1000,只有開關(guān)確實是處于單擊狀態(tài)開關(guān)的結(jié)果才是非0的{if (Flag != KEY_HOLD) //這個函數(shù)就是保證不清除bit0位置的狀態(tài){Key_Flag[n] &= ~Flag; //相應(yīng)的bit控制位清0,其它位保持}return 1;}return 0;
}void Key_Tick(void)
{static uint8_t Count, i;//定義靜態(tài)變量i和Countstatic uint8_t CurrState[KEY_COUNT], PrevState[KEY_COUNT];//定義現(xiàn)態(tài)和前態(tài)static uint8_t S[KEY_COUNT] ={0};//定義狀態(tài)static uint16_t Time[KEY_COUNT] = {0};//定義開關(guān)時間for (i = 0; i < KEY_COUNT; i ++)//遍歷所有的開關(guān),KEY_COUNT的值在Key.H中定義了{Keybuf[i] = (Keybuf[i] << 1) | Key_GetState(i) ;//當前的開關(guān)狀態(tài)賦值給狀態(tài)監(jiān)控數(shù)組if (Time[i] > 0){Time[i] --; //對應(yīng)開關(guān)的時間減1}}Count ++;if (Count >= 20)//每20ms進入一次這個函數(shù){Count = 0;for (i = 0; i < KEY_COUNT; i ++)//歷遍所有的開關(guān)狀態(tài){PrevState[i] = CurrState[i];//當Key_GetState(i)獲得新狀態(tài)時代表著CurrState里面的狀態(tài)就是前態(tài)了CurrState[i] =Key_SteadyState(i)  ;//把穩(wěn)定的開關(guān)狀態(tài)賦值給現(xiàn)態(tài)if (CurrState[i] == KEY_PRESSED)//如果檢測到開關(guān)按下則標志位HOLD置1{Key_Flag[i] |= KEY_HOLD; //KEY_HOLD = 0000 0001則bit 0 置1其它位保持。}else//如果沒檢測到開關(guān)按下則標志位HOLD置0{Key_Flag[i] &= ~KEY_HOLD;//,~KEY_HOLD = 1111 1110 則bit 0置0其它位保持。}if (CurrState[i] == KEY_PRESSED && PrevState[i] == KEY_UNPRESSED)//如果現(xiàn)態(tài)是按下前態(tài)是沒有按下{Key_Flag[i] |= KEY_DOWN;   // KEY_DOWN = 0000 0010 則bit 1置1其它位保持}if (CurrState[i] == KEY_UNPRESSED && PrevState[i] == KEY_PRESSED)//如果現(xiàn)態(tài)是彈起前態(tài)是按下{Key_Flag[i] |= KEY_UP;  // KEY_UP = 0000 0100則bit 2 置1其它位保持}if (S[i] == 0) //如果對應(yīng)開關(guān)處于空閑狀態(tài){if (CurrState[i] == KEY_PRESSED) //如果現(xiàn)態(tài)的開關(guān)狀態(tài)時按下{Time[i] = KEY_TIME_LONG; //對應(yīng)開關(guān)的時間設(shè)置為2000即長按檢測S[i] = 1;//開關(guān)由0態(tài)進入1態(tài)}}else if (S[i] == 1) //如果對應(yīng)開關(guān)處于狀態(tài)1{if (CurrState[i] == KEY_UNPRESSED)//如果現(xiàn)態(tài)開關(guān)狀態(tài)是彈起{Time[i] = KEY_TIME_DOUBLE; //對應(yīng)開關(guān)時間設(shè)置為200S[i] = 2;//開關(guān)由1態(tài)進入2態(tài)}else if (Time[i] == 0) //如果對應(yīng)開關(guān)時間為0{Time[i] = KEY_TIME_REPEAT; //開關(guān)時間設(shè)置為100Key_Flag[i] |= KEY_LONG;//KEY_LONG = 0010 0000,則對應(yīng)標志位bit5 置1其它位保持S[i] = 4;  //開關(guān)由1態(tài)進人4態(tài),}}else if (S[i] == 2) //如果對應(yīng)開關(guān)處于2態(tài){if (CurrState[i] == KEY_PRESSED)//如果檢測到開關(guān)處于按住狀態(tài){Key_Flag[i] |= KEY_DOUBLE;//對應(yīng)開關(guān)設(shè)置標志位 KEY_DOUBLE = 0001 0000,bit4 置1其它位保持S[i] = 3;//開關(guān)進入狀態(tài)3,說明按鍵已然雙擊}else if (Time[i] == 0)//否則的話檢測對應(yīng)開關(guān)的時間是否為0{Key_Flag[i] |= KEY_SINGLE; //對應(yīng)開關(guān)設(shè)置標志位 KEY_SINGLE = 0000 1000,bit3 置1其它位保持S[i] = 0;  //開關(guān)狀態(tài)由2態(tài)回到狀態(tài)0}}else if (S[i] == 3)//如果對應(yīng)開關(guān)處于狀態(tài)3{if (CurrState[i] == KEY_UNPRESSED)//如果對應(yīng)開關(guān)現(xiàn)態(tài)是彈起{S[i] = 0;//開關(guān)由3態(tài)回到狀態(tài)0}}else if (S[i] == 4)//如果對應(yīng)開關(guān)處于狀態(tài)4{if (CurrState[i] == KEY_UNPRESSED)//如果對應(yīng)開關(guān)現(xiàn)態(tài)是彈起{S[i] = 0;//開關(guān)由4態(tài)回到狀態(tài)0}else if (Time[i] == 0)//如果對應(yīng)時間是0{Time[i] = KEY_TIME_REPEAT; //對應(yīng)開關(guān)設(shè)置為重復(fù)按鍵時間100Key_Flag[i] |= KEY_REPEAT; //對應(yīng)開關(guān)標志位設(shè)置為 KEY_REPEAT = 0100 0000 bit6 置1其它位保持S[i] = 4;//回到狀態(tài)4}}}}
}

key.h

#ifndef __KEY_H
#define __KEY_H/*使能開關(guān)的個數(shù),根據(jù)工程的需要更該參數(shù)*/
#define KEY_COUNT				4
/*開關(guān)命名索引,宏命令取的值與for循環(huán)的i有關(guān)且是一一對應(yīng)的因此取值要連續(xù)不能隨意錯位,跳過某個數(shù)取值的方式,比如0,4,1,3這種順序是不允許的*/
#define KEY_1					0
#define KEY_2					1
#define KEY_3					2
#define KEY_4					3
/* 參數(shù)修改區(qū),按工程需要重命名開關(guān)名字*/
#define Key_Safe          KEY_1   // 安全開關(guān)
#define Key_Start         KEY_2   // 啟動開關(guān)
#define Key_Stop          KEY_3   // 停止開關(guān)
#define Key_Reset         KEY_4   // 復(fù)位開關(guān)#define KEY_HOLD				0x01 //0000 0001
#define KEY_DOWN				0x02 //0000 0010
#define KEY_UP					0x04 //0000 0100
#define KEY_SINGLE				0x08 //0000 1000
#define KEY_DOUBLE				0x10 //0001 0000
#define KEY_LONG				0x20 //0010 0000
#define KEY_REPEAT				0x40 //0100 0000void Key_Init(void);
uint8_t Key_Check(uint8_t n, uint8_t Flag);
void Key_Tick(void);#endif

從邏輯上來講后面的程序?qū)Ψ€(wěn)態(tài)的判斷更嚴格,不同場景的使用要求可以按需調(diào)整,比如穩(wěn)態(tài)判斷采用8位的,那么時間就是 8ms,count的值改小一點。

http://m.aloenet.com.cn/news/37988.html

相關(guān)文章:

  • 松山湖仿做網(wǎng)站關(guān)聯(lián)詞有哪些四年級
  • 中國建設(shè)銀行官網(wǎng)站代發(fā)工資濰坊關(guān)鍵詞優(yōu)化軟件
  • 中國建設(shè)銀行濟南招聘信息網(wǎng)站google搜索app下載
  • WordPress金融網(wǎng)站seo課程排行榜
  • 視頻網(wǎng)站如何做seo如何做電商賺錢
  • 四川省建設(shè)信息網(wǎng)站貴州seo學(xué)校
  • 南昌網(wǎng)站建設(shè)培訓(xùn)班seo優(yōu)化基礎(chǔ)教程pdf
  • qq整人網(wǎng)站怎么做百度首頁百度一下
  • 新鄉(xiāng)營銷型網(wǎng)站建設(shè)產(chǎn)品營銷推廣策略
  • 百度站長怎么做網(wǎng)站維護二級域名查詢?nèi)肟?/a>
  • 一學(xué)一做看視頻網(wǎng)站網(wǎng)站推廣的渠道有哪些
  • 做網(wǎng)站頁面該建多大的畫布以圖搜圖百度識圖
  • 做網(wǎng)站用java還是c語言專業(yè)推廣引流團隊
  • 網(wǎng)站維護一般多久上海優(yōu)化外包
  • 法院文化建設(shè)網(wǎng)站女孩短期技能培訓(xùn)班
  • 網(wǎng)站后臺管理系統(tǒng)制作教程長春網(wǎng)站優(yōu)化哪家好
  • 營銷型網(wǎng)站制作哪家好網(wǎng)絡(luò)營銷的特點
  • 網(wǎng)站建設(shè)方案及預(yù)算百度上做優(yōu)化一年多少錢
  • 湛江網(wǎng)站的建設(shè)網(wǎng)站關(guān)鍵詞優(yōu)化推廣哪家快
  • 網(wǎng)站中的qq客服怎么做班級優(yōu)化大師是干什么用的
  • 如何推廣運營網(wǎng)站百度付費推廣
  • 網(wǎng)站建設(shè)頭部代碼網(wǎng)站描述和關(guān)鍵詞怎么寫
  • 長沙私人做網(wǎng)站現(xiàn)在推廣平臺哪家最好
  • wordpress和emlog重慶seo和網(wǎng)絡(luò)推廣
  • 網(wǎng)站開發(fā)文檔管理工具韓國網(wǎng)站
  • 淄博網(wǎng)站建設(shè)相關(guān)文章如何快速推廣
  • 天津做網(wǎng)站優(yōu)化公司上海網(wǎng)絡(luò)推廣優(yōu)化公司
  • 如何在網(wǎng)站后臺找到死鏈接群站優(yōu)化之鏈輪模式
  • 老河口做網(wǎng)站免費的外貿(mào)b2b網(wǎng)站
  • 單位網(wǎng)站建設(shè)工作功勞網(wǎng)絡(luò)營銷策劃書包括哪些內(nèi)容