键盘接口实验实验报告及程序
- 格式:doc
- 大小:55.00 KB
- 文档页数:3
实验四矩阵键盘控制接口设计实验一、实验目的1、掌握MAX+plus 软件的使用方法。
2、掌握层次化设计方法:底层为文本文件,顶层为图形文件。
3、了解用12 位按健输入开关来设计并实现一个3 x 4 矩阵键盘接口控制器。
了解弹跳消除电路的工作原理。
二、实验设备1、计算机2、MAX+plus II软件及实验箱三、实验原理该实验系统中没有矩阵键盘,可以用12 位按键开关来实现矩阵键盘的功能。
当按键被按下时改按键的节点会呈现‘0’状态,反之为‘1’。
将12 个键进行编码后就可以实现距阵键盘的功能。
键盘编码电路:由于每个按键开关都是独立的,故有12 路输入,3X4 键盘有12 个键值,4位二进制数即可表示全部状态。
因此,键盘编码电路为12 输入4 输出编码器。
12 个按键可分为10 个数字键和2 个功能键。
数字键主要用来输入数字,功能键一般实现一些特殊用途(如确认、清除等)。
4 位输出从0~9 表示10 个数字键,11 和12 表示两个功能键。
弹跳消除电路:因为按键开关是机械式结构,在开关切换的瞬间会在接触点出现来回弹跳的现象,对于激活关闭一般电器并不会有何影响,但对于灵敏度较高的电路,却有可能产生误动作而出错。
跳现象产生的原因可从下图说明。
虽然只是按下按键一次然后放开,然而实际产生的按键信号却不只跳动一次,经过取样的检查后将会造成误判,以为按键两次。
弹跳现象产生错误的抽样结果如果调整抽样频率可以发现弹跳现象获得了改善。
因此在开关输入信号处必须加上弹跳消除电路,避免误操作信号的发生。
注意:弹跳消除电路所使用脉冲信号的频率必须要选用合适,频率太低则按键反应痴动,频率太高则起不到消除弹跳的作用,而且消除弹跳电路设计的不同对频率也有不同的要求。
数码管采用共阴极:段码表四、实验内容1、用12 个按键开关实现矩阵键盘,当按下某一键时在数码管上显示对应的键值。
2、分析仿真示例程序理解弹跳消除的实现原理。
3、通过改变CLK 信号,理解时钟信号对弹跳消除的影响。
运用8255设计的键盘及显示接口图中用并行接口8255A作为微机与键盘间的接口,采用逐行扫描法识别键。
将键盘中的列与PA0—PA3相连,A口为输出;将行与C口的PC0—PC1相连,C 口为输入口; PB0—PB7与七段代码显示器连接B口为输出。
程序执行过程如下:识别是否有键按下,方法是使PA0一PA3输出全0,读C 口(行值) 中只要有一位为0,就说明有键按下,在检测到有键按下后,延迟一段时间,根据找到的键号,转去执行显示七段代码显示器的程序,这时七段代码显示器就显示与该键相同的数值。
实验步骤8255接口的应用键盘及显示接线图注:圆圈处是要求接的连线。
(1)按图4接线。
(2)输入源程序,汇编、连接后装入系统。
(3)执行程序后,按一下键盘,7段代码就会显示相应的数字。
程序STACK SEGMENT STACKDW 64 DUP(?)STACK ENDSDATA SEGMENTTABLE DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07HDATA ENDSCODE SEGMENTASSUME CS:CODE,DS:DATASTART: MOV AX,DATAMOV DS,AXMOV SI,3000HMOV AL,00HMOV [SI],AL ;清空存放数据的缓冲区MOV [SI+1],ALMOV [SI+2],ALMOV [SI+3],ALMOV DI,3003HMOV AL,81H ;8255方式字定义选择0方式,A口为输出;OUT 63H,AL;B口为输出;C口为输入BEGIN: CALL DIS ;显示七段代码管数据的子程序CALL CLEAR ;七段代码管清0子程序CALL CCSCAN ;检测是否有键按下子程序JNZ INK1 ;JMP BEGININK1: CALL DISCALL DALLY ;子程序为延时,消抖动CALL DALLYCALL CLEARCALL CCSCANJNZ INK2JMP BEGININK2: MOV CH,0FEHMOV CL,00HCOLUM: MOV AL,CHOUT 60H,ALIN AL,62HTEST AL,01HJNZ LONEMOV AL,00HJMP KCODELONE: TEST AL,02HJNZ NEXTMOV AL,04HKCODE: ADD AL,CLCALL PUTBUFPUSH AXKON: CALL DISCALL CLEARCALL CCSCANJNZ KONPOP AX NEXT: INC CLMOV AL,CHTEST AL,08HJZ KERRROL AL,1MOV CH,ALJMP COLUM KERR: JMP BEGIN CCSCAN: MOV AL,00HOUT 60H,ALIN AL,62HNOT ALAND AL,03HRET CLEAR: MOV AL,00HOUT 61H,ALRETDIS: PUSH AXMOV SI,3000HMOV DL,0F7HMOV AL,DLAGAIN: OUT 60H,ALMOV AL,[SI]MOV BX,OFFSET TABLE ;取七段代码首址AND AX,00FFHADD BX,AXMOV AL,[BX]OUT 61H,ALCALL DALLYINC SIMOV AL,DLTEST AL,01HJZ OUTROR AL,1MOV DL,ALJMP AGAINOUT: POP AXRETDALLY: PUSH CXMOV CX,0010HT1: MOV AX,0010HT2: DEC AXJNZ T2LOOP T1POP CXRETPUTBUF: MOV SI,DIMOV [SI],ALDEC DICMP DI,2FFFHJNZ GOBACKMOV DI,3003H GOBACK: RETCODE ENDSEND START。
8255接口键盘及显示综合设计实验(曹建文2009年10月10日)一、实验目的1、掌握8255的工作方式及应用编程。
2、自行设计、制作和连接基于8255并行接口的键盘及显示实验电路。
3、实现扫描式矩阵键盘的功能和作用。
二、实验设备PC机1台,TD-PIT实验台1台,实验元器件若干。
三、实验内容1、使用8255实现键盘按键和七段LED数码显示管显示功能。
2、根据实验要求自行设计实验线路图,制作和焊接实验电路板和实验元器件。
3、按照实验要求和实验电路图编写实验程序,使得按下不同的数字按键后数码管显示相应的数字值(4位数码管)。
4、按照实验要求设计和编写实验程序,实现普通计算器的加/减法功能。
四、实验原理1、8255结构及原理并行接口是以数据的字节为单位与I/O设备或被控制对象之间传递信息。
CPU和接口之间的数据传送总是并行的,即可以同时传递8位、16位或32位等。
8255可编程外围接口芯片是Intel公司生产的通用并行I/O接口芯片,它具有A、B、C三个并行接口,用+5V单电源供电,能在以下三种方式下工作:方式0--基本输入/输出方式、方式1--选通输入/输出方式、方式2--双向选通工作方式。
8255的内部结构及引脚如图-1所示,8255工作方式控制字和C口按位置位/复位控制字格式如图-2所示。
图-1:8255内部结构及引脚图(a)工作方式控制字(b)c口按位置位/复位控制字图-2:8255控制字格式(1)8255的内部结构如图-1所示,8255的内部结构由以下4个部分组成:(1)输入/输出端口A、B、C 。
这三个端口均可看作是I/O端口,但它们的结构和功能也稍有不同。
A口和B口是一个独立的8位I/O口。
C口可以看作是一个独立的8位I/O口;也可以看作是两个独立的4位I/O口。
(2)A组和B组控制电路。
这是两组根据CPU命令控制8255工作方式的电路,这些控制电路内部设有控制寄存器,可以根据CPU送来的编程命令来控制8255的工作方式,也可以根据编程命令来对C口的指定位进行置位/复位的操作。
实验六键盘接口实验一、实验目的1、掌握Keil C51软件与Protues软件联合仿真调试的方法;2、掌握单片机的键盘接口电路;3、掌握单片机的键盘扫描原理;4、掌握键盘的去抖原理及处理方法。
二、实验仪器与设备1、微机一台2、Keil C51集成开发环境3、Protues仿真软件三、实验内容1、用Protues设计一矩阵键盘接口电路。
要求利用P1口接一4×4矩阵键盘。
串行口通过一74LS164接一共阴极数码管。
用线反转法编写矩阵键盘识别程序,用中断方式,并将按键的键值0-F通过串行口输出,显示在数码管上。
2、将P1口矩阵键盘改成8个独立按键,重新编写识别和显示程序。
四、实验说明矩阵键盘识别一般包括以下内容:⑴判别有无键按下。
⑵键盘扫描取得闭合键的行、列号。
⑶用计算法或查表发的到键值;⑷判断闭合键是否释放,如没释放则继续等待。
⑸将闭合键的键值保存,同时转去执行该闭合键的功能。
五、实验步骤1、用Protues设计键盘接口电路;2、在Keil C51中编写键盘识别程序,编译通过后,与Protues联合调试;3、按动任意键,观察键值是否能正确显示。
六、实验电路仿真图矩阵键盘电路图见附录1。
独立按键电路图见附录2。
七、实验程序实验程序见附录3、4。
八、实验总结1、矩阵键盘常用的检测方法有线反转法、逐行扫描法。
线反转法较简单且高效。
在矩阵键盘的列线上接一与门,利用中断方式查询按键,可提高CPU的运行效率。
2、注意用线反转法扫描按键时,得到的键值不要再赋给temp,最好再设一新变量接收键值,否则再按下按键显示数字的过程中,再按按键会出现乱码。
3、学会常用与门、与非门的使用方法。
附录1:矩阵键盘实验电路图附录2:独立按键实验电路图附录3:矩阵键盘实验程序#include <REG51.H>char code LED_TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};char code KEY_TABLE[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77};char code tab1[10]={0xfe,0xde,0x9e,0x9a,0x92,0x82,0x82,0x80,0xff};char temp,num,i,m;int t;bit flag=0;void Delay_ms(t){int i;for(;t>0;t--)for(i=0;i<124;i++);}void main(void){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;ET0=1; PT0=1; SCON=0;EX0=1; IT0=1; EA=1;P1=0xf0;while(1){SBUF=tab1[m];while(TI==0); TI=0;Delay_ms(400); //500msm++;if(m==9) m=0;}}void int_1() interrupt 0{P1=0xf0;if(P1!=0xf0){Delay_ms(10);if(P1!=0xf0){temp=P1;P1=0x0f;temp=temp|P1;for(i=0;i<16;i++){if(temp==KEY_TABLE[i]){temp=i; break;}}SBUF=LED_TAB[temp];while(TI==0); TI=0; TR0=1;while(flag==0); flag=0;} } P1=0xf0;}void timer_0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;t++;if(t==300){t=0; flag=1; TR0=0;}}附录4:独立按键实验#include <REG51.H>char code LED_TAB[]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e};char code KEY_TABLE2[]={ 0xfe,0xfd,0xfb,0x f7, 0xef,0xdf,0xbf,0x7f,} ;char code tab1[10]={0xfe,0xde,0x9e,0x9a,0x 92, 0x82,0x82,0x80,0xff};char temp,i,m;int t;bit ff;bit flag=0;void Delay_ms(t){int i;for(;t>0;t--)for(i=0;i<124;i++);}void main(void){TMOD=0x01;TH0=(65536-10000)/256;TL0=(65536-10000)%256;ET0=1; SCON=0; EX0=1;IT0=1; PT0=1; EA=1;P1=0xff;while(1){ff=IE0;SBUF=tab1[m];while(TI==0); TI=0;Delay_ms(400);m++;if(m==9) m=0;}}void timer_0() interrupt 1{TH0=(65536-10000)/256;TL0=(65536-10000)%256;t++;ff=IE0;if(t==300){t=0;flag=1;}}void int_0() interrupt 0{EX0=0;Delay_ms(10);temp=P1;if(temp!=0xff){for(i=0;i<8;i++){if(temp==KEY_TABLE2[i]){temp=i; break;}}SBUF=LED_TAB[temp];while(TI==0); TI=0;TR0=1; while(flag==0);flag=0; TR0=0;P1=0xff; EX0=1;}}。
4×4键盘实验06300720040夏晓天电子信息科学与技术【预习报告】一.实验目的1.掌握扫描式键盘的工作原理。
2.掌握基于MCS-51的键盘接口电路的设计方法。
二.实验内容1.设计基于MCS-51的4×4键盘接口电路,将其定义为0~F的16个数字键,将按下的键的数字用LCD显示。
2.将4×4键盘定义为0~9,以及加、减、等于、擦除、清零、退出等功能键,实现简单的计算器,利用LCD显示运算过程,按退出键后退出程序。
三.电原理图和程序清单:总的CPLD-1电原理图:1.数字键0~F硬件连接图:程序清单:ORG 0000HAJMP MAINORG 0030HMAIN:ROW EQU 30H ;行寄存器LIN EQU 31H ;列寄存器PAR EQU 32H ;按键定义寄存器 COM EQU 20H ;指令寄存器DAT EQU 21H ;数据寄存器CW_ADD EQU 0000H ;指令口写地址 CR_ADD EQU 0002H ;指令口读地址 DW_ADD EQU 0001H 数据口写地址 DR_ADD EQU 0003H ;数据口读地址;初始化LCDMOV A,#30H ;工作方式设置指令代码MOV DPTR,#CW_ADD ;指令口地址设置MOV R2,#03H ;循环量=3MOVX @DPTR,A ;写指令代码INIT1: LCALL DELAY2DJNZ R2,INIT1MOV A,#38H ;设置8位总线工作方式MOVX @DPTR,AMOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0CH ;设置显示方式LCALL PR1START: MOV ROW,#00H ;所有行置低电平MOV A,ROWMOV DPTR,#2000HMOVX @DPTR,AMOVX A,@DPTR ;读列电平ANL A,#0FHCJNE A,#0FH,JDGSJMP START ;读入值全为1JDG: LCALL DELAY1 ;读入列值不全为1,延时20msMOV ROW,#0E0H ;置第一行MOV A,ROWMOVX @DPTR,AMOVX A,@DPTR ;读入列ANL A,#0FHCJNE A,#0FH,RKEY ;读入列值不全为1,则转到键值处理程序 MOV ROW,#0D0H ;置第二行MOV A,ROWMOVX @DPTR,AMOVX A,@DPTRANL A,#0FHCJNE A,#0FH,RKEY ;读入列值不全为1,则转到键值处理程序 MOV ROW,#0B0H ;置第三行MOV A,ROWMOVX @DPTR,AMOVX A,@DPTR ;读入列ANL A,#0FHCJNE A,#0FH,RKEY ;读入列值不全为1,则转到键值处理程序 MOV ROW,#70H ;置第四行MOV A,ROWMOVX @DPTR,AMOVX A,@DPTR ;读入列ANL A,#0FHCJNE A,#0FH,RKEY ;读入列值不全为1,则转到键值处理程序 SJMP STARTRKEY: ADD A,ROW ;得到键值MOV ROW,AMOV DPTR,#TBL1MOV R1,#00HL1: MOV A,R1MOVC A,@A+DPTRCJNE A,ROW,L2 ;判断表中取出的数值是否与键值相等MOV PAR,R1 ;得到按键的定义SJMP L3L2: INC R1SJMP L1;等待键释放L4: MOVX A,@DPTR ;读入列ANL A,#0FHCJNE A,#0FH,L4 ;读入列值不全为1说明按键未释放LCALL DELAY1 ;延时20msMOVX A,@DPTRANL A,#0FHCJNE A,#0FH,L4 ;读入列值全为1说明按键已释放LCALL PRO ;显示按键的定义值AJMP START;键处理程序PRO: PUSH ACCPUSH DPHPUSH DPLMOV COM,#80H ;设置DDRAM地址为00H(第一行第一位) LCALL PR1MOV DPTR,#TBL2 ;取字符代码MOV A,PARMOVC A,@A+DPTRMOV DAT,A ;暂存DATLCALL PR2POP DPLPOP DPHPOP ACCRET;写指令代码PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADD MOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;写显示数据PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADD PR21: MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADD MOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;延时20msDELAY1:MOV R7,#50HDEL11: MOV R6,#7BHNOPDEL12: DJNZ R6,DEL12DJNZ R7,DEL11RET;延时5msDELAY2: MOV R6,#28HDEL21: MOV R7,#07BHDEL22: DJNZ R7,DEL22DJNZ R6,DEL21RET;字符存储区TBL1: DB 0EEH,0EDH,0EBH,0E7H,0DEH,0DDH,0DBH,0D7H DB 0BEH,0BDH,0BBH,0B7H,7EH,7DH,7BH,77H TBL2: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39H DB 41H,42H,43H,44H,45H,46HEND2.简单计算器硬件连接图:程序清单:ORG 0000HAJMP MAINORG 0030HMAIN:COM EQU 20H ;指令寄存器DAT EQU 21H ;数据寄存器ROW EQU 22H ;行寄存器LIN EQU 23H ;列寄存器PAR EQU 24H ;按键定义寄存器SYM EQU 25H ;运算符寄存器RSL EQU 26H ;运算结果寄存器ADN EQU 27H ;中间值寄存器GEW EQU 28H ;个位数值寄存器SHW EQU 29H ;十位数值寄存器BAW EQU 2AH ;百位数值寄存器CW_ADD EQU 0000H ;指令口写地址CR_ADD EQU 0002H ;指令口读地址DW_ADD EQU 0001H ;数据口写地址DR_ADD EQU 0003H ;数据口读地址;初始化MOV A,#30H ;工作方式设置指令代码 MOV DPTR,#CW_ADD ;指令口地址设置MOV R2,#03H ;循环量=3MOVX @DPTR,A ;写指令代码INIT1: LCALL DELAY2DJNZ R2,INIT1MOV A,#38H ;设置8位总线工作方式 MOVX @DPTR,AMOV COM,#01H ;清屏LCALL PR1MOV COM,#06H ;设置输入方式LCALL PR1MOV COM,#0CH ;设置显示方式LCALL PR1START: MOV SYM,#00H ;功能键清零MOV RSL,#00H ;运算结果清零MOV R3,#00H ;按键次数清零MOV COM,#80H ;设置DDRAM地址为第一行第一位LCALL PR1MOV DAT,#30H ;初始在第一行第一位显示'0'LCALL PR2PRER: MOV ROW,#00H ;所有行置低电平MOV A,ROWMOV DPTR,#2000HMOVX @DPTR,AMOVX A,@DPTR ;读列电平ANL A,#0FHCJNE A,#0FH,JDGSJMP PRER ;读入值全为1JDG: LCALL DELAY1 ;读入列值不全为1,延时20msMOV ROW,#0E0H ;置第一行MOV A,ROWMOVX @DPTR,AMOVX A,@DPTR ;读入列ANL A,#0FHCJNE A,#0FH,RKEY ;读入列值不全为1,则转到键值处理程序 MOV ROW,#0D0H ;置第二行MOV A,ROWMOVX @DPTR,AMOVX A,@DPTR ;读入列ANL A,#0FHCJNE A,#0FH,RKEY ;读入列值不全为1,则转到键值处理程序MOV ROW,#0B0H ;置第三行MOV A,ROWMOVX @DPTR,AMOVX A,@DPTR ;读入列ANL A,#0FHCJNE A,#0FH,RKEY ;读入列值不全为1,则转到键值处理程序 MOV ROW,#70H ;置第四行MOV A,ROWMOVX @DPTR,AMOVX A,@DPTR ;读入列ANL A,#0FHCJNE A,#0FH,RKEY ;读入列值不全为1,则转到键值处理程序 SJMP PRERRKEY: ADD A,ROW ;得到键值MOV ROW,AMOV DPTR,#TBL1MOV R1,#00HL1: MOV A,R1MOVC A,@A+DPTRCJNE A,ROW,L2 ;判断表中取出的数值是否与键值相等MOV PAR,R1 ;得到按键的定义SJMP L3L2: INC R1SJMP L1;等待键释放L3: MOV DPTR,#2000HL4: MOVX A,@DPTR ;读入列ANL A,#0FHCJNE A,#0FH,L4 ;读入列值不全为1说明按键未释放LCALL DELAY1 ;延时20msMOVX A,@DPTRANL A,#0FHCJNE A,#0FH,L4 ;读入列值全为1说明按键已释放 LJMP PRO ;显示按键的定义值LJMP PRER;键处理程序PRO:;退出QUIT: MOV A,PARCJNE A,#0AH,CLEAR ;退出键定义为#0AHLJMP PQT ;转退出键处理程序;清零CLEAR: MOV A,PARCJNE A,#0BH,EARSE ;清零键定义为#0BHLJMP PCLR ;转清零键处理程序;擦除EARSE: MOV A,PARCJNE A,#0CH,EQUAL ;擦除键定义为#0CHLJMP PERS ;转擦除键处理程序;等于EQUAL: MOV A,PARCJNE A,#0DH,PLUS ;等于键定义为#0DHLJMP PSYM ;转运算符处理程序;加PLUS: MOV A,PARCJNE A,#0EH,MINUS ;加法键定义为#0EHLJMP PSYM ;转运算符处理程序;减MINUS: MOV A,PARCJNE A,#0FH,NUM ;减法键定义为#0FHLJMP PSYM ;转运算符处理程序;数字NUM: INC R3 ;数字键按键次数加1CJNE R3,#1H,NUM1 ;判断第几个数字键LJMP S1 ;为第一个数字NUM1: CJNE R3,#2H,NUM2LJMP S2 ;为第二个数字NUM2: CJNE R3,#3H,NUM3LJMP S3 ;为第三个数字NUM3: LJMP PCLR ;第四个数字转清零处理程序S1: MOV R4,PAR ;输入值暂存R4MOV A,R4MOV R6,A ;暂存R6ADD A,#30H ;转为ASCII码MOV PAR,AMOV COM,#01H ;清屏LCALL PR1MOV COM,#80HLCALL PR1MOV DAT,PARLCALL PR2 ;第一个数字显示在第一行第一位 LJMP PRER ;等待再次输入S2: MOV R5,PAR ;暂存R5MOV B,#10MOV A,R4MUL AB ;第一个数字乘以10ADD A,R5 ;再加上第二个数字MOV R4,A ;暂存R4MOV R7,A ;暂存R7MOV A,PARADD A,#30H ;转为ASCII码MOV PAR,AMOV DAT,PARLCALL PR2 ;第二个数字显示在第一行第二位LJMP PRER ;等待再次输入S3: MOV R5,PAR ;暂存R5MOV B,#10MOV A,R4MUL AB ;第一、二个数字组成的两位数乘以10JB OV,PCLR ;溢出则清零ADD A,R5 ;第一、二个数字组成的两位数乘以10再加上第三个;数字JB CY,PCLR ;溢出则清零MOV R4,A ;暂存R4MOV A,PARADD A,#30H ;转为ASCII码MOV PAR,AMOV DAT,PARLCALL PR2 ;第三个数字显示在第一行第三位LJMP PRER ;等待再次输入;退出处理PQT: MOV COM,#01H ;清屏LCALL PR1LJMP HE ;退出程序;清零处理程序PCLR: MOV R4,#0 ;输入值清零MOV COM,#01H ;清屏LCALL PR1LJMP START ;从头开始;擦除处理程序PERS: LCALL PR3 ;读入DDRAM地址DEC COM ;DDRAM地址减1ORL COM,#80HLCALL PR1MOV A,COMCJNE A,#80H,PE1MOV DAT,#30H ;要擦除的是输入的第一个数字则将擦除的那位显;示'0'LCALL PR2SJMP PE2PE1: MOV DAT,#20H ;要擦除的不是输入的第一个数字则将擦除的那位;显示空白LCALL PR2PE2: LCALL PR3 ;读入DDRAM地址DEC COM ;DDRAM地址减1ORL COM,#80HLCALL PR1DEC R3 ;按数字键次数减1CJNE R3,#00H,PERS1SJMP PERS3 ;擦除的是第一个数字则直接等待按键PERS1: CJNE R3,#01H,PERS2MOV A,R6 ;擦除的是第二个数字则将键入得数字键组成的数 ;值改成第一个数字的值MOV R4,ASJMP PERS3PERS2: CJNE R3,#02H,PERS3MOV A,R7 ;擦除的是第三个数字则将键入得数字键组成的数;值改成第一、二个数字组成的数值MOV R4,APERS3: LJMP PRER;运算符处理程序PSYM: MOV R0,SYM ;与上次运算符交换MOV SYM,PARMOV PAR,R0MOV A,PARCJNE A,#0EH,PSYM1 ;上次是加法键则转加法处理程序LJMP JIAPSYM1: MOV A,PARCJNE A,#0FH,PSYM2 ;上次是减法键则转减法处理程序LJMP JIANPSYM2: MOV A,PARCJNE A,#00H,PSYM3 ;从未按过运算键则转第一次按运算键处理程序 LJMP FIRSTPSYM3: LJMP DEN ;都不是则转等于处理程序;第一次按运算键处理程序FIRST: MOV RSL,R4 ;按过的数字键组成的数值送结果寄存器MOV R3,#00H ;按数字键次数清零MOV 32H,#00H ;负数标志位清零LJMP DISP ;显示运算结果JIA: MOV A,RSLADD A,R4 ;将之前的运算结果加上最近一次按得数字键组 ;成的数值JB CY,PCLR ;溢出则清零MOV RSL,AMOV R3,#00H ;按数字键次数清零LJMP DISP ;显示运算结果JIAN: MOV A,RSLSUBB A,R4 ;将之前的运算结果减去最近一次按得数字键 ;组成的数值JB CY,JIAN2 ;结果为负则转负数处理MOV 32H,#00H ;负数标志位清零MOV RSL,AMOV R3,#00H ;按数字键次数清零LJMP DISP ;显示运算结果JIAN2: MOV 32H,#01H ;负数标志位置1MOV A,R4SUBB A,RSL ;将最近一次按得数字键组成的数值减去之前 ;的运算结果MOV RSL,A ;将差送运算结果MOV R3,#00H ;按数字键次数清零LJMP DISP ;显示运算结果DEN: MOV R3,#00H ;按数字键次数清零LJMP DISP ;显示运算结果HE: SJMP HEDISP: MOV B,#10MOV A,RSLDIV AB ;运算结果除以10MOV ADN,A ;商暂存ADNMOV A,B ;取余数MOV GEW,A ;余数送个位数值寄存器MOV R2,#01H ;结果位数置1MOV A,ADNJZ DISP1 ;结果是否为一位数MOV B,#10MOV A,ADNDIV AB ;商除以10MOV ADN,A ;商暂存ADNMOV A,B ;取余数MOV SHW,A ;余数送十位数值寄存器MOV R2,#02H ;结果位数置2MOV A,ADNJZ DISP1 ;结果是否为二位数MOV BAW,AMOV R2,#03H ;结果位数置3DISP1: LCALL DISP2 ;显示结果LJMP PRER ;等待按键;显示结果DISP2: MOV COM,#01H ;清屏LCALL PR1CJNE R2,#03H,X1 ;显示结果是否为3位MOV COM,#80H ;从第一行第一位开始显示LCALL PR1MOV A,32HCJNE A,#01H,MN1 ;是否为负数INC GEW ;是负数则使它的绝对值个位加1 MOV DAT,#2DH ;显示负号LCALL PR2MN1: LCALL XBA ;显示百位LCALL XSH ;显示十位LCALL XGE ;显示个位SJMP X3X1: CJNE R2,#02H,X2 ;显示结果是否为2位MOV COM,#80H ;从第一行第一位开始显示LCALL PR1MOV A,32HCJNE A,#01H,MN2 ;是否为负数INC GEW ;是负数则使它的绝对值个位加1 MOV DAT,#2DH ;显示负号LCALL PR2MN2: LCALL XSH ;显示十位LCALL XGE ;显示个位SJMP X3X2: MOV COM,#80H ;从第一行第一位开始显示LCALL PR1MOV A,32HCJNE A,#01H,MN3 ;是否为负数INC GEW ;是负数则使它的绝对值个位加MOV DAT,#2DH ;显示负号LCALL PR2MN3: LCALL XGE ;显示个位X3: RET;显示百位XBA: MOV A,BAWANL A,#0FHADD A,#30H ;将百位数值转为对应的ASCII码 MOV DAT,ALCALL PR2 ;显示百位RET;显示十位XSH: MOV A,SHWANL A,#0FHADD A,#30H ;将十位数值转为对应的ASCII码MOV DAT,ALCALL PR2 ;显示十位RET;显示个位XGE: MOV A,GEWANL A,#0FHADD A,#30H ;将个位数值转为对应的ASCII码 MOV DAT,A ;显示个位LCALL PR2RET;写指令代码PR1: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADDPR11: MOVX A,@DPTRJB ACC.7,PR11MOV A,COMMOV DPTR,#CW_ADDMOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;写显示数据PR2: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADD PR21: MOVX A,@DPTRJB ACC.7,PR21MOV A,DATMOV DPTR,#DW_ADD MOVX @DPTR,APOP ACCPOP DPLPOP DPHRET;读ACPR3: PUSH DPHPUSH DPLPUSH ACCMOV DPTR,#CR_ADD PR31: MOVX A,@DPTRMOV COM,APOP ACCPOP DPLPOP DPHRET;延时20msDELAY1:MOV 31H,#50HDEL11: MOV 30H,#7BHNOPDEL12: DJNZ 30H,DEL12DJNZ 31H,DEL11RET;延时5msDELAY2: MOV 30H,#28HDEL21: MOV 31H,#07BHDEL22: DJNZ 31H,DEL22DJNZ 30H,DEL21RET;字符存储区TBL1: DB 7DH,0BEH,0BDH,0BBH,0DEH,0DDH,0DBH,0EEHDB 0EDH,0EBH,7EH,0E7H,0D7H,7BH,77H,0B7HTBL2: DB 30H,31H,32H,33H,34H,35H,36H,37H,38H,39HDB 41H,42H,43H,44H,45H,46HEND【实验报告】一.修改后的电原理图:总的CPLD-2电原理图:因为CPLD-1的空闲管脚不够(我的有个管脚是坏的),所以预习报告中将连接到LCD 的RS、R/W端的管脚定义为A0、A1所占的管脚,但A0、A1是地址管脚,读入键盘列信号的时候用得到,所以会和LCD的RS、R/W端冲突,从而无法显示。
实验四 键盘显示程序设计实验目的1、理解串行接口键盘单片机汇编语言程序的基本结构2、了解单片机汇编语言程序的设计和调试方法3、掌握几个的基本的传送类、控制类指令的使用方法实验仪器单片机开发板、万利仿真机、稳压电源、计算机实验原理1、 键盘接口电路工作原理串行接口键盘盘电路如图4-15所示。
键盘扫描线与显示位选扫描信号共用。
键盘输入只需要一根线,电路简单。
键盘扫描信号从74LS164输出,低电平有效。
当扫描到某个键时,若按键按下,在KEY 端得到低电平,否则得到高电平。
通过判断KEY 的电平就可以知道相应键盘是否按下。
图4-15 键盘接口电路图2、 读键盘程序设计从上面工作原理分析可知,读键程序可以和显示程序结合在一起,也可以单独设计。
这种结构的键盘同样存在抖动问题。
为了减少程序误动作,程序设计时也要考虑去抖动问题。
这里设计一个把键值显示在LED 上的程序。
为了简化问题,把读键程序与显示结合起来。
程序流程图如图4-16所示。
图4-16 键盘扫描程序流程图主程序 初值化,显示缓冲区,键值暂存,键盘缓存调用键盘显示程序键值相同 N显示计数为0 …… 键盘显示程序 N显示程序 延时程序执行后 读当前扫描的键状态,并存入键值暂存寄存器实验内容1、设计程序把键值显示在数码管。
2、设计程序按不同键时实现不同功能。
按最左边按键:小数点循环移位按向上键:最右边一位数码管数值加1(0-9),到9时加1回到0按向下键:最右边一位数码管数值减1(9-0),到0时减1回到9按向左键:显示数字左移一位按向右键:显示数字右移一位实验步骤及调试过程1、连接单片机开发板、万利仿真机2、连接仿真调试电缆(并口JTAG)3、打开ARM集成开发环境ADS,进行程序加载。
实验程序:#include<reg52.h>#define uint unsigned int#define uchar unsigned charsbit CLK=P3^4;sbit DIN=P2^3;sbit key=P1^0;char num1=0;num=1;num2;char k;uchar code table[]={0x03,0x9F,0x25,0x0D,0x99,0x49,0x41,0x1F,0x01,0x09,0x11,0xC1,0x63,0x85,0x61,0x71,0xFE};//0到F及off的代码void wei(uchar x); //声明函数void delay(uchar ms);void display(char wei,char shu);void clear164();uchar keyscan();void main(){clear164();wei(1);P0=0x03; //初始化显示的数为0,位数为第一位while(1){k=keyscan();switch(k){case 8:{++num2;if(num2>7) num2=0; }break; //最左边按键(原理图中的第七个):小数点循环移位case 1:{++num;if(num>7) num=0; };break; //按向右键(原理图中的第六个):显示数字右移一位case 5:{num1--;if(num1<0) num1=9;}break; //按向下键:最右边一位数码管数值减加1(9-0),到0时减1回到9case 4:{num1++;if(num1>9) num1=0;}break; //按向上键:最右边一位数码管数值加1(0-9),到9时加1回到0case 7:{--num;if(num<0) num=7;};break; //按向左键:显示数字左移一位}display(num2,16);display(num,num1);delay(2);}}void wei(char x) //数码管第X位显示{ char j;for (j=1;j<9;j++){if (x==j){ DIN=0;CLK=0;CLK=1;}else{DIN=1;CLK=0;CLK=1;}}P0=0xFE;}void delay(uchar ms) // 延时子程序(晶振12M){uchar i;while(ms--){for(i = 0; i < 120; i++);}}uchar keyscan(){char i,j;j=0;clear164();P0=0xff; //清除没有用到的位显示DIN=0;for(i=0;i<8;i++){CLK=0;CLK=1;DIN=1;if(key==0) //判断检测端口是否为0,若是就为按键值{delay(10);if(key==0){while(!key); //松手检测j=i+1;}}}return j;}void clear164()//将164输出所以清零{char k;for(k=0;k<8;k++){DIN=1;CLK=0;CLK=1;}}void display(char wei,char shu){uchar m,n;clear164();DIN=0;for(n=wei;n>0;n--)//去掉没有显示的位数{CLK=0;CLK=1;DIN=1;}CLK=0;CLK=1;P0=table[shu]; //显示号码的位数delay(5);for(m=8-wei;m>0;m--)//去掉剩下的位数{DIN=1;CLK=0;CLK=1;}}实验思考题1、当按加1键时,每按一次数码管值变化可能超过1,是什么原因?答:1)因为,按键在闭合和断开过程中出现一段抖动期,由于按键的不稳定性引起的,这是会呈现一串脉冲,可能是在松手时没去抖动。
实验六:键盘接口系统实验一、实训目的1.熟悉中断键盘、非编码键盘、矩阵键盘的电路结构特点;2.实现中断键盘、非编码键盘、矩阵键盘的软件编程;二、实验仪器、材料1.微型计算机(PⅣ以上)2.编程、汇编与模拟平台软件Keil uVision33.电子技术专业仿真软件protues运行平台4.单片机实训开发电路板三、实验内容和步骤1.INT01)ORG 0000HSJMP STARTORG 0003HLOOP:JNB P3.2,LOOPLCALL DISPLYRETIORG 0030HST ART:MOV P0,#0C0HMOV R0,#00HMOV P2,#0FHMOV TCON,#00HMOV IE,#81HSJMP $DISPLY: INC R0CJNE R0,#10H,DISPLY1MOV R0,#00HDISPLY1: MOV A,R0ADD A,#03H ;对A进行地址修正MOVC A,@A+PC ;查字形码表MOV P0,A ;2RET ;1DTAB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共阳极字型码DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH// DT AB:DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH ;共阴极字型码// DB 77H,7cH,39H,5eH,79H,71H,00H,0f3H,76H,80H,40HEND2.非编码P2.7按键+共阳极4位数码管静态显示(递加)1)系统电路原理图如上2)参考源程序设计如下:ORG 0000HST ART: MOV P0,#0C0HMOV R0,#00HMOV P2,#0FHLOOP: JB P2.7,LOOPLCALL DISPLYSJMP LOOPDISPLY: JNB P2.7,DISPLYINC R0CJNE R0,#10H,DISPLY1MOV R0,#00HDISPLY1: MOV A,R0ADD A,#03H ;对A进行地址修正MOVC A,@A+PC ;查字形码表MOV P0,A ;2RET ;1DT AB: DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共阳极字型码DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH // DT AB: DB 3fH,06H,5bH,4fH,66H,6dH,7dH,07H,7fH,6fH ;共阴极字型码// DB 77H,7cH,39H,5eH,79H,71H,00H,0f3H,76H,80H,40HEND3.矩阵4*4键盘+共阳极4位数码管并行显示(递加)2)参考源程序设计如下:KEY_DAT A DATA 30HORG 0000HAJMP MAINORG 0030HMAIN: MOV SP,#60HLOOP: LCALL SCANMOV A,KEY_DAT AMOV DPTR,#T ABMOVC A,@A+DPTRMOV P0,ALCALL DELAJMP LOOPSCAN: PUSH ACCPUSH PSWMOV A,#0FH ;列输出低电平MOV P1,AMOV A,P1 ;读行状态ANL A,#0FH ;屏蔽高4位的列值CJNE A,#0FH,KEYSCAN ;若有键按下,则KEYSCANSJMP EXITKEYSCAN:LCALL DEL ;去抖MOV R2,#7FH ;列值扫描初值MOV R3,#4 ;列数MOV R0,#00H ;列值计数器KEYSM1:MOV A,R2MOV P1,ARR A ;列扫描右移MOV R2,AMOV A,P1ANL A,#0FHCJNE A,#0FH,JSADDINC R0DJNZ R3,KEYSM1 ;未扫描完一遍,则循环EXIT: MOV A,#0FFHSJMP DONEJSADD:JB ACC.0,JSADD1MOV A,#0 ;行值送AAJMP JSADD4JSADD1:JB ACC.1,JSADD2MOV A,#4 ;行值送AAJMP JSADD4JSADD2:JB ACC.2,JSADD3MOV A,#8 ;行值送AAJMP JSADD4JSADD3:JB ACC.3,JSADD4MOV A,#12 ;行值送AJSADD4:ADD A,R0 ;行值+列值送入A,得到键值MOV KEY_DATA,ADONE: POP PSWPOP ACCRETDEL: MOV R6,#50DEL1: MOV R5,#200DJNZ R5,$DJNZ R6,DEL1RETKEY_TAB:DB 00H,01H,02H,03H,04H,05H,06H,07H ;0--8DB 08H,09H,0AH,0BH,0CH,0DH,0EH,0FH ;9--16// T AB: DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH ;0--9// DB 77H,7CH,39H,5EH,79H,71H ;A--FT AB:DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;共阳极字型码DB 88H,83H,0C6H,0A1H,86H,8EH,0FFH,0CH,89H,7FH,0BFH四、实训总结与分析。
实验六键盘接口实验
姓名专业通信工程学号成绩
一、实验目的
1.掌握Keil C51软件与Protues软件联合仿真调试的方法;
掌握单片机的键盘接口电路;
掌握单片机键盘扫描原理;
掌握键盘的去抖原理及处理方法。
实验仪器与设备
1.微机1台C51集成开发环境3。
Proteus仿真软件
实验内容
用Proteus设计一矩阵键盘接口电路。
要求利用P1口接一4*4矩阵键盘。
串行口通过一74LS164接一共阴极数码管。
参考电路见后面。
用线反转法编写矩阵键盘识别程序,要求采用中断方式(列线通过4输入与门74LS20接/INT0),无按键按下时,数码管循环画“8”;有按键按下时产生中断并将按键的键值0~F通过串行口输出,在数码管上显示3秒钟后返回;返回后,数码管继续循环画“8”。
将P1口矩阵键盘改为8个独立按键(用中断方式设计),键盘通过74LS30(8输入与非门)和74LS04(六反相器)与/INT0相连,重新编写识别和显示程序。
实验原理
矩阵键盘识别一般应包括以下内容:
判别有无键按下。
键盘扫描取得闭合键的行、列号。
用计算法火或查表法得到键值。
判断闭合键是否释放,如果没释放则继续等待。
将闭合键的键值保存,同时转去执行该闭合键的功能。
实验步骤
用Proteus设计键盘接口电路;
在Keil C51中编写键盘识别程序,编译通过后,与Proteus联合调试;
按动任意键,观察键值是否能正确显示。
电路设计及调试、程序
程序设计:矩阵键盘
#include<>
#define uchar unsigned char
#define uint unsigned int
uchar code table1[]={0x00,0x01,0x21,0x61,0x65,0x6d,0x7d,0x7f};
uchar code
key_table[]={0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d,0xeb,0xdb,0xbb,0x7b,0xe7,0 xd7,0xb7,0x77};
验中在做矩阵键盘实验时,会出现进入中断一次后跳出来再按键不会再进入中断显示的情况原因是:
没有在中断函数最后令P1=0xf0,在边沿触发方式下退出中断程序时P1=0xf,外部中断0为低电平,不会有下降产生,仅执行一次中断后再不会有中断产生,即使有按键按下。
2.实验中出现了进入中断跳不出来的情况,原因是:
给窗口送键值显示后没加while(!TI); TI=0;语句
总结:实验前应画出程序流程图认真分析,有助于程序的编写。
在矩阵键盘的实验中,若选择电平触发,不在中断后令P1=0xf0,则跳出中断后检测到列线全为零,又产生中断,进入中断后扫描按键发现无按键按下又退出,列还是全为零又进入中断,如此反复,效率很低。