MSP430F5529学习笔记(5)——按键切换灯的亮灭
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); //延时20msif((P2IN & BIT1) == Key_ON) //再次判断按键是否被按下P1OUT ^= BIT0;while((P2IN & BIT1) == Key_ON); //等待按键松开}if((P1IN & BIT1) == Key_ON){delay_ms(20); //延时20msif((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 0000c = a^b;printf("c=0x%x",c); //打印结果位c=0xf0return 0;
}
而a^=b。就是a = a ^ b
#include <stdio.h>int main()
{int a = 0xf1, b = 0x01;//a 1000 0001//b 0000 0001//a 1000 0000a ^= b;printf("a=0x%x",a); //打印结果位a=0xf0return 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也不会有反应。
MSP430F5529学习笔记(5)——按键切换灯的亮灭相关推荐
- 达芬奇pro的FPGA学习笔记4--LED闪烁(500ms灯1亮,500ms灯2亮)
参考正点原子的代码 module led_twinkle( input sys_clk, input sys_rst, output [1:0] led);reg [25:0] cnt = 26'd0 ...
- verilog学习笔记- 10)按键控制 LED 灯实验
目录 简介: 实验任务: 硬件设计: 程序设计: 下载验证 : 总结与反思: 简介: 按键开关是一种电子开关,属于电子元器件类.我们的开发板上有两种按键开关:第一种是本实验所使用的轻触式按键开关,使用 ...
- MSP430F5529学习笔记(2)——点亮LED
TI官方MSP430F5529开发板原理图和中文开发手册:MSP430F5529学习笔记(1)--环境配置 目录 原理图和中文开发手册获取方法 点亮LED1 分析电路图 写程序,点亮LED1 1,首先 ...
- STM32学习笔记:按键实验
STM32学习笔记:按键实验 一.所使用的函数 1.时钟使能函数 RCC_APB2PeriphClockCmd(uint32_t RCC_APB2Periph, FunctionalState New ...
- STM32F072 Nucleo笔记2-利用STM32CuBeMX创建工程并用按键控制LED的亮灭
STM32F072 Nucleo学习笔记2-利用STM32CuBeMX创建工程并用按键控制LED的亮灭 本文例子用到: 1. STM32F072 Nucleo开发板 2. STM32CubeMX软 ...
- 6-51单片机ESP8266学习-AT指令(8266TCP服务器--做自己的AndroidTCP客户端发信息给单片机控制小灯的亮灭)...
http://www.cnblogs.com/yangfengwu/p/8776712.html 先把源码和资料链接放到这里 链接: https://pan.baidu.com/s/1jpHZjW_7 ...
- 红外控制LED灯的亮灭———Arduino
Arduino的中文社区:https://www.arduino.cn/ \黑脸,今天烧坏一个二极管. 原因:正负极没反,没接电阻. 把自己头打烂了- 1. 所需硬件 开发板,led灯(多个),遥控器 ...
- TI CC2530组网演练(BasicRF——无线控制灯的亮灭)
本文将从两个方面着手,一方面分析TI官网下载的CC2530 BasicRF源码中的无线发送,另一方面根据自己的板子来修改实现无线发送控制灯的亮灭. 一.CC2530 BasicRF Basic RF由 ...
- FPGA——输入原理图实现按键控制发光二极管的亮灭
文章目录 前言 一.FPGA的设计流程 二.按键控制发光二极管的亮灭的过程 (一)创建工程 (二)绘制原理图 (三)编译 (四)分配引脚 (五)仿真与时序分析 (六)配置FPGA (七)下载结果 总结 ...
最新文章
- 压缩感知及应用 源代码_【DMD应用】基于压缩感知超分辨鬼成像
- 可视化解释11种基本神经网络架构
- MyEclipse+Tomcat+MAVEN+Git项目完整环境搭建
- 牛客 - 牛妹的考验(AC自动机+dp)
- Spring AOP注解
- 主角有智能芯片的种田小说_5本搞笑玩梗的良品小说,文风轻松幽默,一本正经地逗你笑...
- 同时起两个mysql 起不了_两大龙头同时提价,6月起下游订单V字反转,份额都倾向这两家...
- Matlab2021a安装教程
- ajax简易写法,简单Ajax几种写法
- UI设计新手制作MBE风格图标的思路是什么
- SpringBoot进阶-寻找附近的人,Redis实现交友APP(七)
- win10设置计算机关机时间,w10怎么设置自动关机_win10电脑设置自动关机的方法
- 3D全景图php代码,HTML5 Canvas实现360度全景图的示例代码
- matlab randn 范围,matlab randn 范围
- GitHub 上受欢迎的 Android UI Library(part_one)
- 杰理之使用MIC隔电容方案,微信语音前几秒也出现“哒哒”【篇】
- kubernetes源码剖析读后感(二)
- 阅读书籍:Monte Carlo Methods(第一章 Introduction to Monte CarloMethods)
- 回归分析之汽车保险数据分析
- 2019京东618活动提报要求一览