96SEO 2026-02-20 07:38 0
。

开关的长短键功能笔者在之前的51博文中笔者自己尝试写过#xff0c;功能是有了但写的其实很混乱#xff0c;几乎没有移植的价值。
这次江科大刚好出了新的教程#xff0c;…
其实笔者以前学51的时候按键功能就包含非阻塞式的而且还包括矩阵按键的非组塞式按键实现。
开关的长短键功能笔者在之前的51博文中笔者自己尝试写过功能是有了但写的其实很混乱几乎没有移植的价值。
这次江科大刚好出了新的教程又重新学习了一下。
刚好学到江科大关于串口通信部分了解了状态机的形式思路相比以前突然打开了以前自己写代码总觉得状态标志是个很好的参数因为他可以帮助区分工作流程的各个状态。
分别代表REPEATbit6、Long、Double、Single、UP、Down、HOLDbit7是空位
Key_Flag[KEY_COUNT];//定义全局变量标志位每个标志位互相独立,不同的标志位代表不同的事件void
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,
ENABLE);/*按键使能GPIO初始化常态是高电平按下是低电平*/GPIO_InitTypeDef
GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode
GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin
GPIO_Pin_11;GPIO_InitStructure.GPIO_Speed
GPIO_Speed_50MHz;GPIO_Init(GPIOB,
GPIO_InitStructure);/*按键使能GPIO初始化常态是低电平按下是高电平*/GPIO_InitStructure.GPIO_Mode
GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Pin
GPIO_Pin_15;GPIO_InitStructure.GPIO_Speed
GPIO_Speed_50MHz;GPIO_Init(GPIOB,
Flag)//开关的7个状态FLAG是互斥一个状态只占一位比如单击
//这个函数就是保证不清除bit0位置的状态{Key_Flag[n]
PrevState[KEY_COUNT];//定义现态和前态static
CurrState[i];//当Key_GetState(i)获得新状态时代表着CurrState里面的状态就是前态了CurrState[i]
KEY_PRESSED)//如果检测到开关按下则标志位HOLD置1{Key_Flag[i]
置1其它位保持。
}else//如果没检测到开关按下则标志位HOLD置0{Key_Flag[i]
KEY_UNPRESSED)//如果现态是按下前态是没有按下{Key_Flag[i]
KEY_PRESSED)//如果现态是弹起前态是按下{Key_Flag[i]
KEY_UNPRESSED)//如果现态开关状态是弹起{Time[i]
KEY_PRESSED)//如果检测到开关处于按住状态{Key_Flag[i]
0)//否则的话检测对应开关的时间是否为0{Key_Flag[i]
KEY_UNPRESSED)//如果对应开关现态是弹起{S[i]
KEY_UNPRESSED)//如果对应开关现态是弹起{S[i]
当然这篇也不是来分享注释的纵观江科大的代码在开关稳态的判断上稍显简陋。
因此笔者扩展了一下代码1现在代码对稳态有了更强的判断
对应代码移植的注意点1确定KEY_COUNT的值以降低资源的消耗不一定要一直设置为4用几个设置几个就行
在这几个宏定义里修改参数无需在模块中修改即可拿来使用。
一般来说双击是很少用的功能关于如果屏蔽这个功能宏定义中#define
1原先的200改成1程序就不会检测到双击就只剩单击和长按功能了。
这也是笔者学51时候宋老师给出的编程思路按下开关获得的状态是1每1ms进入中断一次并移位一次因此只要判断Keybuf的值就能知道过去的16ms是不是处于稳态。
如果keybuf[i]
0x0000则说明前16ms开关一直松开如果keybuf[i]
200//把该处的值调低比如设置为1那么程序就不可能检测到双击变相的屏蔽了双击功能
分别代表REPEATbit6、Long、Double、Single、UP、Down、HOLDbit7是空位
{0};//定义全局变量标志位每个标志位互相独立,不同的标志位代表不同的事件
{RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,
ENABLE);/*按键使能GPIO初始化常态是高电平按下是低电平*/GPIO_InitTypeDef
GPIO_InitStructure;GPIO_InitStructure.GPIO_Mode
GPIO_Mode_IPU;GPIO_InitStructure.GPIO_Pin
GPIO_KEY_2;GPIO_InitStructure.GPIO_Speed
GPIO_Speed_50MHz;GPIO_Init(GPIOX_KEY1_KEY2,
GPIO_InitStructure);/*按键使能GPIO初始化常态是低电平按下是高电平*/GPIO_InitStructure.GPIO_Mode
GPIO_Mode_IPD;GPIO_InitStructure.GPIO_Pin
GPIO_KEY_4;GPIO_InitStructure.GPIO_Speed
GPIO_Speed_50MHz;GPIO_Init(GPIOX_KEY3_KEY4,
//这个函数就是保证不清除bit0位置的状态{Key_Flag[n]
PrevState[KEY_COUNT];//定义现态和前态static
)//遍历所有的开关KEY_COUNT的值在Key.H中定义了{Keybuf[i]
CurrState[i];//当Key_GetState(i)获得新状态时代表着CurrState里面的状态就是前态了CurrState[i]
KEY_PRESSED)//如果检测到开关按下则标志位HOLD置1{Key_Flag[i]
置1其它位保持。
}else//如果没检测到开关按下则标志位HOLD置0{Key_Flag[i]
KEY_UNPRESSED)//如果现态是按下前态是没有按下{Key_Flag[i]
KEY_PRESSED)//如果现态是弹起前态是按下{Key_Flag[i]
KEY_UNPRESSED)//如果现态开关状态是弹起{Time[i]
KEY_PRESSED)//如果检测到开关处于按住状态{Key_Flag[i]
0)//否则的话检测对应开关的时间是否为0{Key_Flag[i]
KEY_UNPRESSED)//如果对应开关现态是弹起{S[i]
KEY_UNPRESSED)//如果对应开关现态是弹起{S[i]
/*开关命名索引宏命令取的值与for循环的i有关且是一一对应的因此取值要连续不能随意错位跳过某个数取值的方式比如0,4,1,3这种顺序是不允许的*/
Key_Tick(void);#endif从逻辑上来讲后面的程序对稳态的判断更严格不同场景的使用要求可以按需调整比如稳态判断采用8位的那么时间就是
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback