学习了简单的IO口输出点灯实验,IO既有输出也有输入,在MSP430中输出由PxOUT寄存器进行操作,相对应的就有输入寄存器PxIN来进行输入的操作。
为体现按键效果我采用了按键控制LED灯的使用场景,这个也是单片机中按键的基础操作,通过对输入信号的检测来改变输出信号。首先我们是对LED的简单配置
WDTCTL = WDTPW +WDTHOLD;// stop watchdog timer
P1DIR |=BIT0;//板载LED设置为输出
P1OUT|=BIT0;
以上操作即为关闭看门狗,设置对应IO口输出状态并给予IO口初始状态,如有疑问可参照我上一篇笔记。
按键外设的IO口配置
按键作为常用外设之一,在控制领域使用较多,同时也是非常经典的IO口电平检测案例,跟输出一样,首先也要对其进行基本的IO口配置。
P1DIR &=~BIT1;//板载按键s2设为输入
P1REN =BIT1;//上拉电阻,提高稳定性
P1OUT |=BIT1;//设置初始值为高电平
首先是通过DIR方向选择寄存器将其设置为输入状态,第二行的作用为增加其稳定性,在实际的操作中我们一般习惯性添加。在以上两行设置完成后即对按键IO口进行初始化设置,将其拉至高电平状态。
按键按下检测
通过对PxIN寄存器的读取可以得知当前Px端口的输入情况,将其与BIT1进行与运算后可以检测对应端口是否有按键按下,通常使用的判断方式为:
if(P1IN&BIT1)
通过扫描IO口输入状态,例如当按键未按下时P1IN与BIT1的值为1,按下时PxIN口检测到电平变化,与运算时P1.1口获取低电平与BIT1中的高电平相与得0从而来判断按键是否按下。
简易按键控制开关灯
通过对按键检测原理的了解,我们可以结合点灯得实验来进行模拟按键控制开关灯的效果,当按键按下时灯关闭,否则常亮,代码如下:
while(1)
{
if(P1IN&BIT1)
P1OUT|=BIT0;
else
P1OUT&=~BIT0;
}
按键按下时LED灯熄灭,送开始LED灯打开,同时在按键按下过程中通过调节PXREN的添加与否发现,使能上下拉电阻会对按键有一定的影响,未添加时确实存在少量抖动情况,同时还可添加简单延时函数进行消抖处理,例如:
while(1)
{
if(P1IN&BIT1)
{
__delay_cycles(2000);
if(P1IN&BIT1)
P1OUT|=BIT0;
}
else
P1OUT&=~BIT0;
}
其中__delay_cycles();为#include<msp430.h>头文件自带的延时函数,其延时计数以机器周期为单位进行,在括号内写入适当的值可以实现简单延时的效果,在本次笔记的第4讲定时器讲解中会提到如何使用其进行MS,US级延时的配置。
简易双按键控制灭灯
按键点灯完成后,简单书写了一个两按键同时按下才可灭灯程序,供大家参考。可以利用这种判断来进行对寻迹小车,多路红外灯外设的检测和响应。
void main(void)
{
WDTCTL = WDTPW +WDTHOLD;// stop watchdog timer
P1DIR |=BIT0;//板载LED设置为输出
P1DIR &=~BIT1;//板载按键s2设为输入
P2DIR &=~BIT1;//板载按键s1设为输入
P2REN =BIT1;P1REN =BIT1;//上拉电阻
P1OUT |=BIT1;P2OUT |=BIT1;//初始状态为高电平
while(1)
{
if((P1IN&BIT1)|(P2IN&BIT1))
P1OUT|=BIT0;
else
P1OUT&=~BIT0;
}
}
希望点灯和按键这两章可以让大家简单了解MSP430的端口配置,检测,输出和输入等操作,有了这两章的基础即可进行简单的电子制作,在实践中学习和进步。