实例3—按键控制LED灯—–程序目的:学会如何配置IO为输入与打开上拉电阻
由原理图而知,KEY1接在P1.0上可设置为外部中断按键,KEY2接在P6.3为普通按键,另一端则接在地,也就是说按键为低电平触发,并且没有外加上拉电阻。这就意味我们要使用内部上拉电阻提供在按键释放时的高电平状态,下面我们具体来看看如何配置按键的IO。
我们单独编写个key.c与key.h文件,下面直接贴出代码:
//独立按键底层驱动文件
#include <msp430f249.h>
#include “delay.h”
#include “key.h”
//按键初始化
void Key_Init(void)
{
P1SEL &= ~BIT0;//设置P1.0IO口为普通I/O模式
P1DIR &= ~BIT0;//设置P1.0IO口方向为输入
P1REN |= BIT0;//使能P1.0的内部电阻
P1OUT |= BIT0;//设置P1.0内部上拉电阻为上拉方式
P6SEL &= ~BIT3;//设置P6.3IO口为普通I/O模式
P6DIR &= ~BIT3;//设置P6.3IO口方向为输入
P6REN |= BIT3;//使能P6.3的内部电阻
P6OUT |= BIT3;//设置P6.3内部上拉电阻为上拉方式
}
//按键扫描
u8 Kek_Scan(void)
{
static u8 KeyUpFlag = 1;//按键按松开标志
if(KeyUpFlag && (!KEY1_I || !KEY2_I))
{
Delay_ms(10);//软件去抖
KeyUpFlag = 0;
if(!KEY1_I) return 1;
if(!KEY2_I) return 2;
}
else if(KEY1_I && KEY2_I) KeyUpFlag = 1;
return 0;
}
此按键扫描里有一个KeyUpFlag按键松开标记,主要是为了防止按键一直按住不放而影响外设运行。不推荐大家使用用while(KEY1_I ==0)这种语句判断按键释放,因为这样会死在while语句里,如果外设带有需要快速扫描设备时就被影响,比如是数码管,相信大伙都遇过这种现象,特别是初学者,很多时候都不会去释放CPU,对于一些延时建议多用定时器来做。
//独立按键底层驱动头文件
#ifndef __KEY_H
#define __KEY_H
#include “msp430type.h”
//IO口定义
#define KEY1_I (P1IN & BIT0)//按键1输入
#define KEY2_I (P6IN & BIT3)//按键2输入
//按键初始化
void Key_Init(void);
//按键扫描
u8 Kek_Scan(void);
#endif
再看就是主函数:
#include <msp430f249.h>
#include “msp430type.h”
#include “system.h”
#include “delay.h”
#include “led.h”
#include “key.h”
//主函数
void main(void)
{
u8 Key = 0;
Wdt_Off();//关闭看门狗
Clock_Init();//系统时钟初始化
Led_Init();//led灯初始化
Key_Init();//按键初始化
while(1)
{
Key = Kek_Scan();//按键扫描
switch(Key)
{
case 1:
LED_L;//点亮led灯
break;
case 2:
LED_H;//熄灭led灯
break;
default:
break;
}
}
}
主函数用到了switch开关语句,只要符合条件就进入,否则我连门都不让你进。实现功能很简单,按下按键1则点亮led灯,按键2就熄灭led灯。
按键输入控制LED灯课程完结。源程序:

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!