MSP430-按键检测代码详解
使用MSP430F149的开发板,首先在一个函数进行讲解,然后下边是将部分代码写入了新建的key.c程序中
- P1口的0,1,2,3 I/O口用于检测四个按键的电平
- P2口的0,1,2,3 I./O口用于点亮对应的LED灯
- P3口的4 I/O口用于点亮按键按下指示灯
#include <MSP430X14x.h> // 这是程序都要包含的头文件,里边包含的很多寄存器和接口函数 #define KEY_Input (P1IN & 0x0f) // 这是定义一个变量用于检测按下的是哪一个键(一共四个按键) // 使用P1.0,1,2,3来检测,高四位跟0相与都是零,低四位跟1相与是该位本来的值 void delay(void); //创建了一个简单的延时函数,这是对他的一个简单声明 unsigned char scandata[5] = {0xFF,0x7F,0xBF,0xDF,0xEF}; //这是定义了一个char类型的数组,根据不同的按键点亮对 void main( void) { unsigned char temp,keyval=0XFF; // 创建了一个temp用于存储P1IN的值,keyval用于做数组的索引从而点亮不同的灯 WDTCTL = WDTPW + WDTHOLD; // 关闭看门狗 P1DIR=0X00; // P1的方向寄存器(direction register),设置成输入模式 P1OUT=0X00; // 首先将P1八个端口设置成高电平 P3DIR |= BIT4; // 这个是另外一个LED灯,用于提示是否有按键按下 P3OUT |= BIT4; // 设置成输出模式 P2DIR=0XFF; //这个是连接按键对应的LED灯的,将他设置成输出模式 while(1) { if(KEY_Input != 0XFF) // 在上边已经将P1口设置成都是高电平,如果0XFF,那就是有按键按下了 { delay(); //进行一个消抖 if(KEY_Input != 0XFF) // 再次确认按键的确是按下了 { temp=KEY_Input; 将KEY_Input赋值给temp。因为按键是自动弹开的,不将他赋值给temp,他就会恢复成原值 switch(temp) // 对temp进行判断 { case 0x0e: // 0000 0111 说明按按键4按下(没按下的时候是高电平。按下低电平) keyval = 4;break; case 0x0d: // 0000 1011 说明按按键3按下 keyval = 3;break; case 0x0b: // 0000 1101 说明按按键2按下 keyval = 2;break; case 0x07: // 0000 1110 说明按按键1按下 keyval = 1;break; default: // 如果出现其他值执行下边语句 keyval = 0;break; } P2OUT=scandata[keyval]; // 赋值给P2,用于点亮对应的LED P3OUT &= ~BIT4; // 点亮一下按键指示灯 delay();delay(); //延时一下 P3OUT |= BIT4; // 关闭按键指示灯 } } } } /******************************************* 函数名称:delay 功 能:用于消抖的延时 参 数:无 返回值 :无 ********************************************/ void delay(void) { unsigned int tmp; for(tmp = 12000;tmp > 0;tmp--); }
*************************下边是我自己喜欢32那种,把初始化都独立起来****************************
main函数
#include <MSP430x14x.h> #include "key.h" void main( void ) { unsigned char temp; KEY_Init(); while(1) { if(KEY_Input != 0XFF) { delay(); if(KEY_Input != 0XFF) { temp=KEY_Input; switch(temp) { case 0x0e: P2OUT = KEY4_PRE;break; case 0x0d: P2OUT = KEY3_PRE;break; case 0x0b: P2OUT = KEY2_PRE;break; case 0x07: P2OUT = KEY1_PRE;break; default: P2OUT = KEY_NO_PRE;break; } P3OUT &= ~BIT4; delay();delay(); P3OUT |= BIT4; } } } }
key.c
#include "key.h" void KEY_Init() { WDTCTL = WDTPW + WDTHOLD; P1DIR=0X00; P1OUT=0X00; P3DIR |= BIT4; P3OUT |= BIT4; P2DIR=0XFF; } void delay(void) { unsigned int tmp; for(tmp = 12000;tmp > 0;tmp--); }
key.h
#include <MSP430x14x.h> #define KEY_Input (P1IN & 0x0f) #define KEY1_PRE 0x7F #define KEY2_PRE 0xBF #define KEY3_PRE 0xDF #define KEY4_PRE 0xEF #define KEY_NO_PRE 0xFF void KEY_Init(void); void delay(void);
#endif
本人愚昧,上边如果有错误,还希望各位指正。