MSP430F5529学习笔记(5)——按键切换灯的亮灭

2023-11-07

MSP430F5529学习笔记(4)——按键点灯

目录

官方示例代码

内容解析 

BIT0的含义

^=解析

按键消抖

增加的宏定义

问题

解决办法


官方示例代码

官方视频教程里面的代码如下,我做了些许的调整,但是是一样的。只需要看while(1)中的内容。

#define CPU_F ((double)1000000)
#define delay_us(x) __delay_cycles((long)(CPU_F*(double)x/1000000.0))
#define delay_ms(x) __delay_cycles((long)(CPU_F*(double)x/1000.0))


#define Key_ON  0
#define Key_OFF 1

/**
 * main.c
 */

void main()
{
    WDTCTL = WDTPW | WDTHOLD;   // stop watchdog timer
    /****配置LED****/
    //P1.0和P4.7为输出
    P1DIR |= BIT0;
    P4DIR |= BIT7;

    /****配置按键****/
    //P2.1和P1.1为输入
    P2DIR &=~ BIT1;
    P1DIR &=~ BIT1;
    //开启P2.1和P1.1的上下拉
    P2REN |= BIT1;
    P1REN |= BIT1;
    //P2.1和P1.1都为上拉输入
    P2OUT |= BIT1;
    P1OUT |= BIT1;
    while(1)
    {
        if((P2IN & BIT1) == Key_ON)          //判断P2.1是否被按下
        {
            delay_ms(20);                   //延时20ms
            if((P2IN & BIT1) == Key_ON)         //再次判断按键是否被按下
                P1OUT ^= BIT0;
            while((P2IN & BIT1) == Key_ON);     //等待按键松开
        }
        if((P1IN & BIT1) == Key_ON)
        {
            delay_ms(20);                   //延时20ms
            if((P1IN & BIT1) == Key_ON)         //再次判断按键是否被按下
                P4OUT ^= BIT7;
            while((P1IN & BIT1) == Key_ON);     //等待按键松开
        }
    }
}

内容解析 

BIT0的含义

因为代码里面突然出现了一个BIT0,很多人不是很理解BIT0是什么意思,我们鼠标靠近BIT0——>右键——>点击Open Deciaration

 然后我们就能够弹出这个界面,发现BIT0就是0x0001。

^=解析

很多人C语言都学了^=,但是因为长期不使用,已经忘记了,我简单复习一下。^就说进行按位异或,相同取0,不同取1。

注意%x意思的以16进制进行打印,为了让我们更加直观的知道不同位的变化,所以我采用%x

#include <stdio.h>

int main()
{
	int a = 0xf1, b = 0x01, c;
	//a  1000 0001
	//b  0000 0001
	//c  1000 0000
	c = a^b;
	printf("c=0x%x",c);  //打印结果位c=0xf0
	return 0;
}

而a^=b。就是a = a ^ b

#include <stdio.h>

int main()
{
	int a = 0xf1, b = 0x01;
	//a  1000 0001
	//b  0000 0001
	//a  1000 0000
	a ^= b;
	printf("a=0x%x",a);  //打印结果位a=0xf0
	return 0;
}

因为我们知道了BIT0就是0x01。所以 P1OUT ^= BIT0;只会改变第一个位的大小。其他位如果是0,0与0相等,所以还是0。如果其他位为1,1与0不相等,所以结果为1,此位大小依旧不变

按键消抖

按键按下的瞬间是会有抖动的, 导致我们明明是按了1下,但是系统认为我们按了多下。所以我们采用延时的方法,消除按下瞬间的抖动

因为按键消抖的延时只有20ms,我们不能做到按下按键20ms后,马上松开按键。这样会导致,明明我们只按了一次,但是系统依旧认为我们按了多次。比如说,我按键按下了100ms,之后松开,系统就会认为我们按下按键了5次。(假设系统的程序运行是不消耗时间)所以我们增加了一个while判断,只有当按键松开才会进行下一步操作。这样就做到了按一次,系统就知道是一次。

增加的宏定义

为了方便编程和阅读,我增加了两个宏定义,如下。 

#define Key_ON  0
#define Key_OFF 1

问题

这个代码有一个问题,就是假如我按下s1,LED1会有相应的变化。但是我此时不松开s1,继续按s2,我们会发现LED2没有变化。

这是因为我们采用了while,如果s1不松开,程序就不会进入下一步。那么我们即使按下了s2,LED2也不会有反应。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MSP430F5529学习笔记(5)——按键切换灯的亮灭 的相关文章

随机推荐

  • Linux下Samba的配置

    参考 http www cnblogs com mchina archive 2012 12 18 2816717 html 前言 为了实现windows 和 Linux以及其他操作系统之间的资源共享 软件商推出nfs 和samba两种解决
  • Air101

    目录 1 合宙Air101 固件编译可参考 PinOut V2 1092400 管脚映射表 PinOut V2 1091800 2 Air103 最新固件下载 固件编译可参考 PinOut V3 21112201 管脚映射表 资料链接 Pi
  • Solid JS基础

    Solid js 用于构建用户界面的声明式 高效且灵活的 JavaScript 库 您可以在 官方教程 中尝试下面提到的部分例子 本文引用并简化了官方教程中的部分例子 本文讲述部分 solid 主要内容 更多详细内容 移步 Solid AP
  • 编码器的使用

    首先来看一下增量式编码器的输出信号和它的信号倍频技术 增量式编码器输出的脉冲波形信号形式常见的有两种 一种是占空比50 的方波 通道A和B相位差为90 另一种则是正弦波这类模拟信号 通道A和B相位差同样为90 对于第1种形式的方波信号 如果
  • MATLAB量化浮点数

    在做算法设计和验证时 常在matlab进行浮点验证 然后量化后在用在FPGA上 对于类似与FIR这些滤波器系数 matlab直接可以export出来 但是在验证麦克风或者ADC出来的24bit补码这类时常常需要使用matlab生成定点数进行
  • 有关DHCP、链路聚合、NAT、ACL、Telnet配置小综合实验

    实验需求 1 局域网中存在VLAN10 VLAN20 VLAN30和VLAN40四个部门 IP网段 应192 168 10 0 24 192 168 20 0 24 192 168 30 0 24 192 168 40 0 24 2 业务V
  • Linux虚拟机 Ubuntu16 cheese命令打开摄像头黑屏,以及mjpg-stream框架不显示视频界面。

    在Linux虚拟机 Ubuntu16打开笔记本的摄像头时 用 ubuntu16的cheese命令显示黑屏 如下图 解决方法 1 查看虚拟机是否已经已连接上摄像头 显示断开连接 连接主机 D 则虚拟机已连接上摄像头 2 确认摄像头 笔记本的摄
  • 搭建环境【2】windows主机和ubuntu互传文件的4种方法

    我的ubuntu系统是安装在 VMware 虚拟机中的 两者之间经常要互传文件 下面介绍4种常用的互传文件方法 1 共享文件夹方式互传 在虚拟机中需要开启共享文件夹的功能 首先虚拟机中的ubuntu要求是已经开机了的状态 然后进行设置 虚拟
  • 山东轻工业学院高校俱乐部主席“我和我的CSDN高校俱乐部”

    今天天气不错 上午收到了CSDN邮寄过来的2012年度优秀主席证书以及奖品 心情也不错 感谢CSDN教育事业部全体同事一年来对我们工作的支持与帮助 同时也感谢那些奋战在一线的兄弟姐妹们 你们为轻工学院CSDN高校俱乐部所做的一切 我永远铭记
  • ThreadLocal - ThreadlMap与弱引用

    ThreadLocal源码 在看ThreadLocal源码的时候 其中嵌套类ThreadLocalMap中的Entry继承了WeakReferenc static class ThreadLocalMap static class Entr
  • C++ string字符串修改和替换方法详解

    字符串内容的变化包括修改和替换两种 本节将分别讲解字符串内容的修改和字符串内容的替换 字符串内容的修改 可以通过使用多个函数修改字符串的值 例如 assign operator erase 交换 swap 插入 insert 等 另外 还可
  • 使用Guava RateLimiter限流以及源码解析

    前言 在开发高并发系统时有三把利器用来保护系统 缓存 降级和限流 缓存 缓存的目的是提升系统访问速度和增大系统处理容量 降级 降级是当服务出现问题或者影响到核心流程时 需要暂时屏蔽掉 待高峰或者问题解决后再打开 限流 限流的目的是通过对并发
  • win10 graphedit存储的路径

    如果安装郭windows SDK的话 可能的存储位置为C Program Files x86 Windows Kits 10 bin x86 C Program Files x86 Windows Kits 10 bin x64
  • 【C语言学习教程---2】C语言的数据类型

    事物的难度远远低于对事物的恐惧 上一篇文章已经介绍说明了Visual C 的安装和使用 链接如下 C语言学习教程 1 VC 6 0的安装和创建简单C语言工程文件教程 文末有程序代码免费的获取方式 本篇文章开始正式讲解和介绍C语言的知识 在学
  • 安装破解版的edraw max

    一 简介 project是一款好用的项目管理工具 二 安装过程 1 下载安装包 安装软件 安装后先不要运行 https pan baidu com share init surl gKfohSW8XEn 9cYLwnJwdQ h3um 2
  • git:git clone -b提示remote branch master not found in upstream origin

    问题 如标题 解决办法 检查下分支名是否写错了 git创建时有时候不一定有master分支 而是main分支 需要注意
  • Selenium webdriver的无头模式(headless)可能导致cookies内容缺失,以及解决措施

    无头模式 headless 是selenium的webdriver浏览器驱动的一项功能 允许浏览器不出现而仍可访问网页 并与之交互 这对于运行自动化测试或网络抓包大有用处 因为运行速度更快 占用资源更少 但是笔者发现在无头模式下运行时 浏览
  • 高性能mysql一.mysql系统结构和概念

    文章目录 1 1Mysql逻辑架构 1 1 1连接管理和安全性 1 1 2优化与执行 1 2并发控制 1 2 1读写锁 1 2 2锁粒度 1 3事务 1 3 1隔离级别 1 3 2死锁 1 3 3事务日志 1 3 4mysql中的事务 1
  • uni-app 下拉条件筛选菜单组件sl-filter app端不能正常显示

    1 使用uniapp的sl filter组件时 在浏览器中可以正常看到下拉筛选组件如下图1 2 在app中无法看到条件筛选控件 如下图2 3 找到sl filter中sl filter vue中的 created onReady 方法 将
  • MSP430F5529学习笔记(5)——按键切换灯的亮灭

    MSP430F5529学习笔记 4 按键点灯 目录 官方示例代码 内容解析 BIT0的含义 解析 按键消抖 增加的宏定义 问题 解决办法 官方示例代码 官方视频教程里面的代码如下 我做了些许的调整 但是是一样的 只需要看while 1 中的