📄 p292_s1.c
字号:
//例1 单键输入式键盘 P292
//MSP430的P1.0、P1.1、P1.2、P1.3分别和3个按键连线。其中上拉电阻保证了按键断开时,P1.0、P1.1、P1.2、P1.3有确定的高电平。
//在编写软件时,通常采用查询的方法。但MSP430系列单片机的I/O口线本身具有中断能力,例如端口P2或P1,因此也可以采用中断方式。但为了使得程序具有更好的可移植性,这里介绍一下
//查询方法的实现。
/*
将8路的按键电路板接到P1口上观看运行效果
将8路的发光二极管电路板接到P2口上观看运行效果
为了便于说明问题,本实例修改了书本的代码,使之更容易理解
按下P1.0~P1.3对应的按键,同时点亮P2.0~P2.3的LED
*/
#include <msp430x14x.h>
#define NO_KEY 0x0f
#define KEY_K1 0x0e
#define KEY_K2 0x0d
#define KEY_K3 0x0b
#define KEY_K4 0x07
void Delayus(unsigned int DelayTimes)
{
unsigned int i;
for(i=0;i<DelayTimes;i++)
{
_NOP();
}
}
unsigned char GetKey(void)
{
unsigned char cKeyBuffer;
unsigned char cKey;
cKeyBuffer = P1IN & 0x0f; //按键输入,屏蔽P1.4~P1.7的干扰
if(cKeyBuffer != NO_KEY) //有按键按下
{
Delayus(1000); //延时1000us,粗略的延时
cKey = P1IN & 0x0f; //按键输入,屏蔽P1.4~P1.7的干扰
if(cKey == cKeyBuffer) //同一按键
{
return cKey;
}
else return NO_KEY; //按键抖动,不做处理
}
else return NO_KEY; //没有按键按下
}
void main(void)
{
unsigned char keyval=0;
// 初始化端口
P1DIR = 0X00; // P1作为输入
P2DIR = 0X0f; // P2作为输出
P2OUT = 0X0f; //熄灭所以的LED
while(1)
{
keyval = GetKey(); //获取按键值
switch (keyval) //判断按键值
{
case NO_KEY: //无按键按下,熄灭所有的LED
P2OUT = 0xff;
break;
case KEY_K1: //K1的处理
P2OUT &=~BIT0; //点亮P2.0对应的LED
break;
case KEY_K2: //K2的处理
P2OUT &=~BIT1; //点亮P2.1对应的LED
break;
case KEY_K3: //K3的处理
P2OUT &=~BIT2; //点亮P2.2对应的LED
break;
case KEY_K4: //K4的处理
P2OUT &=~BIT3; //点亮P2.3对应的LED
break;
default : //其它情况,不做处理
P2OUT = 0xff;
break;
}
Delayus(50000); //延时,便于看到LED点亮的效果
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -