当前位置: 首页 > news >正文

丽江市住房建设局网站潍坊专业汽车贴膜

丽江市住房建设局网站,潍坊专业汽车贴膜,网站项目建设所需成本,校园加盟网站建设STM32F7xx —— 输入 目录 STM32F7xx —— 输入 一、输入配置 二、输入扫描 三、输入处理 一、输入配置 为了灵活使用#xff0c;我们将输入的有效电平设置成可配置。同样是列表表示所有IO口。 // 配置有效电平 typedef enum {KEY_INIT_IS_ACTIVE 0,KEY_LOW_IS_ACTIVE …                              STM32F7xx —— 输入 目录 STM32F7xx —— 输入 一、输入配置 二、输入扫描 三、输入处理 一、输入配置 为了灵活使用我们将输入的有效电平设置成可配置。同样是列表表示所有IO口。 // 配置有效电平 typedef enum {KEY_INIT_IS_ACTIVE 0,KEY_LOW_IS_ACTIVE 1,KEY_HIGH_IS_ACTIVE 2, } key_active_t;#define KEY_CONFIG(gpio, pin) GPIOConfig(gpio, pin, GPIO_MODE_INPUT, GPIO_PULLUP) #define KEY_READ(gpio, pin) HAL_GPIO_ReadPin(gpio, pin)#define KEY1_PORT GPIOH #define KEY1_PIN GPIO_PIN_3#define KEY2_PORT GPIOH #define KEY2_PIN GPIO_PIN_2#define KEY3_PORT GPIOC #define KEY3_PIN GPIO_PIN_13 // demo代码 只传递思想static void key_gpio_config(GPIO_TypeDef *gpio, uint16_t pin) {KEY_CONFIG(gpio, pin); }typedef struct {GPIO_TypeDef *gpio;uint16_t pin; } key_port_t;static key_port_t key_entries[] {{KEY1_PORT, KEY1_PIN},{KEY2_PORT, KEY2_PIN},{KEY3_PORT, KEY3_PIN}, };void KeyInit(void) {uint32_t i, mask 1;for(i 0; i ARRAY_SIZE(key_entries); i){if(0xFFFFFFFF mask){key_gpio_config(key_entries[i].gpio, key_entries[i].pin);#if(CONFIG_KEY_TEST 1) // 测试时使用 //config.key.total_switch KEY_MODE_OPEN;//config.key.sub_switch[i] KEY_MODE_OPEN;config.key.active_tag[i] KEY_LOW_IS_ACTIVE; #endif}mask 1;} }// 输入是否可用 static uint8_t key_is_enable(uint8_t index) {// 这里可以写成可配置 配置IO口可用或者不可用类似一个总开关return 1; }// 有输入到来 static uint8_t key_is_pressed(uint8_t index) {if(key_is_enable(index)){if(KEY_LOW_IS_ACTIVE config.key.active_tag[index]){if(KEY_READ(key_entries[index].gpio, key_entries[index].pin) 0){return 1;}}else if(KEY_HIGH_IS_ACTIVE config.key.active_tag[index]){if(KEY_READ(key_entries[index].gpio, key_entries[index].pin) 1){return 1;}}}return 0; }// 按键被按下 uint8_t Key1IsDown(void) {return key_is_pressed(0); }uint8_t Key2IsDown(void) {return key_is_pressed(1); }uint8_t Key3IsDown(void) {return key_is_pressed(2); }二、输入扫描 // 按键的状态机结构定义 // 按键状态 typedef enum {KEY_STATE_INIT, // 缺省按键状态KEY_STATE_UP, // 按键弹起状态KEY_STATE_DOWN, // 按键按下状态KEY_STATE_LONG, // 按键长按状态KEY_STATE_AUTO, // 按键自动连发状态 } key_state_t;// 按键滤波时间20ms, 单位10ms。 // 只有连续检测到20ms状态不变才认为有效包括弹起和按下两种事件 // 即使按键电路不做硬件滤波该滤波机制也可以保证可靠地检测到按键事件 #define KEY_FILTER_TIME 2 // 滤波消抖 #define KEY_LONG_TIME 100 // 单位10ms 持续1秒认为长按事件 #define KEY_REPEAT_TIME 100 // 单位10ms 持续1秒自动连发typedef uint8_t (*key_cb)(void); typedef struct {uint8_t state; // 按键当前状态(按下还是弹起)uint8_t last; // 上一次按键的状态uint8_t count; // 滤波消抖计数器uint16_t long_time; // 按键按下持续时间, 0表示不检测长按uint16_t long_count; // 长按计数器uint8_t repeat_speed; // 连续按键周期uint8_t repeat_count; // 连续按键计数器key_cb is_down_func; // 按键按下的判断函数,1表示按下 } key_t;static key_t key_items[] {{KEY_STATE_INIT, KEY_STATE_INIT, KEY_FILTER_TIME, KEY_LONG_TIME, 0, KEY_REPEAT_TIME, 0, Key1IsDown},{KEY_STATE_INIT, KEY_STATE_INIT, KEY_FILTER_TIME, KEY_LONG_TIME, 0, KEY_REPEAT_TIME, 0, Key2IsDown},{KEY_STATE_INIT, KEY_STATE_INIT, KEY_FILTER_TIME, KEY_LONG_TIME, 0, KEY_REPEAT_TIME, 0, Key3IsDown}, }; // 按键状态机key_scan // 配置限制条件在这个函数里面加 static void key_scan_ext(key_t *entry, uint8_t i) {switch(entry-state){case KEY_STATE_INIT:case KEY_STATE_UP:{entry-state KEY_STATE_DOWN; // 按键被按下break;}case KEY_STATE_DOWN:{if(entry-long_time 0){if(entry-long_count entry-long_time){if(entry-long_count entry-long_time){entry-state KEY_STATE_LONG;}}}break;}case KEY_STATE_LONG:{if(entry-repeat_speed 0) // 自动连发时间到 自动连发事件{if(entry-repeat_count entry-repeat_speed){entry-repeat_count 0;// 长按触发}}break;}}entry-last entry-state; // 最新的按键状态 }static void key_scan(uint8_t i) {key_t *entry key_items[i];uint8_t key;if(entry-is_down_func()){if(entry-count KEY_FILTER_TIME) // 消抖{entry-count;}else{key_scan_ext(entry, i); // 按键扫描状态机}}else{if(entry-count KEY_FILTER_TIME){entry-count KEY_FILTER_TIME;}else if(entry-count 0){--entry-count;}else{if(KEY_STATE_DOWN entry-last) // 一次完整的按键到这里就弹起了{// 按键按下之后可以加入到队列中这里的队列可以自己写如果带系统可以使用系统的消息队列等方式。// key i 1;// xQueueSend(os_key_queue, key, 10); }entry-last KEY_STATE_UP;entry-state KEY_STATE_UP; // 按键弹起状态}entry-long_count 0;entry-repeat_count 0; // 清空计数器} }三、输入处理 // 按键按下之后会将值加入到队列中我们读取队列数据然后扫描列表匹配功能 static void key1_cb(void); static void key2_cb(void); static void key3_cb(void);#define KEY1_CMD 1 #define KEY2_CMD 2 #define KEY3_CMD 3typedef struct {uint8_t cmd;void (* key_handle_cb)(void); } key_handle_t;static const key_handle_t key_entries[] {{KEY1_CMD, key1_cb},{KEY2_CMD, key2_cb},{KEY3_CMD, key3_cb},{0xFF, NULL }, };// 按键的通用功能 static void key_func(uint8_t func) {}static void key1_cb(void) {}static void key2_cb(void) {}static void key3_cb(void) {}static void key_process(uint8_t event) {const key_handle_t *entry;for(entry key_entries; entry-key_handle_cb; entry){if(event entry-cmd){entry-key_handle_cb();break;}} } 裸机按键扫描20ms执行一次按键处理直接丢在主函数中。自己写队列 系统在任务中执行按键扫描和按键处理。系统自带队列或者邮箱
http://www.zqtcl.cn/news/70389/

相关文章:

  • 兼职招聘网站关于美食html网页设计实例代码
  • 婚庆公司网站建设方案广东网站营销seo方案
  • 潮州 做网站 有钱邢台网站建设的地方
  • 景德镇市建设局网站网站开发实战 课程
  • 福州网站建设询q479185700上快中文互联网巨头衰亡史
  • 手机建设中网站要维护公司的网站该怎么做
  • 网站建设用什么软件有哪些wordpress设置版权信息
  • 小程序推广网站公司网站用wordpress
  • php企业网站建设做热处理工艺的网站有哪些
  • 网站一级域名申请wordpress定时发布没用
  • 高端品牌网站建设石家庄新闻发布会
  • 地产广告设计网站网站搭建同一页不同按钮不同页面
  • 登录中国沈阳网站平面设计包括哪些内容
  • 企业电子网站的建设案例分析瓯北网站制作系统
  • 网站域名使用费网站正在建设中 手机版
  • 青岛手机网站建设重庆市建设工程信息服务平台
  • 商家网站建设临沂网站公众号建设
  • 平台式网站模板下载网站制作报价是否合法
  • 网站的后台是怎么做的中国营销协会官网
  • 网站建设管理概述合肥网站建设 合肥网络推广
  • 用wordpress仿站建设高校图书馆网站的意义
  • 网站公司成功案例怎么写网站建设 李奥贝纳
  • 宁波网站推广公司报价在哪里建网站免费
  • 教育 高校 网站模板专业做商铺的网站
  • ppt怎么做 pc下载网站wordpress 如何修改
  • 专业的教育行业网站制作推广软件的app
  • 设计的网站都有哪些内容我要下载中国建设网站
  • 集约化网站建设管理山西住房建设厅官方网站
  • 制作网站要多少钱网站建设网站制作提供服务
  • 织梦网站查看原有文章论坛源码哪个好