前斷時間閱讀“大佬”程序,發掘出有幾個好用的,自定義的函數,此類函數巧妙使用返回值,傳遞參數,設置標志位、定時、賦值等功能,今晚特此來分享下。
一、定時功能函數
1.1 user_timer.c
#include "user_define.h" extern U16 timer1_time_cnt; static U16 user_timer_array[USER_TIMER_AMOUNT] = {0}; static U16 timeout_control_array[USER_TIMER_AMOUNT] = {0}; void user_timer_init(void) // 數組初始化 { U8 i = 0 ; for(i = 0; i < USER_TIMER_AMOUNT; i++){ user_timer_array[i] = 0; timeout_control_array[i] = 0; } } /********************* function: The system reference time is added to the user time array. parameter: null return: null *********************/ void add_system_time(void) // 添加 時間 (放主循環) { U16 i = 0 ; U16 temp; temp = timer1_time_cnt; timer1_time_cnt = 0; for(i = 0; i < USER_TIMER_AMOUNT; i++) { if(user_timer_array[i] <= timeout_control_array[i]) user_timer_array[i] += temp; } } /********************* function: Clear the user time count. parameter: USER_TIMER0_CNT ...... USER_TIMERN_CNT or user typedef name return: null *********************/ void clear_time_cnt(U8 time_number) // 清除時間 { if(USER_TIMER_AMOUNT > time_number) user_timer_array[time_number] = 0; } /********************* function: time if arrived parameter: <time_number> USER_TIMER0_CNT ...... USER_TIMERN_CNT or user typedef name <time> check time return: null *********************/ U8 check_time_arrive(U8 time_number, U16 time) // 檢查設定時間,是否到達 { if(USER_TIMER_AMOUNT > time_number){ timeout_control_array[time_number] = time; if(time <= user_timer_array[time_number]) return 1; else return 0; } return 0; }
1.2 user_timer.h
//============================================ //user timer //============================================ #define USER_TIMER_AMOUNT 5 #define KEY_TRIGGER_TIMER 0 #define VR_TIMEOUT_TIMER 1 #define RANDOM_TIMER 2 #define KEY_CONTROL_TIMER 3 #define USER_TIMER_0 4 ////============================================================ //key // ////============================================================ #define KEY_IO_INPUT 0 #define KEY_IO_OUTPUT 1 #define KEY_DEBOUNCE_TIME 8 //8MS #define KEY_LONG_PRESS_TIME 2300 //2s #define KEY_NOT_ACTION 0 #define KEY_CLICK_ACTION 1 #define KEY_LONG_PRESS_ACTION 3 #define KEY_LONG_RELEASE_ACTION 4 extern void user_timer_init(void); extern void add_system_time(void); extern void clear_time_cnt(U8 time_number); extern U8 check_time_arrive(U8 time_number, U16 time);
二、按鍵事件
1.1 user_key.c
#include "user_key.h" static U8 key_event_flag = 0; /* 需注意,當產生單擊事件時,處理完畢后,記得釋放按鍵事件,即調用,void rest_key_state();函數,釋放按鍵。*/
void user_key_init() { key_event_flag = KEY_NOT_ACTION ; }
void user_key_scan(void) { U8 key_state = 1; // 按鍵未被觸發時電平 static U8 key_step = 0; key_state = GPIO_Read(GPIOA, 3); // 按鍵端口賦值 switch(key_step) { case 0: if(key_state) // 第0步,按鍵未被觸發 clear_time_cnt(KEY_TRIGGER_TIMER); // 清除消抖時間 else key_step++; // 按鍵觸發 ,進入第1步 break; case 1: if(key_state) // 再次確認按鍵是否按下 , key_step--; // 若沒有,則返回第0步 else // 如確認按鍵按下 { if(check_time_arrive(KEY_TRIGGER_TIMER, KEY_DEBOUNCE_TIME)) // 檢查按鍵按下時間,是否超過設定消抖時間 ,若超過 { clear_time_cnt(KEY_TRIGGER_TIMER); // 清除消抖時間 key_step++; // 進入 第2步 } } break; case 2: if(key_state) // 若超過設定消抖時間后,按鍵彈起 { clear_time_cnt(KEY_TRIGGER_TIMER); // 清除消抖時間 key_step++; // 進入第3部 } else // 若超過設定消抖時間后,按鍵還未被釋放 { if(check_time_arrive(KEY_TRIGGER_TIMER, KEY_LONG_PRESS_TIME)) //檢查按鍵按下時間是否超過 長按設定時間 ,若超過 { key_event_flag = KEY_LONG_PRESS_ACTION; // 發生長按 動作 按鍵按下 key_step += 2; // 進入第4步 } } break; case 3: if(key_state) // 按鍵被釋放 { if(check_time_arrive(KEY_TRIGGER_TIMER, KEY_DEBOUNCE_TIME)) // 檢查釋放時間是否滿足 消抖時間 ,若滿足 { key_event_flag = KEY_CLICK_ACTION; // 則發生 單擊 動作 key_step = 0; // 返回 第 0 步 } } else // 若按鍵釋放時間 未滿足 消抖時間 ,則 { clear_time_cnt(KEY_TRIGGER_TIMER); // 清除消抖時間 key_step--; // 返回 第3步 ,繼續判斷按鍵按下時間, } break; case 4: if(key_state) // 長按 按鍵釋放后 { if(check_time_arrive(KEY_TRIGGER_TIMER, KEY_DEBOUNCE_TIME)) //檢查長按按鍵 釋放 時間是否滿足 按鍵消抖時間 { key_event_flag = KEY_LONG_RELEASE_ACTION; // 則 發生 長按 動作釋放按鍵 key_step = 0; // 返回 第 0 步 } } break; default: break; } }
uint8_t return_key_state() //返回按鍵 事件值 { return key_event_flag ; } void rest_key_state() //按鍵釋放 { key_event_flag = KEY_NOT_ACTION ; }
1.2 user_key.h
////============================================================ //key // ////============================================================ #define KEY_IO_INPUT 0 #define KEY_IO_OUTPUT 1 #define KEY_DEBOUNCE_TIME 8 //8MS #define KEY_LONG_PRESS_TIME 2300 //2s #define KEY_NOT_ACTION 0 #define KEY_CLICK_ACTION 1 #define KEY_LONG_PRESS_ACTION 3 #define KEY_LONG_RELEASE_ACTION 4
//============================================ //user timer //============================================ #define USER_TIMER_AMOUNT 5 #define KEY_TRIGGER_TIMER 0 #define VR_TIMEOUT_TIMER 1 #define RANDOM_TIMER 2 #define KEY_CONTROL_TIMER 3 #define USER_TIMER_0 4
三、設置標志位
1.1 user_flag.c
#include "User_Flag.h" static idata uint8_t user_flag_array[USER_FLAG_AMOUNT_FLAG_NUMBER] = {0}; void user_flag_init(void) { uint8_t i; for(i = 0; i < USER_FLAG_AMOUNT_FLAG_NUMBER; i++) { user_flag_array[i] = 0; } return; } //設置標志位 void user_Set_flag( uint8_t flag_number , uint8_t flag_set_val ) { user_flag_array[flag_number] = flag_set_val ; } //檢測標志位是否是想要的數 bit check_flag_arrive( uint8_t flag_number, uint8_t flag_dream_val ) { if( user_flag_array[flag_number] == flag_dream_val ) return 1; else return 0; } uint8_t get_arrive( uint8_t flag_number ) //返回標志位值 { return user_flag_array[flag_number] ; } //////////////////////////////////////////////////////////////////////////////////////////// //void user_OTA_set_data( uint8_t flag_number , uint16_t flag_set_val ) //{ // user_OTA_config[flag_number] = flag_set_val ; //} ////返回標志位數值 //uint16_t return_dreanm_val( uint8_t flag_number ) //{ // return user_OTA_config[flag_number]; //} /////////////////////////////////////////////////////////////////////////////////////////
1.2 user_flag.h
#ifndef _User_Flag_H_ #define _User_Flag_H_ #include "includes.h" void user_flag_init(void); void user_Set_flag( uint8_t flag_number , uint8_t flag_set_val ); bit check_flag_arrive( uint8_t flag_number, uint8_t flag_dream_val ); uint8_t get_arrive( uint8_t flag_number ); //uint8_t return_dreanm_val( uint8_t flag_number ); //uint16_t return_dreanm_val( uint8_t flag_number ); //void user_OTA_set_data( uint8_t flag_number , uint16_t flag_set_val ); #endif