实验七独立按键实验一.实验目的1.使用实验板上板载的三个独立按键控制两个LED。2.学会自己配置IO口作为输入或输出,能够灵活运用。3.掌握按键控制,为以后的人机交互设计奠定基础。二.实验原理1.开发板上的配套资源实验板上按键模块与单片机连接图如下图1和图2所示,其中SW1,SW2,SW3为独立按键连接。独立按键SW1,SW2,SW3分别经过一个上拉电阻与MSP430f149单片机上的P1.5,P1.4,P5.6相连接。LED灯的连接如下图二所示,LED2、LED3、LED4、LED5分别与单片机上的P5.1,P5.2,P5.3,P4.2相连。LED6、LED7分别通过端接冒与P3.6,P3.7相连接。图1实验板上键盘模块的电路连接图图2开发板上LED电路连接图2.按键原理介绍1.按键说明:键盘实际是一组按键,在单片机的外围电路中通常使用的是机械弹性开关,当开关闭合时候,线路导通,开关断开时候,线路断开。按键的作用是实现人为的控制功能。弹性小按键被按下时候,松手后自动断开;自锁式按键,按下时候闭合并且会自动锁住,只有再次按下时候才弹起断开。单片机的外围输入控制用小弹性的按键较好。2.独立按键检测原理:单片机的I/O口可以做输入和输出使用,当使用按键时用到的是它的输入功能,因此在读取I/O口时候,要注意将相应的口设置为输入模式。独立按键使用起来简单方便,按键扫描也较为简便,但由于一个按键需要独立占用一个I/O口,在按键数量较多时候,将会造成大量的I/O口资源被占用。单片机系统中I/O口资源往往比较宝贵,当用到多个按键时,为了节省I/O口,常常使用矩阵键盘。独立按键即每一个按键都与一个I/O口独立相连接。连接方法是,将按键的一端接地,另一端与单片机的一个I/O口相连,开始时候先给该I/O口赋高电平,然后让单片机不断的检测该I/O口是否变为低电平。当按键按下时候,即相当于该I/O口通过按键接地变为低电平,程序一旦检测到I/O口变为低电平则说明该按键被按下,执行相应指令,从而实现按键控制的目的。3.按键消抖原理:按键在按下和释放的瞬间又抖动的现象,抖动时间的长短与按键的机械特性有关,一般5-10ms,因此单片机在检测按键是否按下时都要加上去除抖动操作,有专用的去抖电路和去抖芯片,通常使用软件延时的方法就能够解决按键抖动的问题。一般在检测按键按下时候加入一段延时,检测松手时候就不用加了。三.程序设计1.程序流程图本次实验的程序流程图如下图3所示,整个按键的控制在一个死循环里面一直执行。时钟初始化独立按键初化LED初始化获得键值键值等于0Y键值等于1NLED2、LED4灯状态翻转Y键值等于2N键值等于3NLED3、LED5灯状态翻转YLED2、LED3、LED4、LED5灯状态翻转Y开始图3程序流程图2.程序编写流程1.新建一个工程,配置工程的属性,将编写好的文件CLOCK.c、CLOCK.h、Delay.c、Delay.h、LED.c、LED.h加载进工程。2.建立Key.c和Key.h,编写按键的初始化和按键扫描函数,并加载至工程里面。3.在主函数里编写按键控制函数,用以实现实验的目标,调试成功,然后记录实验现象并进行分析。3.程序解读/***********************头文件调用********************/#includemsp430x14x.h#includeCLOCK.h//包含/时钟初始化CLOCK_INIT()#includeLED.h//包含LED的IO初始化LED_INIT()#includeKey.h//包含按键初始化Key_INIT()及Key_Scan()#includeDelay.h//包含延时函数delay_ms();/***************************关闭所有IO口*************************/voidClose_IO(){/*下面六行程序关闭所有的IO口*/P1DIR=0XFF;P1OUT=0XFF;P2DIR=0XFF;P2OUT=0XFF;P3DIR=0XFF;P3OUT=0XFF;P4DIR=0XFF;P4OUT=0XFF;P5DIR=0XFF;P5OUT=0XFF;P6DIR=0XFF;P6OUT=0XFF;}/***********************主函数********************/voidmain(void){WDTCTL=WDTPW+WDTHOLD;//StopwatchdogtimerunsignedcharKey;Clk_Init();//时钟初始化为8MClose_IO();//关闭所有IO口Key_INIT();//按键初始化LED_INIT();//部分LED灯初始化P5DIR|=BIT0+BIT4+BIT5;//禁止蜂鸣器响P5OUT|=BIT0+BIT4+BIT5;for(;;){Key=Key_Scan();if(Key!=0){switch(Key){case1:P5OUT^=(BIT1+BIT3);//翻转LED2和LED4break;case2:P5OUT^=(BIT2);//翻转LED3和LED5P4OUT^=(BIT2);break;case3:P5OUT^=(BIT1+BIT3);//翻转LED2、LED4和LED3、LED5P5OUT^=(BIT2);P4OUT^=(BIT2);break;default:break;}}elsedelay_ms(10);}}/***********************按键扫描函数********************/unsignedcharKey_Scan(void){unsignedcharKEY=0;staticunsignedcharkey_up=1;//按键按松开标志if(key_up&&(KEYin1==0||KEYin2==0||KEYin3==0)){delay_ms(10);//去抖动key_up=0;//置零标志按键按下if(KEYin1==0)//#defineKEYin1(P1IN&BIT5){KEY=1;}elseif(KEYin2==0)//#defineKEYin2(P1IN&BIT4){KEY=2;}elseif(KEYin3==0)//#defineKEYin3(P5IN&BIT6){KEY=3;}}elseif(KEYin1!=0&&KEYin2!=0&&KEYin3!=0){key_up=1;KEY=0;}//无按键按下,返回值为0returnKEY;}四.实验现象将编写好的程序下载进开发板里,按下KEY1,LED2和LED4状态翻转,按下KEY2,LED3和LED5状态翻转,按下KEY3,LED2、LED3、LED4、LED5状态同时翻转。五.注意事项1.检测按键是否按下,需要将相应的I/O口配置为输入模式。2.注意按键消抖,用于得到稳定的键值判断。3.自己更改配套的库函数文件,学会自己配置,为以后应用作准备。4.按键扫描函数不局限于提供的,尝试其他按键扫描方式。六.思考题注:不局限于实验预期的目的,要知道按键是我们用来控制单片机按照我们预设进行工作的,他可以实现控制其他模块的功能,用以良好的人机交互。尝试用来控制开发板上的其他模块按照自己的预想进行工作,如控制蜂鸣器,控制PWM波的占空比,控制数码管的显示等,课后可以自行分析,课堂大家互相交流,共同进步。1.编写独立按键控制程序,用来控制流水灯进行明灯流水和暗灯流水。2.尝试编写不同的按键扫描函数,对比观察实验效果。