AVR单片机教程——数字输入】的更多相关文章

我们已经学习了如何使用按键和拨动开关,不知你有没有好奇 button_down 和 switch_status 等函数是如何实现的.本篇教程带你一探究竟,让我们从按键的原理开始. 在原理图中,按键的符号如下图所示: 符号很简单,就是两个触点上方有一个动片,当按下时与两个触点接触.实际上按键内部的机械结构大体上就是这样,实现的功能是,没有按下时两端断路,按下时两端短路. 还有一种画法是这样的,即电键: 就按键内部的机械结构来说,第一种更加真实,但从电路角度来看,两者没什么区别. 但是我们的开发板上…
从上一篇教程中我们了解到,按键与开关的输入本质上就是数字信号的读取.这一篇教程要讲的是,控制LED的原理是数字信号的输出.数字IO是单片机编程之有别于桌面编程的各项内容中最简单.最基础的. 在讲数字信号输出之前,我们先来了解一下它控制的器件.LED,是一种二极管,在理想模型中,加以正向电压会发光,反向电压则不会.在稍微实际一点的模型中,当正向电压超过一定阈值时,二极管会发光,其电流会随着正向电压的增大而急剧增大:对反向电压的耐受力也是有限的.现实中的LED的具体参数因生产厂家而异,一般红色与黄色…
好久没写这个系列了.今天讲讲旋转编码器. 旋转编码器好像不是单片机玩家很常用的器件,但是我们的开发板上有,原因如下: 旋转编码器挺好用的.电位器能旋转的角度有限,旋转编码器可以无限圈旋转:旋转时不连续,有卡点,适合对应离散数据. 开发板上选用的旋转编码器,使用起来简单.方便. 本来旁边的电位器(旋钮,以后会讲)一枝独秀,挺孤单的,我就配一个高度大致相同的旋转编码器陪伴它. 今天我想写旋转编码器,于是在网络上搜索了一下,相关资料很少.最基本地,旋转编码器的作用是将角位移.角速度等机械量转换为电信号…
先解答之前一个思考题:如果不把引脚配置为输出而写高电平,连接LED会怎样? 实验结果是,LED会亮,但相比于输出高电平的情况,亮度很低.这是为什么呢? 通过上一篇教程我们知道,引脚输入输出模式是由寄存器DDRx中DDxn位控制的,可以推断出 pin_mode 函数会改变一个引脚对应的DDxn值,输入为0,输出为1,而其复位后的值为0,即输入,因此如果不把引脚配置为输出,它的模式就是输入.类似地 pin_write 函数会改变PORTxn,其值为函数的第二个参数. 所以不配置输出而写高电平的结果就…
在按键的上方有4个拨动开关.开关与按键,在原理和使用方法上都是很类似的,但有不同的用途——按键按下后松开就会弹起,而开关可以保存其状态. <switch.h> 定义了与开关相关的函数.switch_status 对应 button_down ,switch_changed 对应 button_pressed ,使用与按键是基本相同的. 这里通过一个异常简单的例子来演示开关函数的使用,并说明开关操作与按键的细微差别:使LED与开关状态保持同步. 仿照上一篇教程,我们可以简单地把 button_p…
上一篇教程中我们学习了如何读取按键状态.而按键的动作,比如单击,至少需要两个状态才能判定,长按.双击的判定更加复杂.今天我们来学习如何使用库函数判断按键单击,以及其实现原理. 我们要实现的是:当一个按键被单击时,一个LED的状态改变(即亮变暗,暗变亮):4个按键对应4个LED.利用库提供的 button_pressed 函数,很容易就能实现这个功能. #include <ee1/button.h> #include <ee1/led.h> #include <ee1/dela…
好久没更新了,今天开始继续,争取日更. 今天我们来讲按键.开发板的右下角有4个按键,按下会有明显的“咔嗒”声.如何检测按键是否被按下呢?首先要把按键或直接或间接地连接到单片机上.与之前使用的4个LED不同,4个按键没有全部连接到单片机上——左边2个是连接的,右边2个通过按键上方标有B2.B3的接口引出(从左到右分别为B0.B1.B2和B3).如果要使用B2.B3,要用杜邦线连接到16个单片机引出针脚上. 开发板库中与按键相关的函数定义在 <ee1/button.h> ,这里是库函数手册.值得一…
之前我们做的闪烁LED和流水灯,灯效都是循环的.这次我们来尝试一些不一样的——每一次随机选择一个LED并点亮. 要实现随机的效果,我们要用C语言标准库中的相关设施: #define RAND_MAX /*implementation defined*/ int rand(); void srand(unsigned seed); 以上设施都定义在 <stdlib.h> 中.其中,rand() 可以返回[0, RAND_MAX ]范围内的伪随机整数,srand() 用于给 rand() 提供种子…
上次我们用 delay 函数与 while 循环实现了一个LED的闪烁.这一次我们把所有LED加入进来,让它们依次闪烁,形成流水灯的效果. 开发板上有4个LED,我们可以用不多的语句把循环体直接描述出来(看看就行,不用敲): led_set(LED_RED , LED_ON); delay(); led_set(LED_RED , LED_OFF); led_set(LED_YELLOW, LED_ON); delay(); led_set(LED_YELLOW, LED_OFF); led_s…
上次我们把LED点亮了.你可能已经试过把 LED_RED 换成其他灯,也可能已经用 led_on() 把所有LED一起点亮了.但是LED点亮以后,程序就退出了,之后LED一直没有暗,直到没有供电.这一次,我们用程序来控制LED的亮和暗. 新建一个C executable项目,选择ATmega324PA单片机,在项目属性中添加库libee1,将配置改为Release.这是本教程现阶段中每一次新建项目都要做的.我刚才尝试用project template简化,然而设置无法导入. 默认生成的main.…