学习情境教学单元八制作行列式键盘21.能够制作独立键盘2.能够制作矩阵键盘能力目标1.掌握线反转法比列扫描法2.掌握选择语句用法知识目标锻炼学生的自学能力;树立责任感和科学严谨的工作态度。素质目标教学目标重点、难点、教法•重点:掌握选择语句用法•难点:线反转法比列扫描法•教法:“教、学、做”引探教学法、任务驱动法、课堂讨论、动画演示分析讨论:键盘由一组规则排列的按键组成,一个按键实际上是一个开关元件,也就是说键盘是一组规则排列的开关。单片机使用的按键是一种常开型的开关,平时按键的两个触点处于断开状态,按下键时它们才闭合。按键•键盘输入信息的主要过程如下:1)CPU判断是否与键按下。2)确定按下的是哪一个键。3)把此键代表的信息翻译成计算机所能识别的代码,如ASCII或其他特征码。•以上2)、3)步主要由硬件完成,称为编码键盘;如果主要由软件完成,则称为非编码键盘。•1、键盘的分类键盘分编码键盘和非编码键盘。•编码键盘:键盘上闭合键的识别由专用的硬件编码器实现,并产生键编码号或键值的称为编码键盘,如BCD码键盘、ASCLL码键盘等。•非编码键盘:靠软件来识别的称为非编码键盘。在单片机组成的测控系统及智能化仪器中,用的最多的是非编码键盘。•非编码键盘有分为:独立式非编码键盘和行列式非编码键盘。独立键盘检测如果系统只需几个按键,可直接采用I/O线构成单个按键电路,各个按键之间相互独立,一根线上的按键状态不会影响其他输入线上的工作状态,又称独立式键盘接口电路。这种电路每个按键需要占用一根I/O线,在按键数量较多时,输入口浪费大且电路结构很烦琐,因此这种键盘接口电路只适用于按键较少或要求较高操作速度的场合。检测是否有键闭合,如有键闭合,则去除键抖动,判断键号并转入相应的按键处理。编写单片机的键盘检测程序时,一般在检测按下时加入去抖延时,检测松手时就不用加了。按键在闭合和断开时,触点会存在抖动现象:按下抖动释放抖动理想波形实际波形稳定闭合+5V+5VAB无抖动有抖动复习驾驶员操作命令无操作右转向操作左转向操作故障紧急操作转向灯状态左转灯灭灭闪烁闪烁右转灯灭闪烁灭闪烁工作任务采用单片机制作一个模拟汽车左右转向灯的控制任务!任务导入汽车在不同位置都安装有信号灯,它们是汽车驾驶员之间及驾驶员向行人传递汽车行驶状况的表达工具,一般包括转向灯、刹车灯、倒车灯、雾灯等,其中转向灯包括左转灯和右转灯。本次任务是利用单片机设计一个模拟汽车左右转向灯的控制系统。任务二汽车转向灯控制表2-10汽车转向灯显示状态驾驶员命令转向灯显示状态左转向灯右转向灯驾驶员未发出命令灭灭驾驶员发出左转显示命令闪烁灭驾驶员发出右转显示命令灭闪烁驾驶员发出汽车故障显示命令闪烁闪烁任务分析驾驶员操作命令无操作右转向操作左转向操作故障紧急操作转向灯状态左转灯灭灭闪烁闪烁右转灯灭闪烁灭闪烁任务分析:控制电路任务分析任务二汽车转向灯控制表2-11用开关模拟汽车运行状态或显示命令驾驶员命令开关状态S0(P3.0)S1(P3.1)驾驶员未发出命令00驾驶员发出左转显示命令10驾驶员发出右转显示命令01驾驶员发出汽车故障显示命令11控制要求:开关P3.0接+5V电压时,左转向灯点亮,开关P3.1接+5V电压时,右转向灯点亮,P3.0、P3.1同时接+5V电压时,左、右转向灯同时点亮,P3.0、P3.1同时接地时,左、右转向灯同时熄灭。P1.0控制左转向灯P1.1控制右转向灯任务二汽车转向灯控制表2-12显示状态P1.0P1.1显示方式00全亮(故障)01左转向灯亮右转向灯灭10左转向灯亮右转向灯灭11左右转向灯灭任务分析:程序流程模拟汽车转向控制程序#includereg51.hsbitP1_0=P1^0;//定义P1.0引脚位名称为P1_0sbitP1_1=P1^1;//定义P1.1引脚位名称为P1_1sbitP3_0=P3^0;//定义P3.0引脚位名称为P3_0sbitP3_1=P3^1;//定义P3.1引脚位名称为P3_1voiddelay(unsignedchari);模拟汽车转向控制程序voidmain(){bitleft,right;//定义位变量left、right表示左、右状态while(1){left=P3_0;//读取P3.0引脚的状态并赋值给leftright=P3_1;//读取P3.1引脚的状态并赋值给rightP1_0=left;//将left的值送至P1.0引脚P1_1=right;//将right的值送至P1.1引脚delay(200);P1_0=1;//将P1.0引脚置1输出(熄灭LED)P1_1=1;//将P1.1引脚置1输出(熄灭LED)delay(200);}}任务实施图2-25汽车转向灯控制流程图任务二汽车转向灯控制选择语句基本if语句的格式如下:if(表达式){语句组;}if语句执行过程:当“表达式”的结果为“真”时,执行其后的“语句组”,否则跳过该语句组,继续执行下面的语句。语句组表达式真(非0)假(0)选择语句if语句中的“表达式”通常为逻辑表达式或关系表达式,也可以是任何其他的表达式或类型数据,只要表达式的值非0即为“真”。以下语句都是合法的:if(3){……}if(x=8){……}if(P3_0){……}在if语句中,“表达式”必须用括号括起来。在if语句中,花括号“{}”里面的语句组如果只有一条语句,可以省略花括号。如“if(P3_0==0)P1_0=0;”语句,但是为了提高程序的可读性和防止程序书写错误,建议读者在任何情况下,都加上花括号。选择语句if-else语句的一般格式如下:if(表达式){语句组1;}else{语句组2;}if-else语句执行过程:当“表达式”的结果为“真”时,执行其后的“语句组1”,否则执行“语句组2”语句组1表达式真(非0)语句组2假(0)选择语句if-else-if语句是由ifelse语句组成的嵌套,用来实现多个条件分支的选择,其一般格式如下:if(表达式1){语句组1;}elseif(表达式2){语句组2;}…elseif(表达式n){语句组n;}else{语句组n+1;}选择语句语句组1表达式1语句组2表达式2语句组…表达式…语句组n表达式n语句组n+1真(非0)假(0)真(非0)假(0)真(非0)假(0)真(非0)选择语句多分支选择的switch语句,其一般形式如下:switch(表达式){case常量表达式1:语句组1;break;case常量表达式2:语句组2;break;……case常量表达式n:语句组n;break;default:语句组n+1;}该语句的执行过程是:首先计算表达式的值,并逐个与case后的常量表达式的值相比较,当表达式的值与某个常量表达式的值相等时,则执行对应该常量表达式后的语句组,再执行break语句,跳出switch语句的执行,继续执行下一条语句。如果表达式的值与所有case后的常量表达式均不相同,则执行default后的语句组。31项目:独立按键识别和控制LED点亮程序设计任务1:画电路原理图任务2:编程任务3:仿真调试要求开始时LED均熄灭,随后根据按键动作点亮相应LED,按键释放后继续保持直至新的按键按下为止。要求开始时LED均熄灭,随后根据按键动作点亮相应LED,按键释放后继续保持直至新的按键按下为止。电路如下图由电路可知,接于P0.0-P0.3的任意一个按键按下时,相应端口的电平将由“1”状态变为“0”状态;而接于P2.0-P2.3的任意一个LED在端口输出“1”时将被点亮。参考程序如下#includereg51.h//定义51寄存器头文件包含到程序中voidmain(void){charkey=0;//定义一个变量,初值为0P2=0;//熄灭所有LEDP0=0xff;//向P0写“1”,使P0口可正确读入按键状态while(1)//循环{key=~P0&0x0f;//将P0口读入的按键状态取反并//与0fH按位与,清高4位留低4位if(key!=0)P2=key;//key不为0有键按下则将key//送P2口控制相应的LED点亮}//否则,再循环读按键状态}例2:键控流水灯在上例电路图的基础上,编写可键控的流水灯程序。要求实现功能为,当K1按下时,要求流水灯流动;K2按下时停止流动,且全部灯灭;K3按下时使灯由上往下流动,K4则使灯由下往上流动。程序说明判断按键动作,并根据按键的组合状态控制流水灯状态。流水灯控制码事先存放在数组中。本例电路中LED为低电平驱动,故控制码中输出0电平对应着灯亮,反之,1电平对应着灯灭。流水速度可以根据需要调整延时数值了。参考程序如下//定义数组,并将控制各位灯亮的码作为//初值放入其中//定义delay延时函数(带参数time)//定义内循环控制变量j//定义按键扫描函数//若无按键返回0,否则返回//从P0口读入的按键状态(高//4位被清0。//定义两个位变量dir,run,并赋初值//定义int型变量i//根据key函数返回值决定如何控制LED//若K1按下run=1,跳出switch//若K2按下run=0,跳出switch//若K3按下dir=1,跳出switch//若K4按下dir=0,跳出switch//若ren=1(K1按下),去判断dir的值//否则(ren=0,K2按下),向P2口输出0,熄灭所有LED//由i控制顺序取出控制码//若dir=1,控制LED//调用延时函数//否则(dir=0),控制LED//由i控制反序取出控制码//送P2//送P2//调用延时函数第4章单片机的C51语言Keil项目和程序界面如下图所示39项目:行列式键盘原理与编程任务1:画电路原理图任务2:编程任务3:仿真调试4×4行列式键盘电路原理图如下,要求按任意按键后,显示出该按键对应的数(0-F)。例6行列式键盘应用4×4行列式键盘电路原理图如下,要求按任意按键后,显示出该按键对应的数(0-F)。第一行第一列若用8位2进制数用以下方式来表示键编码:高4位对应行、低4位对应列,每个键的编码是,除其所在行、列对应位为1外,其余位为0,则有:1行1列键编码11H2行1列键编码21H3行1列键编码41H4行1列键编码81H1行2列键编码12H2行2列键编码22H…………..3行3列键编码44H4行3列键编码84H………….4行4列键编码88H0124EFDC589BP2P3.7P3.0前面例题中的按键都是每键分别接在一根IO口线上,这称为独立式键盘。它的电路简单,易于编程,但占用的IO口线较多,当需要较多按键时可能产生IO资源紧张问题,这时应采用行列式键盘。行列式键盘方案的一般做法是,将IO口分为行线和列线,按键置于行线和列线交叉位置的上方,行线则通过上拉电阻接正电源。按键压下时,行线和列线将发生短接,利用软件扫描技术可以判断出闭合状态。4×4行列式键盘硬件电路图行列式(矩阵)键盘识别的常用方法有两种:列扫描法线反转法1)列扫描法(逐列进行)向某列线发出低电平信号,如该列线上所设置的键没有任何一个按下的话,则行线端口读回的是全“1”信号,否则,得到非全“1”信号,且为“0”位的位置对应按键所在行的位置。找到闭合键后,获取其键值,据此转至该键对应的功能程序。为防止多键同时按下,往往从第0列一直扫描到最后1列,若只发现1个闭合键,则为有效按键,否则,全部作废。行和列是人为认定的,为此认定:通过上拉电阻接电源的口线对应的是行线。按键在闭合和断开瞬间会因弹簧开关的变形而产生电压波动现象,其按键抖动波形如图按键抖动会造成一次按键对应多次响应的问题,需要采用措施消除抖动影响。单片机常用软件延时10ms的办法来消除抖动的影响。当检测到有键按下时,先延时10ms,然后再检测按键的状态,若仍是闭合状态,则认为真正有键按下。当需要检测到按键释放时,也需做同样的处理。a.先检查是否键按下。向列线端口送全列扫描码(列线全送“0”),行线端口做输入(行线全送“1”),然后,读入行线端口的状态,若行线中有为0位(即非全“1”),则有键按