【单片机】MSP430f5529单片机,msp430单片机,识别按键单击双击,按键双击判定,驱动程序

news2024/11/25 16:24:47

文章目录

  • 需求
  • 思路介绍
  • 程序源码

需求

MSP430f5529单片机的开发板上面只有2个按键硬件,但是通过识别双击,就可以拥有4个按键了!

识别按键,单击P2.1返回1,单击P1.1返回2,双击P2.1返回3,双击P1.1返回4,无按键返回0。

PS:看了一些别人写的,好像用不了,就自己造轮子。当然,程序可以扩展到所有类型的单片机上去,自己写的理解起来还是轻松的。

在这里插入图片描述

思路介绍

这段程序是一个用于识别按键输入的函数。在MSP430单片机上,P2.1和P1.1分别连接了两个按键。
程序的主要功能是判断按键的状态,根据不同的点击方式返回相应的结果。

程序中使用了几个变量来跟踪按键的状态:

key1_state和key2_state表示P2.1和P1.1按键的状态,初始状态为0,表示没有按下。
key1_count和key2_count用于计数按键持续按下的时间,单位是10毫秒。
程序首先检测P2.1按键(KEY1),如果按键被按下,根据当前状态进行判断:

如果按键之前处于未按下状态(key1_state为0),则将状态设置为1,表示第一次按下。
如果按键之前处于按下后释放状态(key1_state为2)且按键持续按下的时间小于设定的时间敏感度(Time_sensitivity),则将状态设置为3,表示第二次按下。
如果按键未被按下,再根据当前状态进行判断:

如果按键之前处于第一次按下状态(key1_state为1),则将状态设置为2,表示按键已释放。
如果按键之前处于第二次按下状态(key1_state为3),则将状态设置为4,并重置计数器key1_count,用于记录按键持续按下的时间。
再次判断按键持续按下的时间是否小于设定的时间敏感度(Time_sensitivity),如果是,则将key_value设置为3,表示双击了P2.1按键。 同时将状态设置为0,并重置计数器key1_count。
最后对key1_state进行处理:

如果key1_state不为0,则递增计数器key1_count。
如果key1_state为2且key1_count大于设定的时间敏感度(Time_sensitivity),则将key_value设置为1,表示单击了P2.1按键。 同时将状态设置为0,并重置计数器key1_count。
类似地,程序还处理了P1.1按键(KEY2),返回相应的结果。

最后,函数返回key_value,表示按键的结果。如果没有按键被触发,返回值为0,表示无按键操作。

驱动代码,这里是2个按键的,扩展到更多的话自有发挥~

程序源码

驱动如下

#include "msp430.h"


void init_key(void)
{
    //p2.1
    P2DIR &= ~BIT1;
    P2REN |= BIT1;
    P2OUT |= BIT1;
    //p1.1
    P1DIR &= ~BIT1;
    P1REN |= BIT1;
    P1OUT |= BIT1;
}

#define KEY1 (P2IN&BIT1)
#define KEY2 (P1IN&BIT1)


//识别按键,单击P2.1返回1,单击P1.1返回2,双击P2.1返回3,双击P1.1返回4,无按键返回0
//300ms内只有一次点击是单击,否则就是一次双击
//这个函数10ms执行一次
unsigned char get_key(void) {
    //状态0 没有按下
    //状态1 第一次按下
    //状态2 第一次按下后释放
    //状态3 第二次按下
    //状态4 第二次按下后释放
    static unsigned char key1_state = 0, key2_state = 0;
    static unsigned char key1_count = 0, key2_count = 0;

    const static unsigned char Time_sensitivity = 30;//300ms

    unsigned char key_value = 0;

    //key1
    if (!KEY1) {
        if (key1_state == 0) {
            key1_state = 1;
        } else if ((key1_state == 2) && (key1_count < Time_sensitivity)) {
            key1_state = 3;
        }
    } else {
        if (key1_state == 1) {
            key1_state = 2;
        } else if (key1_state == 3) {
            key1_state = 4;
            key1_count = 0;
            if (key1_count < Time_sensitivity) {
                key_value = 3;
                key1_state = 0;
                key1_count = 0;
            }
        }
    }
    if (key1_state) {
        key1_count++;
    }
    if ((key1_state == 2) && (key1_count > Time_sensitivity)) {
        key_value = 1;
        key1_state = 0;
        key1_count = 0;
    }

    //key2
    if (!KEY2) {
        if (key2_state == 0) {
            key2_state = 1;
        } else if ((key2_state == 2) && (key2_count < Time_sensitivity)) {
            key2_state = 3;
        }
    } else {
        if (key2_state == 1) {
            key2_state = 2;
        } else if (key2_state == 3) {
            key2_state = 4;
            key2_count = 0;
            if (key2_count < Time_sensitivity) {
                key_value = 4;
                key2_state = 0;
                key2_count = 0;
            }
        }
    }
    if (key2_state) {
        key2_count++;
    }
    if ((key2_state == 2) && (key2_count > Time_sensitivity)) {
        key_value = 2;
        key2_state = 0;
        key2_count = 0;
    }

    return key_value;
}



调用方式:




void main(void)
{
    WDTCTL = WDTPW | WDTHOLD; /* Stop watchdog timer */

    init_key();


    while (1)
    {

        delay_ms(10);
        key = get_key();
        if (key)
        {
            //显示按键
            count = 0;
            disp[count++] = key % 100 / 10 + '0';
            disp[count++] = key % 10 / 1 + '0';
            disp[count++] = 0;
            OLED_ShowString(0, 0, disp, 0);

            //处理按键
            do_key(key);
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/743148.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

第一百零三天学习记录:数据结构与算法基础:算法和算法分析

注&#xff1a;截图转自王卓数据结构教学视频 算法和算法分析 算法的定义 对特定问题求解方法和步骤的一种描述&#xff0c;它是指令的有限序列。其中每个指令表示一个或多个操作。 算法的描述 自然语言&#xff1a;英文、中文 流程图&#xff1a;传统流程图、NS流程图 伪…

辅助驾驶功能开发-功能规范篇(22)-2-L2级辅助驾驶方案功能规范

1.3.2 TSR 系统功能定义 1.3.2.1 状态机 1.3.2.2 状态迁移表 初始状态转移状态转移条件INITOFF系统自检过程中,为 OFF 状态,自检无故障且车辆上次掉电前,为 OFF 状态INITON自检无故障,车辆为首次上电,或者上次掉电之前,系统为非 OFF 状态INITFAILURE系统自检故障,且上…

系统架构设计师-软件工程(4)

一、软件测试 1、软件测试类型&#xff08;动态测试 / 静态测试&#xff09; ● 动态测试【计算机运行】 &#xff08;1&#xff09;白盒测试法【结构测试】&#xff1a;主要用于单元测试阶段。 a&#xff1a;控制流测试【逻辑覆盖测试&#xff08;语句覆盖最弱&#…

【数据结构与算法】栈算法题

TS 实现栈 interface IStack<T> {push(e: T): void;pop(): T | undefined;peek(): T;isEmpyt(): boolean;size(): number; }// implements: 实现接口, 一个类可以实现多个接口 class ArrayStack<T> implements IStack<T> {private data: T[] []; // private…

【已解决】词云图只显示方框,无法正确显示中文

文章目录 报错及效果图报错代码解决后效果图 解决方案 报错及效果图 报错代码 from wordcloud import WordCloud def drawing_wordcloud(jieba_split):colormaps colors.ListedColormap([#33b846, #a9be70, #e50000])# 生成词云&#xff08;自定义样式&#xff09;mywc1 Wor…

docker 挂载共享文件夹

docker 挂载共享文件夹 1. 目前不太清楚怎么在已经启动的容器中挂载1.1 也不是完全没办法&#xff0c;把当前的容器打包&#xff0c;再使用-v参数重新启动就可以了 1. 目前不太清楚怎么在已经启动的容器中挂载 1.1 也不是完全没办法&#xff0c;把当前的容器打包&#xff0c;再…

运维面试题

这里写目录标题 TCP介绍一下UDP TCP介绍一下 TCP&#xff08;Transmission Control Protocol&#xff0c;传输控制协议&#xff09;是一种面向连接的、可靠的传输层协议。它在计算机网络中负责提供可靠的数据传输和流量控制。 TCP通过使用三次握手建立一个连接&#xff0c;确…

内存函数相关讲解与模拟实现

目录 memcpy 模拟实现memcpy memmove 模拟实现memmove memcmp 结尾 memcpy 由 source指向地址为起始地址的连续n个字节的数据复制到以destination指向地址为起始地址的空间内。格式如下 void * memcpy ( void * destination, const void * source, size_t num ); 说明…

C语言 — 指针进阶篇(下)

前言 指针基础篇回顾可以详见&#xff1a; 指针基础篇&#xff08;1&#xff09;指针基础篇&#xff08;2&#xff09; 指针进阶篇分为上下两篇,上篇介绍1 — 4&#xff0c;下篇介绍5 — 6 字符指针数组指针指针数组数组传参和指针传参函数指针函数指针数组指向函数指针数组的…

SpringBoot 配置文件:什么是配置文件?配置文件是干什么?

文章目录 &#x1f387;前言1.配置文件的格式2. properties配置文件说明2.1 properties基本语法2.2 读取配置文件 3. yml 配置文件说明3.1 yml 基本语法 4.properties与yml 对比 &#x1f387;前言 学习一个东西&#xff0c;我们先要知道它有什么用处。整个项目中所有重要的数…

C语言,指针易错点

1、封装函数&#xff0c;用指针实现字符串连接 #include <stdio.h> #include <string.h> void MyStrcat(char *dest,char *src) {int i;for(i0;*(desti);i);for(int j0;*(srcj);j)*(desti)*(srcj);*(desti)0; } int main(int argc, const char *argv[]) {char des…

Spring详解(学习总结)

目录 一、Spring概述 &#xff08;一&#xff09;、Spring是什么&#xff1f; &#xff08;二&#xff09;、Spring框架发展历程 &#xff08;三&#xff09;、Spring框架的优势 &#xff08;四&#xff09;、Spring的体系结构 二、程序耦合与解耦合 &#xff08;一&…

MySQL与PostgreSQL的区别

MySQL与PostgreSQL的区别 PostgreSQL的特点包括&#xff1a; 1.PostgreSQL是一个免费的对象-关系数据库服务器 (ORDBMS)&#xff0c;在灵活的BSD许可证下发行。 2.PostgreSQL的Slogan是"世界上最先进的开源关系型数据库"。 3.PostgreSQL具有极高的可靠性&#xff…

数据结构--并查集的进一步优化

数据结构–并查集的进一步优化 Find操作的优化(压缩路径) 压缩路径 − − F i n d 操作&#xff0c;先找到根节点&#xff0c;再将查找路径上所有结点都挂到根结点下 \color{red}压缩路径 -- Find操作&#xff0c;先找到根节点&#xff0c;再将查找路径上所有结点都挂到根结点…

第二十三章:存储引擎

第二十三章&#xff1a;存储引擎 ​ 为了管理方便&#xff0c;人们把连接管理、查询缓存、语法解析、查询优化这些并不设计真实数据存储的功能划分为MySQL server的功能&#xff0c;把真实存取数据的功能划分为存储引擎的功能。所以在MySQL server完成了查询优化后&#xff0c…

各种好看的css效果收集

CSS动画特效-多种方案实现CSS光束扫过&#xff0c;扫光特效&#xff0c;ae文字过光效果&#xff0c;光效移动效果 一个集合180种免费的线性渐变网站&#xff0c;可在任何网站使用您不仅可以复制渐变的原生CSS颜色代码&#xff0c;还可以查看下载每个优质的渐变图片。 链接&…

多线程——python进阶知识

多线程与多进程的区别 多线程是单个内核通过锁的手段实现同一时间运行多个程序&#xff0c;在某些情况下可以提升总体的运行效率。同时为了防止多个线程在对同一数据进行修改时导致的不可预测的后果&#xff0c;需要借助锁、队列等保证进程的同步。 多进程是多个内核执行多个…

(赠书活动第4期)编译语言的思考过程

面向对象编程&#xff08;Object-Oriented Programming&#xff0c;简称OOP&#xff09;是一种广泛应用于编程领域的编程范式&#xff0c;对于前端和后端开发都具有重要意义。在这篇说明中&#xff0c;我们将探讨面向对象编程对于前端和后端开发的重要性&#xff0c;并探讨其优…

【Linux指令集】---mv指令(超详细)

个人主页&#xff1a;平行线也会相交 欢迎 点赞&#x1f44d; 收藏✨ 留言✉ 加关注&#x1f493;本文由 平行线也会相交 原创 收录于专栏【Linux专栏】&#x1f388; 本专栏旨在分享学习Linux的一点学习心得&#xff0c;欢迎大家在评论区讨论&#x1f48c; 演示环境&#xff1…

高效工作:ADManager Plus的利器

在当今快节奏的商业环境中&#xff0c;高效的工作是成功的关键。对于IT管理员来说&#xff0c;管理和维护Active Directory&#xff08;AD&#xff09;环境是一项重要的任务。然而&#xff0c;手动处理繁琐的AD管理任务可能会占用大量的时间和精力&#xff0c;影响工作效率。为…