📄 hnr_s1.c
字号:
//例1 单键输入式键盘 P292
//MSP430的P1.0、P1.1、P1.2分别和3个按键连线。其中上拉电阻保证了按键断开时,P1.0、P1.1、P1.2有确定的高电平。
//采用中断的方法实现
/*
将8路的按键电路板接到P1口上观看运行效果
将8路的发光二极管电路板接到P2口上观看运行效果
为了便于说明问题,本实例修改了书本的代码,使之更容易理解
按下P1.0~P1.2对应的按键,同时点亮P2.0~P2.2的LED
*/
#include <msp430x14x.h>
#define NO_KEY 0x07
#define KEY_K1 0x06
#define KEY_K2 0x05
#define KEY_K3 0x03
unsigned char keyonflag = 0x00; //按键按下标志
unsigned char keyval = 0x00; //按键值
void Delayus(unsigned int DelayTimes)
{
unsigned int i;
for(i=0;i<DelayTimes;i++)
{
_NOP();
}
}
void main(void)
{
WDTCTL = WDTPW + WDTHOLD;
// 初始化端口
P1DIR = 0X00; // P1作为输入
P1IE = 0x07; //P1.0~p1.2 作为按键中断
P1IES = 0x07; //下降沿中断
P2DIR = 0X07; // P2.0~P2.2作为输出
P2OUT = 0X07; //熄灭所以的LED
_EINT(); //开启中断
while(1)
{
if(keyonflag != 0x00)
{
keyonflag = 0x00; //复位按键标志
switch (keyval) //判断按键值
{
case NO_KEY: //无按键按下,熄灭所有的LED
P2OUT = 0X07;
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;
default : //其它情况,不做处理
break;
}
}
Delayus(50000); //延时,便于看到LED点亮的效果
}
}
#pragma vector=PORT1_VECTOR
__interrupt void PORT1 (void)
{
unsigned char cKey;
unsigned int i;
for(i=0;i<1000;i++); //去抖动延时
cKey = P1IN & 0x07; //只有P1.0~P1.2是输入,屏蔽其它引脚的干扰
if(cKey != 0x07) //有按键按下
{
keyonflag = 0x01; //设置按键标志
keyval = cKey; //获取按键值
}
P1IFG=0X00; //清除中断标志
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -