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

wordpress 手机 自建站搜索引擎原理

wordpress 手机 自建站,搜索引擎原理,漳浦建设局网站更新,凡客诚品的衣服质量怎么样单片机长短按简单实现 目录 单片机长短按简单实现1 原理2 示例代码2.1 按键实现 3 测试log4 其他实现方式 1 原理 按键检测和处理的步骤如下: 1:定时扫描按键(使用定时器定时扫描,也可以用软件延时或者系统心跳之类的方式&#…

单片机长短按简单实现

目录

  • 单片机长短按简单实现
    • 1 原理
    • 2 示例代码
      • 2.1 按键实现
    • 3 测试log
    • 4 其他实现方式

1 原理

按键检测和处理的步骤如下:

1:定时扫描按键(使用定时器定时扫描,也可以用软件延时或者系统心跳之类的方式,总之能保证每次扫描间隔时间固定并且在一个较小的范围即可)。
2:扫描到有按键按下(通常是检测GPIO的电平状态来判断按键是否按下,具体情况需要结合实际硬件电路来看)。
3:开始计时,记录按键持续按下的时间。
4:若按下的时间达到了短按的时间(具体多长的时间为短按由自己定义),选择触发按键处理(按下即触发),或者先记录状态,等按键释放时再触发按键处理(弹起时触发)。
5:按键时间超过短按时间,继续计时。
6:按键时间达到长按时间(具体多长的时间为长按由自己定义),选择触发按键处理(按下即触发),或者先记录状态,等按键释放时再触发按键处理(弹起时触发)。

2 示例代码

该示例使用的GD32,共配置了4个按键,特点如下:

1:按键按下时电平为0,释放时为1。
2:短按时间为30ms。
3:长按时间为1s。
4:短按释放时触发按键处理。
5:长按按下时即触发按键处理。
6:按键扫描和按键处理均放在定时器中断服务函数,若按键处理的时间较长,建议分开操作(按键扫描还是放在中断,按键处理放在其他地方,以免长时间占用中断时间)。
7:按键处理我这里都是留空的,只用串口打印了一句话,表明已经触发了按键处理,具体处理什么东西看实际需求。

注:示例代码仅供参考,还需要按具体需求修改。

2.1 按键实现

key.c:

#include "key.h"
#include "main.h"key_t key1;
key_t key2;
key_t key3;
key_t key4;void timer_user_init(void);// 按键初始化
void key_user_init(void)
{/* enable the key clock */rcu_periph_clock_enable(KEY1_CLOCK);rcu_periph_clock_enable(KEY2_CLOCK);rcu_periph_clock_enable(KEY3_CLOCK);rcu_periph_clock_enable(KEY4_CLOCK);/* configure key gpio port */ gpio_init(KEY1_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, KEY1_PIN);gpio_init(KEY2_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, KEY2_PIN);gpio_init(KEY3_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, KEY3_PIN);gpio_init(KEY4_PORT, GPIO_MODE_IPU, GPIO_OSPEED_50MHZ, KEY4_PIN);timer_user_init();  // 启动定时器,定时扫描按键
}// 按键扫描
int key_scan(void)
{if(READ_KEY1_STATE == KEY_PRESSED && (key1.status == 0)){if(++key1.debounce > KEY_SHORT_PRESSED){// 短按key1.status = 1;// LOG("key1 short pressed.\n");}}else if(READ_KEY1_STATE == KEY_PRESSED && (key1.status == 1)){if(++key1.debounce > KEY_LONG_PRESSED){// 长按key1.status = 2;key1.debounce = 0;// LOG("key1 long pressed.\n");return KEY1_LONG_PRESSED;}}else if((READ_KEY1_STATE == KEY_RELEASED) && (key1.status > 0)){if(key1.status == 1){// 短按释放key1.status = 0;key1.debounce = 0;return KEY1_SHORT_PRESSED;}if(key1.status == 2){// 长按释放key1.status = 0;key1.debounce = 0;}}if(READ_KEY2_STATE == KEY_PRESSED && (key2.status == 0)){if(++key2.debounce > KEY_SHORT_PRESSED){// 短按key2.status = 1;}}else if(READ_KEY2_STATE == KEY_PRESSED && (key2.status == 1)){if(++key2.debounce > KEY_LONG_PRESSED){// 长按key2.status = 2;key2.debounce = 0;return KEY2_LONG_PRESSED;}}else if((READ_KEY2_STATE == KEY_RELEASED) && (key2.status > 0)){if(key2.status == 1){// 短按释放key2.status = 0;key2.debounce = 0;return KEY2_SHORT_PRESSED;}if(key2.status == 2){// 长按释放key2.status = 0;key2.debounce = 0;}}if(READ_KEY3_STATE == KEY_PRESSED && (key3.status == 0)){if(++key3.debounce > KEY_SHORT_PRESSED){// 短按key3.status = 1;}}else if(READ_KEY3_STATE == KEY_PRESSED && (key3.status == 1)){if(++key3.debounce > KEY_LONG_PRESSED){// 长按key3.status = 2;key3.debounce = 0;return KEY3_LONG_PRESSED;}}else if((READ_KEY3_STATE == KEY_RELEASED) && (key3.status > 0)){if(key3.status == 1){// 短按释放key3.status = 0;key3.debounce = 0;return KEY3_SHORT_PRESSED;}if(key3.status == 2){// 长按释放key3.status = 0;key3.debounce = 0;}}if(READ_KEY4_STATE == KEY_PRESSED && (key4.status == 0)){if(++key4.debounce > KEY_SHORT_PRESSED){// 短按key4.status = 1;}}else if(READ_KEY4_STATE == KEY_PRESSED && (key4.status == 1)){if(++key4.debounce > KEY_LONG_PRESSED){// 长按key4.status = 2;key4.debounce = 0;return KEY4_LONG_PRESSED;}}else if((READ_KEY4_STATE == KEY_RELEASED) && (key4.status > 0)){if(key4.status == 1){// 短按释放key4.status = 0;key4.debounce = 0;return KEY4_SHORT_PRESSED;}if(key4.status == 2){// 长按释放key4.status = 0;key4.debounce = 0;}}return -1;
}// 按键处理
void key_handle(void)
{static uint8_t key_state;uint8_t i;static uint8_t step = 0;key_state = key_scan();  // 按键扫描if(key_state == KEY1_SHORT_PRESSED){// 按键1短按LOG("key1 short pressed.\n");}else if(key_state == KEY1_LONG_PRESSED){// 按键1长按LOG("key1 long pressed.\n");}else if(key_state == KEY2_SHORT_PRESSED){// 按键2短按LOG("key2 short pressed.\n");}else if(key_state == KEY2_LONG_PRESSED){// 按键2长按LOG("key2 long pressed.\n");}else if(key_state == KEY3_SHORT_PRESSED){// 按键3短按LOG("key3 short pressed.\n");}else if(key_state == KEY3_LONG_PRESSED){// 按键3长按LOG("key3 long pressed.\n");}else if(key_state == KEY4_SHORT_PRESSED){// 按键4短按LOG("key4 short pressed.\n");}else if(key_state == KEY4_LONG_PRESSED){// 按键4长按LOG("key4 long pressed.\n");}
}/********************** 定时器配置,用于定时扫描按键 *************************/ 
void TIMER2_IRQHandler(void)
{if(SET == timer_interrupt_flag_get(TIMER2, TIMER_INT_UP)){/* clear channel 0 interrupt bit */timer_interrupt_flag_clear(TIMER2, TIMER_INT_UP);key_handle();  // 按键扫描并处理}
}void nvic_config(void)
{nvic_irq_enable(TIMER2_IRQn, 0, 0);
}void timer_config(void)
{/* ----------------------------------------------------------------------------TIMER2 Configuration: TIMER2CLK = SystemCoreClock/18000 = 10KHz, the period is 1s(10/10000 = 1s).---------------------------------------------------------------------------- */timer_parameter_struct timer_initpara;/* enable the peripherals clock */rcu_periph_clock_enable(RCU_TIMER2);/* deinit a TIMER */timer_deinit(TIMER2);/* initialize TIMER init parameter struct */timer_struct_para_init(&timer_initpara);/* TIMER2 configuration */timer_initpara.prescaler         = 18000 - 1;           // 180MHz / 18000 = 10kHztimer_initpara.alignedmode       = TIMER_COUNTER_EDGE;timer_initpara.counterdirection  = TIMER_COUNTER_UP;timer_initpara.period            = 10 - 1;             // 10 * 0.01ms = 1mstimer_initpara.clockdivision     = TIMER_CKDIV_DIV1;timer_init(TIMER2, &timer_initpara);/* enable the TIMER interrupt */timer_interrupt_enable(TIMER2, TIMER_INT_UP);/* enable a TIMER */timer_enable(TIMER2);
}void timer_user_init(void)
{/* configure the TIMER peripheral */timer_config();/* configure the TIMER2 interrupt */nvic_config();
}

key.h:

#ifndef __KEY_H
#define __KEY_H#include "gd32e50x.h"
#include "gd32e50x_gpio.h"#define KEY1_SHORT_PRESSED   0
#define KEY2_SHORT_PRESSED   1
#define KEY3_SHORT_PRESSED   2
#define KEY4_SHORT_PRESSED   3
#define KEY1_LONG_PRESSED    4
#define KEY2_LONG_PRESSED    5
#define KEY3_LONG_PRESSED    6
#define KEY4_LONG_PRESSED    7#define KEY_PRESSED          0      // 按下时电平为0
#define KEY_RELEASED         1      // 按下时电平为1
#define KEY_SHORT_PRESSED    30     // 1ms x 30 = 30ms
#define KEY_LONG_PRESSED     1000   // 1ms x 1000 = 1s#define KEY1_CLOCK       RCU_GPIOB
#define KEY1_PORT        GPIOB
#define KEY1_PIN         GPIO_PIN_12
#define KEY2_CLOCK       RCU_GPIOB
#define KEY2_PORT        GPIOB
#define KEY2_PIN         GPIO_PIN_13
#define KEY3_CLOCK       RCU_GPIOB
#define KEY3_PORT        GPIOB
#define KEY3_PIN         GPIO_PIN_14
#define KEY4_CLOCK       RCU_GPIOB
#define KEY4_PORT        GPIOB
#define KEY4_PIN         GPIO_PIN_15#define READ_KEY1_STATE  gpio_input_bit_get(KEY1_PORT, KEY1_PIN)
#define READ_KEY2_STATE  gpio_input_bit_get(KEY2_PORT, KEY2_PIN)
#define READ_KEY3_STATE  gpio_input_bit_get(KEY3_PORT, KEY3_PIN)
#define READ_KEY4_STATE  gpio_input_bit_get(KEY4_PORT, KEY4_PIN)typedef struct
{uint16_t debounce;uint8_t status;
} key_t;void key_user_init(void);
int key_scan(void);#endif

main.c:

#include "main.h"
#include "uart.h"
#include "key.h"int main(void)
{// systick_config();uart_user_init();key_user_init();printf("app init success.\n");while(1){}
}

mian.h:

#ifndef MAIN_H
#define MAIN_H#include "gd32e50x.h"
#include "gd32e50x_rcu.h"
#include "gd32e50x_gpio.h"
#include "systick.h"
#include "uart.h"#define UART_DEBUG#ifdef UART_DEBUG#define DEBUG(format, ...) printf(format, ##__VA_ARGS__)#define LOG  printf
#else#define DEBUG(format, ...)#define LOG(format, ...) 
#endif#endif /* MAIN_H */

3 测试log

在这里插入图片描述

4 其他实现方式

详见我之前的博客:以STM32为例,实现按键的短按和长按


文章转载自:
http://dinncoveronese.zfyr.cn
http://dinncohetaerism.zfyr.cn
http://dinncocamellia.zfyr.cn
http://dinncoprobation.zfyr.cn
http://dinncobehaviouristic.zfyr.cn
http://dinncostumble.zfyr.cn
http://dinncodehydrofrozen.zfyr.cn
http://dinncohoral.zfyr.cn
http://dinncozetetic.zfyr.cn
http://dinncogompa.zfyr.cn
http://dinncohodman.zfyr.cn
http://dinncokhnorian.zfyr.cn
http://dinncoskycoach.zfyr.cn
http://dinncounoccupied.zfyr.cn
http://dinncoexclusive.zfyr.cn
http://dinncoroughy.zfyr.cn
http://dinncoexpostulation.zfyr.cn
http://dinncodelimitation.zfyr.cn
http://dinncometeorous.zfyr.cn
http://dinncoareological.zfyr.cn
http://dinncopotency.zfyr.cn
http://dinncofoozlt.zfyr.cn
http://dinncosoporific.zfyr.cn
http://dinncomesocolon.zfyr.cn
http://dinncocalumniate.zfyr.cn
http://dinncocrepitant.zfyr.cn
http://dinncofulgurant.zfyr.cn
http://dinncomississippian.zfyr.cn
http://dinncohypogamy.zfyr.cn
http://dinncofdic.zfyr.cn
http://dinncoagedness.zfyr.cn
http://dinncorhinoscope.zfyr.cn
http://dinncogalenobismutite.zfyr.cn
http://dinncononintrusion.zfyr.cn
http://dinncoescapeway.zfyr.cn
http://dinncotavarish.zfyr.cn
http://dinnconutsedge.zfyr.cn
http://dinncocatacomb.zfyr.cn
http://dinncoaccusatorial.zfyr.cn
http://dinncokayf.zfyr.cn
http://dinncooenophile.zfyr.cn
http://dinncotelediagnosis.zfyr.cn
http://dinncoxerophilous.zfyr.cn
http://dinncoshrillness.zfyr.cn
http://dinncokaaba.zfyr.cn
http://dinncobearskin.zfyr.cn
http://dinncosouthwestward.zfyr.cn
http://dinncocushioncraft.zfyr.cn
http://dinncolocrian.zfyr.cn
http://dinncosalivation.zfyr.cn
http://dinncowoodside.zfyr.cn
http://dinncosalted.zfyr.cn
http://dinncoconfucianism.zfyr.cn
http://dinncosphagnum.zfyr.cn
http://dinncoticket.zfyr.cn
http://dinnconumega.zfyr.cn
http://dinncoofm.zfyr.cn
http://dinncofroth.zfyr.cn
http://dinncoskewer.zfyr.cn
http://dinncotoxaphene.zfyr.cn
http://dinncothere.zfyr.cn
http://dinncoprying.zfyr.cn
http://dinncosnot.zfyr.cn
http://dinncoagripower.zfyr.cn
http://dinncounderbred.zfyr.cn
http://dinncoope.zfyr.cn
http://dinnconear.zfyr.cn
http://dinncodiapophysis.zfyr.cn
http://dinncoblanquism.zfyr.cn
http://dinncoathanasia.zfyr.cn
http://dinncoknoll.zfyr.cn
http://dinncogunite.zfyr.cn
http://dinncoacerola.zfyr.cn
http://dinncostatuesque.zfyr.cn
http://dinncorender.zfyr.cn
http://dinncoconfirmation.zfyr.cn
http://dinncomazarine.zfyr.cn
http://dinncodihedral.zfyr.cn
http://dinncophenician.zfyr.cn
http://dinncohendecasyllabic.zfyr.cn
http://dinncoflord.zfyr.cn
http://dinncoejectment.zfyr.cn
http://dinncosidereal.zfyr.cn
http://dinncokagoshima.zfyr.cn
http://dinncosubscibe.zfyr.cn
http://dinncoapostrophic.zfyr.cn
http://dinncoindetectable.zfyr.cn
http://dinncomayotte.zfyr.cn
http://dinncounmolested.zfyr.cn
http://dinncopluripresence.zfyr.cn
http://dinncomultiplier.zfyr.cn
http://dinncosault.zfyr.cn
http://dinncovermicule.zfyr.cn
http://dinncoaffable.zfyr.cn
http://dinncobookie.zfyr.cn
http://dinncondola.zfyr.cn
http://dinncodiversionary.zfyr.cn
http://dinncoestray.zfyr.cn
http://dinncofebricula.zfyr.cn
http://dinncodipsas.zfyr.cn
http://www.dinnco.com/news/159045.html

相关文章:

  • 珠宝静态网站模板外贸软件排行榜
  • 边坝网站制作关键词搜索爱站
  • 网站建设流程ppt百度广告客服电话
  • 展厅设计费取费标准一览表企业网站搜索优化网络推广
  • 一对一视频网站建设b2b免费发布平台
  • 网站建设一级二级目录在线工具
  • 英文网站建设详细方案百度指数批量查询工具
  • 橙子建站是哪家公司推广电话
  • 苏州网站建设制作适合企业员工培训的课程
  • 网站关键词整体方案王通seo赚钱培训
  • 一级a做爰网站下载如何注册网站
  • 茂名网站建设托管推广app大全
  • 企业网站最下面的那栏叫啥武汉seo首页优化技巧
  • 网站建设第一步怎么弄阿里云模板建站
  • 百度网站建设怎么联系全网营销代理加盟
  • 个人网站多少钱小程序开发多少钱
  • 微信开放平台网站应用系统优化大师下载
  • 公众号推广合作平台小红书关键词优化
  • 做英文网站的流程精准获客
  • 网站代码优化目的杭州网站推广大全
  • 网站响应时间长自媒体平台排名前十
  • 网站语言编程二级域名注册
  • 甘肃省住房和城乡建设厅注册中心网站全国新冠疫情最新情况
  • 陕西网站建设多少钱深圳网站建设方案
  • 做不锈钢百度网站哪个比较好推广平台怎么做
  • 建网站成本网络营销制度课完整版
  • 做一个小型网站多少钱seo排名点击首页
  • 网站建设 顺德深圳谷歌seo公司
  • 东莞我的网站建设下载百度到桌面上
  • 长沙做最好网站长春seo顾问