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

蓝桥杯单片机按键进阶

蓝桥杯单片机按键进阶

——基于柳离风老师模板及按键进阶教程

文章目录

  • 蓝桥杯单片机按键进阶
    • 1、按键测试-按下生效
    • 2、按键进阶-松手生效
    • 3、按键进阶-按键禁用(未完待续)

1、按键测试-按下生效

key.c

#include "key.h"/*** @brief 独立按键扫描函数* * @return uchar 键值对应的元件位号*/
uchar key_scan1(void)
{uchar key = 0;                      //按键值static bit key_up = 1;              //按键松开标志,1松开0按下if((key_up == 1) && (P30 == 0 || P31 == 0 || P32 == 0 || P33 == 0)){key_up = 0;if(P30 == 0)          key = 7;else if(P31 == 0)     key = 6;else if(P32 == 0)     key = 5;else if(P33 == 0)     key = 4;return key;}else if(P30 == 1 && P31 == 1 && P32 == 1 && P33 == 1)key_up = 1;return 0;
}/*** @brief 矩阵键盘扫描函数* * @return uchar 键值对应的元件位号*/
uchar key_scan2(void)
{uchar key = 0;                      //按键值static bit key_up = 1;              //按键松开标志,1松开0按下P44 = P42 = 1;                      //列扫描P32 = P33 = 0;if((key_up == 1)&&(P44 == 0 || P42 == 0)){if(P44 == 0)        key = 7;else if(P42 == 0)   key = 11;else                return 0;key_up = 0;                     //标志按下P44 = P42 = 0;P32 = P33 = 1;                  //行扫描if(P32 == 0)   key = key - 2;else if(P33 == 0)   key = key - 3;return key;}else if(P44 == 1 && P42 == 1)key_up = 1;                     //松开return 0;
}

main.c

//按键处理任务
void key_task(void)
{uchar key_num;if(key_dly<10)return;key_dly = 0;
//    key_num = key_scan1();key_num = key_scan2();switch (key_num){/* 独立按键 */
//        case 4:  num++;
//            break;
//        case 5:  num--;
//            break;
//        case 6:  flag_L1 ^= 1;
//            break;
//        case 7:  state_display = (state_display+1)%2;
//            break;/* 矩阵键盘 */case 4:  num++;break;case 5:  num--;break;case 8:  flag_L1 ^= 1;break;case 9:  state_display = (state_display+1)%2;break;}
}

2、按键进阶-松手生效

key.c

#include "key.h"/*** @brief 独立按键扫描函数* * @return uchar 键值对应的元件位号*/
uchar key_scan1(void)
{uchar key = 0;                      //按键值static bit key_up = 1;              //按键松开标志,1松开0按下static bit flag_s4 = 0;             //按键4按下标志if((key_up == 1) && (P30 == 0 || P31 == 0 || P32 == 0 || P33 == 0)){key_up = 0;if(P30 == 0)          key = 7;else if(P31 == 0)     key = 6;else if(P32 == 0)     key = 5;else if(P33 == 0){flag_s4 = 1;                //标记按下key = 4;}return key;}else if(P30 == 1 && P31 == 1 && P32 == 1 && P33 == 1){key_up = 1;if(flag_s4 == 1){flag_s4 = 0;return 40;                  //松手生效}}return 0;
}/*** @brief 矩阵键盘扫描函数* * @return uchar 键值对应的元件位号*/
uchar key_scan2(void)
{uchar key = 0;                      //按键值static bit key_up = 1;              //按键松开标志,1松开0按下static bit flag_s4 = 0;             //按键4按下标志P44 = P42 = 1;                      //列扫描P32 = P33 = 0;if((key_up == 1)&&(P44 == 0 || P42 == 0)){if(P44 == 0)        key = 7;else if(P42 == 0)   key = 11;else                return 0;key_up = 0;                     //标志按下P44 = P42 = 0;P32 = P33 = 1;                  //行扫描if(P32 == 0)   key = key - 2;else if(P33 == 0){key = key - 3;if(key == 4) flag_s4 = 1;   //标记按下,这里判断键值是因为有两种可能s8,s4}return key;}else if(P44 == 1 && P42 == 1){key_up = 1;                     //松开if(flag_s4 == 1){flag_s4 = 0;return 40;                  //松手生效}}return 0;
}

main.c

//按键处理任务
void key_task(void)
{uchar key_num;if(key_dly<10)return;key_dly = 0;
//    key_num = key_scan1();key_num = key_scan2();switch (key_num){/* 独立按键 */
//        case 4:  state_display = 1;//按下显示界面1
//            break;
//        case 5:  num--;
//            break;
//        case 6:  num++;
//            break;
//        case 7:  flag_L1 ^= 1;
//            break;
//        case 40:  state_display = 0;//松手显示界面0
//            break;/* 矩阵键盘 */case 4:  state_display = 1;//按下显示界面1break;case 5:  num--;break;case 8:  num++;break;case 9:  flag_L1 ^= 1;break;case 40:  state_display = 0;//松手显示界面0break;}
}

3、按键进阶-按键禁用(未完待续)

key.c


main.c


http://www.lryc.cn/news/2379132.html

相关文章:

  • CSS- 4.3 绝对定位(position: absolute)学校官网导航栏实例
  • Flink 作业提交流程
  • 拓展运算符
  • Seata源码—6.Seata AT模式的数据源代理一
  • 计算机科技笔记: 容错计算机设计05 n模冗余系统 TMR 三模冗余系统
  • Spring Boot 与 RabbitMQ 的深度集成实践(一)
  • 黑马程序员2024新版C++笔记 第2章 语句
  • HTML5中的Microdata与历史记录管理详解
  • 上位机知识篇---涂鸦智能云平台
  • 面试中的线程题
  • 济南国网数字化培训班学习笔记-第三组-2-电力通信光缆网认知
  • 前端动画库 Anime.js 的V4 版本,兼容 Vue、React
  • 用 PyTorch 从零实现简易GPT(Transformer 模型)
  • 前端JSON序列化中的隐形杀手:精度丢失全解析与实战解决方案
  • 【通用大模型】Serper API 详解:搜索引擎数据获取的核心工具
  • Spring3+Vue3项目中的知识点——JWT
  • python3GUI--智慧交通分析平台:By:PyQt5+YOLOv8(详细介绍)
  • Linux任务管理与守护进程
  • C#里与嵌入式系统W5500网络通讯(2)
  • EMQX开源版安装指南:Linux/Windows全攻略
  • 【计算机视觉】OpenCV实战项目:GraspPicture 项目深度解析:基于图像分割的抓取点检测系统
  • MySQL 数据库备份与还原
  • Kubernetes控制平面组件:Kubelet详解(四):gRPC 与 CRI gRPC实现
  • javax.servlet.Filter 介绍-笔记
  • 从40秒到11毫秒:TiDB环境下一次SQL深潜优化实战
  • Win 11开始菜单图标变成白色怎么办?
  • 入门OpenTelemetry——应用自动埋点
  • C语言链表的操作
  • 芯片生态链深度解析(二):基础设备篇——人类精密制造的“巅峰对决”
  • C语言指针深入详解(二):const修饰指针、野指针、assert断言、指针的使用和传址调用