一、实验名称:键盘扫描及显示设计实验二、实验目的1.学习按键扫描的原理及电路接法;2.掌握利用8255完成按键扫描及显示。三、实验内容及步骤1.实验内容编写程序完成按键扫描功能,并将读到的按键值依次显示在数码管上。实验机的按键及显示模块电路如图1所示。按图2连线。图1键盘及显示电路图2实验连线2.实验步骤(1)按图1接线;(2)键入:check命令,记录分配的I/O空间;(3)利用查出的地址编写程序,然后编译链接;(4)运行程序,观察数码管显示是否正确。四、流程图开始初始化缓冲用于存放键值初始化8255工作方式显示刷新及清屏扫描小键盘按键有按键显示刷新及清屏扫描小键盘按键有按键依次检测1-4列,确定是第几行按键按下将按键保存到缓冲区显示刷新及清屏按键是否弹起是是否检测完无按键否否无按键五、源程序;Keyscan.asm;键盘扫描及数码管显示实验;***************根据CHECK配置信息修改下列符号值*******************IOY0EQU9800H;片选IOY0对应的端口始地址;*****************************************************************MY8255_AEQUIOY0+00H*4;8255的A口地址MY8255_BEQUIOY0+01H*4;8255的B口地址MY8255_CEQUIOY0+02H*4;8255的C口地址MY8255_MODEEQUIOY0+03H*4;8255的控制寄存器地址STACK1SEGMENTSTACKDW256DUP(?)STACK1ENDSDATASEGMENTDTABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H,5EH,79H,71HDATAENDS;键值表,0~F对应的7段数码管的段位值CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVSI,3000H;建立缓冲区,存放要显示的键值MOVAL,00H;先初始化键值为0MOV[SI],ALMOV[SI+1],ALMOV[SI+2],ALMOV[SI+3],ALMOVDI,3003HMOVDX,MY8255_MODE;初始化8255工作方式MOVAL,81H;方式0,A口、B口输出,C口低4位输入是OUTDX,ALBEGIN:CALLDIS;显示刷新CALLCLEAR;清屏CALLCCSCAN;扫描按键JNZGETKEY1;有键按下则跳置GETKEY1MOVAH,1;判断PC键盘是否有按键按下INT16HJZBEGIN;无按键则跳回继续循环,有则退出QUIT:MOVAX,4C00H;返回到DOSINT21HGETKEY1:CALLDIS;显示刷新CALLDALLYCALLDALLYCALLCCSCAN;再次扫描按键JNZGETKEY2;有键按下则跳置GETKEY2JMPBEGIN;否则跳回开始继续循环GETKEY2:MOVCH,0FEHMOVCL,00H;设置当前检测的是第几列COLUM:MOVAL,CH;选取一列,将X1~X4中一个置0MOVDX,MY8255_AOUTDX,ALMOVDX,MY8255_C;读Y1~Y4,用于判断是哪一行按键闭合INAL,DXL1:TESTAL,01H;是否为第1行JNZL2;不是则继续判断MOVAL,00H;设置第1行第1列的对应的键值JMPKCODEL2:TESTAL,02H;是否为第2行JNZL3;不是则继续判断MOVAL,04H;设置第2行第1列的对应的键值JMPKCODEL3:TESTAL,04H;是否为第3行JNZL4;不是则继续判断MOVAL,08H;设置第3行第1列的对应的键值JMPKCODEL4:TESTAL,08H;是否为第4行JNZNEXT;不是则继续判断MOVAL,0CH;设置第4行第1列的对应的键值KCODE:ADDAL,CL;将第1列的值加上当前列数,确定按键值CALLPUTBUF;保存按键值PUSHAXKON:CALLDIS;显示刷新CALLCLEAR;清屏CALLCCSCAN;扫描按键,判断按键是否弹起JNZKON;未弹起则继续循环等待弹起POPAXNEXT:INCCL;当前检测的列数递增MOVAL,CHTESTAL,08H;检测是否扫描到第4列JZKERR;是则跳回到开始处ROLAL,1;没检测到第4列则准备检测下一列MOVCH,ALJMPCOLUMKERR:JMPBEGINCCSCANPROCNEAR;扫描是否有按键闭合子程序MOVAL,00HMOVDX,MY8255_A;将4列全选通,X1~X4置0OUTDX,ALMOVDX,MY8255_CINAL,DX;读Y1~Y4NOTALANDAL,0FH;取出Y1~Y4的反值RETCCSCANENDPCLEARPROCNEAR;清除数码管显示子程序MOVDX,MY8255_B;段位置0即可清除数码管显示MOVAL,00HOUTDX,ALRETCLEARENDPDISPROCNEAR;显示键值子程序PUSHAX;以缓冲区存放的键值为键值表偏移找到键值并显示MOVSI,3000HMOVDL,0F7HMOVAL,DLAGAIN:PUSHDXMOVDX,MY8255_AOUTDX,AL;设置X1~X4,选通一个数码管MOVAL,[SI];取出缓冲区中存放键值MOVBX,OFFSETDTABLEANDAX,00FFHADDBX,AXMOVAL,[BX];将键值作为偏移和键值基地址相加得到相应的键值MOVDX,MY8255_BOUTDX,AL;写入数码管A~DpCALLDALLYINCSI;取下一个键值POPDXMOVAL,DLTESTAL,01H;判断是否显示完?JZOUT1;显示完,返回RORAL,1MOVDL,ALJMPAGAIN;未显示完,跳回继续OUT1:POPAXRETDISENDPPUTBUFPROCNEAR;保存键值子程序MOVSI,DIMOV[SI],ALDECDICMPDI,2FFFHJNZGOBACKMOVDI,3003HGOBACK:RETPUTBUFENDPDALLYPROCNEAR;软件延时子程序PUSHCXMOVCX,00FFHD1:MOVAX,00FFHD2:DECAXJNZD2LOOPD1POPCXRETDALLYENDPCODEENDSENDSTART六、体会和感想通过这次的实验我了解到自己还有很多的不足,比如做实验的速度很慢,效率很低,思维不集中导致最后老师验收的时候没有来的及交,对书本的了解不是很透彻,也因此我决定下次实验的时候一定要好好地去思考,尽量在课外把实验看懂!