1第4章键盘和显示器的应用在单片机应用系统中,键盘和显示器是非常重要的人机接口。人机接口是指人与计算机系统进行信息交互的接口,包括信息的输入和输出。常用输入设备主要是键盘,常用输出设备包括发光二极管、数码管和液晶显示器等。4.1键盘输入键盘用于实现单片机应用系统中的数据信息和控制命令的输入,按结构可分为编码键盘和非编码键盘。编码键盘上闭合键的识别由专用的硬件编码器实现,并产生相应的键码值,如计算机键盘。非编码键盘是通过软件的方法产生键码,不需要专用的硬件电路。为了减少电路的复杂程度,节省单片机的I/O口,在单片机应用系统中广泛使用非编码键盘,主要对象是各种按键或开关。这些按键或开关可以独立使用(称之为独立键盘),也可以组合使用(称之为矩阵式键盘)。4.1.1按键电路与按键抖动处理按键电路连接方法非常简单,如图4.1所示。此电路用于通过外力使按键瞬时接通开关的场合,如单片机的RESET电路中,通过按键产生一个瞬时的低电压,CPU感知这个低电压后重启。图4.1按键复位电路由于按键的闭合与断开都是利用其机械弹性实现的,当机械触点断开、闭合时,会产生抖动,这种抖动操作用户感觉不到,但对CPU来说,其输出波形则明显发生变化,如图4.2所示。图4.2按键开、闭时的电压抖动波形按键按下和释放时的抖动时间一般为10~20ms,按键的稳定闭合期由操作用户的按键动作决定,一般为几百毫秒到几秒,而单片机CPU的处理速度在微秒极,因此,按键的一次闭合,有可能导致CPU的多次响应。为了避免这种错2误操作,必须对按键电路进行去抖动处理。常用的去抖动方法有硬件方式和软件方式两种。使用硬件去抖动的方式,需要在按键连接的硬件设计上增加硬件去抖电路,比如将按键输出信号经过R-S触发器或RC积分电路后再送入单片机,就可以保证按一次键只发出一个脉冲。软件方式去抖动的基本原理是在软件中采用时间延迟,对按键进行两次测试确认,即在第一次检测到按键按下后,间隔10ms左右,再次检测该按键是否按下,只有在两次都测到按键按下时才最终确认有键按下,这样就可以避开抖动时间段,消除抖动影响。同样,在按键释放时也采用相同方法。由于人的按键速度比单片机的运行速度要慢很多,所以,软件延时方法从技术上完全可行,而且经济上更加实惠,因此被广泛采用。4.1.2独立键盘检测独立键盘是一种最简单的键盘,前面章节已经介绍过使用独立键盘的实例。独立按键的每个键单独占用一根I/O口线,每根I/O口线上的按键工作状态不会影响其他I/O线的工作状态。实例4-1独立按键编号显示任务要求:单片机端口连接3个按键,从1~3进行编号,如果其中一个按键按下时,则在LED数码管上显示相应的按键编号。1)硬件电路设计选取MSP430F249单片机的P1口连接数码管显示按键编号,P3口的P3.0、P3.1、P3.2端口分别和3个按键连接。硬件电路如图4.3所示。P2.5/ROSC/CA525P2.4/CA1/TA224P2.3/CA0/TA123P2.2/CAOUT/TA0/CA422P2.1/TAINCLK/CA321P2.0/ACLK/CA220P1.2/TA114P1.1/TA013P1.0/TACLK/CAOUT12P1.3/TA215P1.4/SMCLK16P1.7/TA219P1.6/TA118P1.5/TA017P2.6/ADC12CLK/CA626P2.7/TA0/CA727P3.0/UCB0STE/UCA0CLK28P3.1/UCB0SIMO/UCB0SDA29P3.2/UCB0SOMI/UCB0SCL30P3.3/UCB0CLK/UCA0STE31P3.4/UCA0TXD/UCA0SIMO32P3.5/UCA0RXD/UCA0SOMI33P3.6/UCA1TXD/UCA1SIMO34P3.7/UCA1RXD/UCA1SOMI35P4.5/TB541P4.4/TB440P4.3/TB339P4.2/TB238P4.1/TB137P4.0/TB036P4.6/TB642P4.7/TBCLK43AVCC64AVSS62P5.0/UCB1STE/UCA1CLK44P5.1/UCB1SIMO/UCB1SDA45P5.2/UCB1SOMI/UCB1SCL46P5.3/UCB1CLK/UCA1STE47P5.4/MCLK48P5.5/SMCLK49P5.6/ACLK50P5.7/TBOUTH/SVSOUT51P6.0/A059P6.1/A160P6.2/A261P6.3/A32P6.4/A43P6.5/A54P6.6/A65P6.7/A7/SVSIN6XT2OUT52XT2IN53RST/NMI58TCK57TDI/TCLK55TMS56VEREF+10VREF+7XIN8XOUT9TDO/TDI54VREF-/VEREF-11U1MSP430F249K1K2K3R110kR310kR210k12345678161514131211109RN1330图4.3独立键盘检测电路图3个I/O口P3.0、P3.1、P3.2作为输入口(输入方式),分别与K1、K2、K3三个按键连接。当按键断开时,I/O口的输入为高电平,按键闭合时,I/O口的输入为低电平。此3个引脚上接了上拉电阻,是为了保证按键断开时逻辑电平为高。32)程序设计按键闭合时,与该键相连的I/O引脚为低电平;按键断开时,与该键相连的I/O引脚为高电平。所以在程序中通过P3IN寄存器读取P3.0、P3.1、P3.2这3个I/O口的电平状态,便可检测按键是否按下。另外,在有按键按下时,要有一定的延时,以防止由于键盘抖动而引起误操作。当确认某按键按下后,就让数码管显示其按键编号。#includeMSP430f249.hunsignedcharconsttable[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};//共阴数码管段选码表,无小数点voiddelayus(unsignedintt){unsignedinti;while(t--)for(i=1330;i0;i--);}unsignedcharReadKey(void){unsignedchartemp;temp=P3IN&0x07;if(temp!=0x07){delayus(10);//等待按键抖动时间if(temp==(P3IN&0x07)){returntemp;}elsereturn0xFF;}elsereturn0xFF;}voidmain(void){unsignedcharkey,i;WDTCTL=WDTPW+WDTHOLD;//关闭看门狗P1DIR=0xFF;//设置方向P1OUT=0x00;P3DIR=0x00;//P3口作为键盘输入while(1){key=ReadKey();switch(key)4{case0x06:P1OUT=table[1];break;case0x05:P1OUT=table[2];break;case0x03:P1OUT=table[3];break;}}}程序说明:当按键按下时,P3口的低三位将不全为高电平。在ReadKey函数中,当判断到P3的低三位不全为1,即0x07时,则认为有按键按下,然后延迟20ms,再次判断P3的低三位,如果低三位依旧不全为1,可以确定是有键按下,并获取键值后显示在数码管上。3)仿真结果与分析双击msp430F249单片机,装载可执行文件。运行时,LED最初没有显示。当按下某键时,将显示相应的数值。图4.4为编号为“3”的按键被按下时的仿真效果图。P2.5/ROSC/CA525P2.4/CA1/TA224P2.3/CA0/TA123P2.2/CAOUT/TA0/CA422P2.1/TAINCLK/CA321P2.0/ACLK/CA220P1.2/TA114P1.1/TA013P1.0/TACLK/CAOUT12P1.3/TA215P1.4/SMCLK16P1.7/TA219P1.6/TA118P1.5/TA017P2.6/ADC12CLK/CA626P2.7/TA0/CA727P3.0/UCB0STE/UCA0CLK28P3.1/UCB0SIMO/UCB0SDA29P3.2/UCB0SOMI/UCB0SCL30P3.3/UCB0CLK/UCA0STE31P3.4/UCA0TXD/UCA0SIMO32P3.5/UCA0RXD/UCA0SOMI33P3.6/UCA1TXD/UCA1SIMO34P3.7/UCA1RXD/UCA1SOMI35P4.5/TB541P4.4/TB440P4.3/TB339P4.2/TB238P4.1/TB137P4.0/TB036P4.6/TB642P4.7/TBCLK43AVCC64AVSS62P5.0/UCB1STE/UCA1CLK44P5.1/UCB1SIMO/UCB1SDA45P5.2/UCB1SOMI/UCB1SCL46P5.3/UCB1CLK/UCA1STE47P5.4/MCLK48P5.5/SMCLK49P5.6/ACLK50P5.7/TBOUTH/SVSOUT51P6.0/A059P6.1/A160P6.2/A261P6.3/A32P6.4/A43P6.5/A54P6.6/A65P6.7/A7/SVSIN6XT2OUT52XT2IN53RST/NMI58TCK57TDI/TCLK55TMS56VEREF+10VREF+7XIN8XOUT9TDO/TDI54VREF-/VEREF-11U1MSP430F249K1K2K3R110kR310kR210k12345678161514131211109RN1330图4.4独立键盘检测的仿真效果图4.1.3矩阵式键盘检测独立键盘与单片机连接时,每一个按键开关占用一个I/O口线,若单片机系统中需要较多按键时,独立按键的方式便会占用过多的I/O口资源。此时,为了节省I/O口线,采用矩阵式键盘(也称为行列式键盘)。下面以4×4矩阵式键盘为例讲解其工作原理和检测方法。将16个按键排成4行4列,第一行每个按键的一端连接在一起构成行线,第一列将每个按键的另一端连接在一起构成列线,这样便一共有4行4列共8根线,如图4-5所示。将这8根线连接到单片机的8个I/O口上,即可通过程序扫描键盘检测到是哪个按5键被按下,具体方法见实例4-2。图4.54×4矩阵式键盘实例4-2矩阵键盘编号显示任务要求:将4×4矩阵式键盘编号,如果其中一个按键按下时,则在LED数码管上显示相应的按键编号。分析说明:4×4矩阵式键盘只需要占用一个8位的端口,硬件设计较为简洁,重点在于如何在程序中判断矩阵键盘的按键位置。1)硬件电路设计选取MSP430F249单片机的P1口连接数码管,P3口的8个引脚分别和矩阵式键盘的行线和列线连接。硬件电路如图4.6所示。FB73EA62D951C840R1330R2330R3330R4330R5330R6330R7330R810kR910kR1010kR1110kP2.5/ROSC/CA525P2.4/CA1/TA224P2.3/CA0/TA123P2.2/CAOUT/TA0/CA422P2.1/TAINCLK/CA321P2.0/ACLK/CA220P1.2/TA114P1.1/TA013P1.0/TACLK/CAOUT12P1.3/TA215P1.4/SMCLK16P1.7/TA219P1.6/TA118P1.5/TA017P2.6/ADC12CLK/CA626P2.7/TA0/CA727P3.0/UCB0STE/UCA0CLK28P3.1/UCB0SIMO/UCB0SDA29P3.2/UCB0SOMI/UCB0SCL30P3.3/UCB0CLK/UCA0STE31P3.4/UCA0TXD/UCA0SIMO32P3.5/UCA0RXD/UCA0SOMI33P3.6/UCA1TXD/UCA1SIMO34P3.7/UCA1RXD/U