单片机原理与应用课程设计矩阵式键盘与显示班级:机102-1姓名:许传栋学号:201056502133组号:六组组员:孔令伟、张叶荣、尚桂香、许传栋、刘金林目录:一、设计要求 (3)二、硬件设计 (3)三、键盘的运行 (6)四、数码管的显示 (6)五、键盘键值的确定 (6)六、按键顺序码的显示 (7)七、74LS48的应用 (8)八、数码管接口引脚 (9)九、程序设计 (10)附录 (18)一、设计要求1、完成单片机与32键矩阵式键盘的连接方法。
2、识别是否有键按下,并将键值用两位数码管显示出来。
3、用软件延时取出按键抖动。
二、硬件设计1、总体构思本次设计为32键矩阵式键盘,因此采用4x8式按键分布。
分为4行8列的布局。
如图T2_1图T2_1当行线和列线分别置一和置零时,按键两端的电压将发生改变。
将键盘的所有引线连出,行线联接到P2口的低四位,列线联接到P1口,从而构成了单片机对键盘按钮动作的读取电路。
将键值用两位数码管显示,因此要利用两片数码管。
由于单片机通过P0口进行输出,因此将P0口的高四位和低四位分别输出数码管的十位和个位,并在单片机与数码管之间接入74LS48。
74LS48的作用是将P0的四位输出转化为八位,并且作为晶体管的驱动,74LS48的输出电流为6mA,刚好满足数码管的电流。
连接电路如图T2_2图T2_2单片机将数据从P0口输出后经过74LS48的转换与驱动带动,数码管进行数码的显示,通过数码管的显示判断出按钮的位置。
将上述键盘和显示电路联接到单片机上:键盘的行线联接到单片机的P2.0~P2.3上,列线联接到单片机的P1口,P0.0~P0.3,P0.4~P0.7分别连接到两片74LS48的输入端口。
再接入单片机的晶振电路和复位电路,构成单片机的总体电路设计。
如图T2_3图T2_3根据总体电路图的联接,设计出实际的物品。
三、键盘的运行将32个按钮按照4x8的方式排列并连接到电路后。
先将行线全部置一列线全部置零,在将列线置一行线全部置零,检测各行线和列线的的键值,若键值产生变化则表明有按钮按下,否则表示没有按键按下。
对于有按键按下的线路将其中变化的键值,通过软件查表得出其对应的顺序码,并将其保存。
四、数码管的显示将从键盘处读取的顺序码转换为BCD 码从P0口处进行输出。
因此用P0口的高四位和低四位分别代表十位和个位进行输出。
数码管需要8根输入,并且连接到单片机上需要驱动,因此选择采用74LS48进行转换与驱动。
五、键盘键值的确定由于行线和列线分别置一和置零,当按下按钮后,该按钮所在的行线和列线上所检测到的电位将会发生变化,曾而判断出不同的按钮所对应的位置和顺序码,确定数码管显示的数值。
个按键的键值如图T5_1图T5_1如图T5_1所示,在线左侧,键值的最后一位均为F;在线右侧,键值对低二位均为F。
因此可根据F所在位置的不同判断按键在线左侧还是右侧。
且出去为F的为后左侧和右侧的键值时一一对应相等的。
在查询按键键位位置时,只需建立一个相同的表即可。
六、按键顺序码的显示先将顺序码定制为FFH,再在差表时,将顺序码逐次加一,当查找到对应的键值的同时也取得了在表中相应的顺序码。
当按键所在的位置为线的左侧时顺序码纪委输出置,在线的右侧时则需将顺序码加16在进行输出。
输出由两片数码管进行显示,所以要将十六进制数转化为BCD码进行输出。
将八个输出端口分成两组,一组输出为十位、另一组输出为个位。
并将十位于个位分别联接到不同的74LS48的输入端进行译码,控制晶体管的显示。
达到显示的目的。
七、74LS48的应用八、数码管接口引脚九、程序设计1、程序设计流程:如图T8_1图T8_1按照电路图联接电路,确定行线与列线所对应的I/O接口。
通过MOV指令将行线所在的端口P2口赋值为0FH,列线所在端口P1口赋值为00H。
读取P2口的低四位存入R0。
通过MOV指令将行线所在的端口P2口赋值为00H,列线所在的端口P1口赋值为FFH。
取P1口的高四位存入R2,P1口的低四位存入R1。
取P2的低四位作为高四位分别与P1的低四位和高四位组合为新的八位二进制数,并分别保存在R4和R7中。
判断P1的高四位是否等于0F0H。
若相等,表明对应于P1低四位的按钮有动作,在进行查表,确定该键所对应的顺序码;若不相等,则表明对应于P1高四位的按钮有动作,进行跳转,跳转到判断P1高四位顺序码的指令,进行查表。
由于键值的原因,两组所查的表完全相同。
当动作的按钮在低位时,将顺序码存入到30H单元;当动作的按钮在高四位时,将顺序码加16再存入30H。
将顺序码除后10,将整数部分与余数部分组成一个新的八位二进制,并将其通过P0口进行输出。
在检测到有按键按下后,通过演示程序,对按键进行去抖操作。
具体程序及注释如下:ORG0000HLJMP STARTORG0100H;识别键盘有无按下程序首地址START:MOV P1,#00H;所有列线置低电平MOV P2,#0FH;所有行线置高电平MOV A,P2;读P2口ANL A,#0FH;取出低四位MOV R0,A;P2低四位暂存到R0 MOV P1,#0FFH;所有列线置高电平MOV P2,#00H;所有的行线置低电平MOV A,P1;读P1口MOV R3,A;p1口暂存到R3ANL A,#0FH;取出低四位MOV R1,A;P1口低四位暂存到R1 MOV A,R3;读取P1口给累加器ANL A,#0F0H;取出P1口高四位MOV R2,A;P1口的高四位暂存到R2 MOV A,R0;读取P2口的低四位给累加器ASWAP A;累加器A中低四位和高四位交换ORL A,R1;P1口的低四位与P2口的低四位逻辑或运算重新组合,存在累加器A MOV R4,A;P1口的低四位与P2口的低四位逻辑或运算重新组合暂存到R4MOV A,R0;读取P2口的低四位给累加器AORL A,R2;P1口的高四位与P2口的低四位逻辑或运算重新组合,存在累加器ASWAP A;累加器A中低四位和高四位交换MOV R7,A;P1口的高四位与P2口的低四位逻辑或运算重新组合暂存到R7KEY0:CJNE R2,#0F0H,KEY1;p1口的高四位不全为高电平,跳转到KEY1MOV SP,#70H;软件延时子程序,软件消抖MOV A,R0PUSH ACCMOV A,R1PUSH ACCMOV R0,#64HMOV R1,#64HNET:DJNZ R1,NETDJNZ R0,NETPOP ACCMOV R1,APOP ACCMOV R0,ACJNE R2,#0F0H,KEY_IN1;p1口的高四位不全为高电平,跳转到KEY_IN1KEY_IN1:MOV A,R4;p2低四位与P1低四位组合给累加器AMOV B,A;将按键的特征编码暂存到BMOV DPTR,#KEY_TABLE1MOV R6,#0FFHKEY_IN2:INC R6;顺序码加1MOV A,R6;顺序码值给累加器AMOVC A,@A+DPTR;查表CJNE A,B,KEY_IN3;比较,若相同则找到按键的特征编码MOV A,R6;找到特征编码后,取顺序码MOV30H,A;存入30H单元MOV B,#0AH;B=0AHDIV AB;累加器A除以B,商存在A,余数存在BSWAP A;高四位与低四位互换ORL A,B;A中高四位与B低四位取逻辑或重新组合MOV P0,A;从P0口输出LJMP STARTKEY_IN3:CJNE A,#00H,KEY_IN2;未完,继续查RET;00H为结束码KEY1:CJNE R1,#0FH,START;比较,P1低四位不全为高电平,跳转到START MOV SP,#70H;软件延时子程序,软件消抖MOV A,R0PUSH ACCMOV A,R1PUSH ACCMOV R0,#0AHMOV R1,#0AHNET2:DJNZ R1,NET2DJNZ R0,NET2POP ACCMOV R1,APOP ACCMOV R0,AMOV A,R7;P2低四位P1低四位(R7)给累加器AMOV B,A;累加器A暂存到BMOV DPTR,#KEY_TABLE1MOV R6,#0FFHKEY_IN4:INC R6;顺序码加1MOV A,R6;顺序码值给累加器AMOVC A,@A+DPTR;查表CJNE A,B,KEY_IN5;比较,若相同则找到按键的特征编码MOV A,R6;找到特征编码后,取顺序码ADD A,#10H;累加器A加上16给累加器AMOV30H,A;存入30H单元MOV B,#0AH;B=0AHDIV AB;累加器A除以B,商存在A,余数存在BSWAPA;高四位与低四位互换ORL A,B;A中高四位与B低四位取逻辑或重新组合MOV P0,A;从P0口输出LJMP STARTKEY_IN5:CJNE A,#00H,KEY_IN4;未完,继续查RET;00H为结束码KEY_TABLE1:DB0EEH,0DEH,0BEH,07EH;顺序码DB0EDH,0DDH,0BDH,07DH;顺序码DB0EBH,0DBH,0BBH,07BH;顺序码DB0E7H,0D7H,0B7H,077H;顺序码00H;结束码END附录:参考文献新编单片机原理及应用(机械工业出版社)74LS48芯片资料。