AVR单片机教程——按键状态

2019-12-02来源: eefocus关键字:AVR  单片机教程  按键状态

今天我们来讲按键。开发板的右下角有4个按键,按下会有明显的“咔嗒”声。如何检测按键是否被按下呢?首先要把按键或直接或间接地连接到单片机上。与之前使用的4个LED不同,4个按键没有全部连接到单片机上——左边2个是连接的,右边2个通过按键上方标有B2、B3的接口引出(从左到右分别为B0、B1、B2和B3)。如果要使用B2、B3,要用杜邦线连接到16个单片机引出针脚上。


开发板库中与按键相关的函数定义在  ,这里是库函数手册。值得一提的是1.1版本的库中,换用枚举类型表示按键等设备,不再使用整数与宏定义(但用整数也是兼容的)。在Atmel Studio 7.0中写代码时,编辑器会提示函数接口,可以根据参数类型知道应该写什么。


对于单片机而言,按键是一种输入设备。程序都有零个或若干个输入,一个或多个输出,而我们学过的唯一一种输出设备就是LED。所以理所当然地,今天我们要用按键来控制LED:按键按下,LED亮起;按键抬起,LED关闭;4个按键分别对应4个LED。


我们先来实现一个简单的版本——只考虑一个按键和一个LED。


程序的流程是:先初始化;然后在主循环中,用 button_down 函数检测按键是否被按下;如果按下,让LED亮;否则让它不亮。再想一想,其实LED的亮暗状态就是 button_down 函数的返回值。


 1 #include

 2 #include

 3 

 4 int main(void)

 5 {

 6     led_init();

 7     button_init(PIN_NULL, PIN_NULL);

 8     while (1)

 9         led_set(LED_RED, button_down(BUTTON_0));

10 }


你可能会想到,对于一个已经亮起的LED,再调用 led_set 让它亮会不会有问题?答案是不会。那么,既然已经亮了,可否设置一个变量保存它是否已亮起,若是则无需再让它亮?当然可以,但是维护这样一个变量可能还不如无脑调用 led_set 来得快。对于LED是这样的,但并非所有设备都是,遇到再说。


现在我们来实现4个按键的版本。把以上循环体中的代码复制4遍是可以的,但这是不良代码的表现。我们可以用数组把表示LED和按键的枚举常量存储起来,对数组遍历执行以上循环体,但这也没有必要。在头文件中我们可以看到, LED_RED 、 BUTTON_0 等枚举常量(1.0版本中是宏)就是从0开始的数字,因此用 for 语句中的 i 就能解决问题了。


 1 #include

 2 #include

 3 

 4 int main(void)

 5 {

 6     led_init();

 7     button_init(PIN_0, PIN_1);

 8     while (1)

 9     {

10         for (int i = 0; i != BUTTON_COUNT; ++i)

11             led_set(i, button_down(i));

12     }

13 }


注意将B2、B3分别连接到端口0和1上。你当然可以改变连接的端口,但也要相应地修改初始化参数。


在上面的代码中,变量 i 的上限是 BUTTON_COUNT - 1 。为什么不是 LED_COUNT 呢?其实是的,它们是相等的。但是我们没法保证它们永远是相等的。设想某一天开发板2.0拥有8个按键,而LED还是4个,led_set 的第一个参数就是不合理的(尽管库函数已经处理好了这个问题)。我们是否有必要在这里写两者中较小的值?没必要。其一,开发者是世界上最聪明的生物,他们(中的部分)能处理好这些问题;其二,相比于软件,硬件是相对稳定的,当硬件更改时,软件往往有必要重写,不是一个上限判断就能解决的;其三,作为初学者,你今天写的代码,一个月后就会觉得很简单,以后这种代码都是信手拈来,这里考虑可复用性没有必要。

 

现在你已经学会如何读取按键状态了。但有时候我们关心的是按键被按下这一动作,而动作是不能仅由一个状态表示的,下一篇教程将介绍实现方案。

关键字:AVR  单片机教程  按键状态 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic481676.html 本网站转载的所有的文章、图片、音频视频文件等资料的版权归版权所有人所有,本站采用的非本站原创文章及图片等内容无法一一联系确认版权者。如果本网所选内容的文章作者及编辑认为其作品不宜公开自由传播,或不应无偿使用,请及时通过电子邮件或电话通知我们,以迅速采取适当措施,避免给双方造成不必要的经济损失。

上一篇:AVR单片机教程——按键动作
下一篇:AVR单片机教程——随机点亮LED

关注eeworld公众号 快捷获取更多信息
关注eeworld公众号
快捷获取更多信息
关注eeworld服务号 享受更多官方福利
关注eeworld服务号
享受更多官方福利

推荐阅读

AVR编程_如何通过软件复位AVR?
Question如何通过软件复位AVR?Answer如果你想通过软件复位AVR,你应该使用内部看门狗。简单的使能它和让它溢出。当看门狗触发后,程序计数器返回到0,清除所有的寄存器和其他正在执行的任务,这与将RESET脚拉低有同样的效果。你不应该处理: --用另一个AVR的引脚连接外部RESET引脚。在短暂的复位时间,AVR的引脚会三态失效,这会导致RESET无效。 --跳到程序地址0,跳到程序地址0,这不会清除全部的寄存器,所以你不会得到一个完整的“复位”。下列是每30mS复位一次AVR的例子代码(GCC):#include <avr/io.h>#include <avr/wdt.h>int main
发表于 2019-12-11
AVR(M48)的i2c程序,读写at24c02
//ICC-AVR application builder : 2007-12-5 17:34:01// Target : m48// Crystal: 1.0000Mhz#include <iom168v.h>#include <macros.h>#include <myfun.h>//#include <I2C.h>#define START 0x08#define ReSTART 0x10#define MT_SLA_ACK 0x18#define MT_DATA_ACK 0x28#define MR_SLA_ACK 0x40#define MR_DATA_ACK
发表于 2019-12-11
AVR ATMEGA8 串口USART
avr串口配置很简单,配置就几个寄存器就可以进收发;但有几点要搞明白的是:1、串口一但被配置成功IO功能自动被占用,这点与LPC或STM8/32不同(需要寄存配置);2、没有专门的串口开起或闭关功位(整个串口);3、读写控制寄存器C需要把URSEL位写成1,而读写UBRRH寄存器时须要URSEL写成0;   1: //晶振频率     2: #define F_CPU 6000000UL     3: //波特率     4: #define BAUD 9600  
发表于 2019-12-10
avr官方充电器
我主要做的是对LiIon电池进行充电,用到的主要是AVR的相位修正PWM和ADC,AVR--PWM分为三种:1.快速PWM模式--单斜边工作模式,计数器从BOTTOM到TOP,对于普通比较模式OCnx在TCNTn与OCRnx匹配时置位,在TOP时清零,PWM频率fpwm = fclk/(N(1+TOP)),N为分频系数。              2.相位修正PWM模式--双斜边工作模式, 计数器重复的从BOTTOM到TOP,然后又从TOP退到BOTTOM,一般工作模式下,往TOP计数时OCnx在TCNTn与OCRnx匹配时清零,往BOTTOM计数时置位,fpwm
发表于 2019-12-10
ubuntu下gcc-avr安装
ubuntu下研究arduino时发现,原来可以不用arduino IDE开发,linux下还有gcc-avr直接开发avr系列的控制器。于是,迫不及待的查看了下相关资料,总结一下安装gcc-avr的步骤。PS:感叹一下,现在ubuntu做得实在是太好用了,以前很费心的事情,现在都很简单了。1、更新下系统,并安装开发包。apt updateapt upgradeapt install build-essential2、安装gcc-avr的工具链。apt install gcc-avr avr-libc avrdude gdb-avr3、安装相关软件的帮助文档。apt install avrdude-doc gcc-doc
发表于 2019-12-10
打造最强Eclipse-嵌入式开发环境(AVR)
,所以当前MinGW是最好的选择,当然你也可以选择CodeBlocks、C-free等等以上安装都比较简单,在网上检索相关博客即可,需要注意的是要添加必要的系统环境变量。为此我使用批处理脚本做了一个插件,敬请期待我的其他博文。推荐其他相关博文:搭建Eclipse IDE AVR开发平台搭建AVR-C语言开发环境eclipse+winavreclipse 环境搭建_百度经验我将其分别安装在D:CODEMinGW   D:CODEeclipse-Luna目录下,这样便于管理我的Eclipse必备插件列表: AVR-Eclipse       辅助配置AVR项目  
发表于 2019-12-10
小广播
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

电子工程世界版权所有 京ICP证060456号 京ICP备10001474号 电信业务审批[2006]字第258号函 京公海网安备110108001534 Copyright © 2005-2019 EEWORLD.com.cn, Inc. All rights reserved