2012~2013年度第1学期设计题目:实现特定功能的键盘及LED显示院系:计算机学院学号:姓名:指导教师:张健成绩评定:完成日期:2014年11月4日微机系统与接口技术课程设计1.设计说明《微机系统与接口技术》是一门实践性很强的课程,本课程设计是这门课程的最后一个教学环节,是对这门课程一个较全面的应用设计实践,目的在于在巩固学生在课堂上学到的基础知识,加强学生的综合能力与系统设计能力、创新能力。在本课程设计中,我的题目是在TD-PITE实验箱中实现特定功能的键盘及LED显示。整个系统的目标实现功能具体一点是通过键盘输入来控制点阵LED显示器显示不同的内容,同时要求有一定的扩展能力特性。整个系统的具体目标功能特性如下;1)按1键显示年,按2键显示月、日。2)按3键显示自己的姓名。3)按4键由左向右循环显示自己的学号或其它特效功能。1.1.设计思路从上面的任务说明中可以知道程序的功能很简单,从总体上可以感受得到关键问题在于获取键盘的输入、控制点阵LED的输出显示。前者在于接收到键盘是否被按下以及哪一个键被按下的数据,在取得这些数据后程序就能够按规则将后者的显示内容进行更改,从而达到通过键盘输入来控制点阵LED的输出。系统运行流程图如下:上面流程图中LED的显示特效是动态的,同时系统需要监控键盘的输入情况,初始化默认显示姓名LED显示有输入?切换显示内容即系统需要控制LED输出,也需要控制键盘的输入检测。在此有两种方案可以考虑。第一种是使用中断的方式(8259A芯片)将键盘的检测独立出来,当键盘被按下时,键盘就会发出一个中断信号来中断当前的系统操作,进而系统可以从键盘的扫描结果来决定是否进行功能的切换。第二种则是使用程序查询的方式进行,此方式相对第一种会更加简单。具体的实施方式是在每一次的LED输出后,马上查询一个键盘是不是有按键被按下,如果发现存在被按下的键,则读取键盘的按键住处,进而进行功能切换,否则继续控制LED的动态效果输出。相比之下,第二种方式比较简单实用,所以本系统采取了程序查询的方式解决了边控制LED输出边监控键盘输入的问题。下面针对键盘输入与LED输出两个关键问题进行详细的说明。1.1.1.键盘输入为了得到键盘的输入,本系统使用8255A作为输入输出芯片,并连接到一个4*4的键盘上。该键盘从左上角到右下角分别是0~F的编号。在实际连接时,主要使用8255A的端口C的低4位来作为读入键盘的扫描码的输入端口。由于该键盘还带有数码显示管单元,为了能够进行键盘输入操作的调试,这里对数码显示管使用端口A与端口B分别连接之,调试过程中将使用端口A、B来将键盘的键值使用数码管显示之,注意在最终的执行过程中将不会使用到该单元的数码显示管单元器件。下面是系统总线与8255A、4*4的键盘单元的连接线路图。D0D7...WRRDCSXD0XD7...IOW#IOR#IOY0AB系统总线8255单元A0A1XA1XA2键盘及数码管显示单元PB0PB1CPB2DPB3EPB4FPB5GPB6DpPB7X1X2PA0PA1X3PA2X4PA3Y1PC0Y2PC1Y3PC2Y4PC3X5PA4X6PA5基于上图的芯片单元配置连接图,在程序中可以通过8255A的端口C来读取键盘的扫描码。当发现有按键被按下时,程序会取得按键对应的数字编号,以便进一步处理LED的显示内容。关于详细的扫描键盘及读取键盘按键值的实现请参考后续的源代码实现。1.1.2.点阵LED输出本系统的输出将采用点阵式的LED单元进行输出,实验箱自带的点阵LED的大小是16*16的,即由四块8*8的点阵块组成,这四个点阵块分别占用了两行两列。实验箱的点阵LED的显示方式是行为1时,列为0时对应的LED点会亮。具体的点阵LED的示意图及内部结构图如下:07815列07815行16×16点阵示意图9148121725133410611151616×16点阵内部结构图使用点阵LED输出文字时的关键在于符合点阵格式的文字点阵数据,在本系统中将使用DotReader这款中文点阵生成器自动生成目标文字的点阵数据,具体的使用方法可以在参考文献的相关引用资料[1]中找到。在本系统中,每一个中文的点阵大小是16*16的,在输出的时候只要将对应的点阵数据放到点阵LED的对应位置即可,整个LED会在点阵数据填充过程中正确显示文字。在滑动地显示文字这个特效功能上,本系统采用逐行扫描方式,不断地将文字的点阵数据向某一个方向”滑动”地在LED上面显示,最终达到整体上文字的滑动特效显示。16*16的点阵LED的数据端口有一个,通过IOY0~IOY4来进行片选操作,从而能够访问各行各列的点阵.下面是本16*16点阵LED的四个端口的定义:ROW1EQU0600H;第0~7行ROW2EQU0640H;第8~15行COL1EQU0680H;第0~7列COL2EQU06C0H;第8~15列下面是16*16点阵LED与系统总线的连接线路图。D0D7...CS3CS4WRCS1CS2XD0XD7...IOW#IOY0点阵LED显示单元系统总线IOY1IOY2IOY3行列1.2.运用技术本系统整体结构比较简单,运用到实现技术主要是:键盘输入单元点阵LED输出单元并行接口单元8255A芯片16*16中文字符点阵生成器1.3.完成情况目前系统的完成情况基本能够达到题目要求,按0键的功能是从上至下滑动显示学生学号,按1键则从下至上是滑动显示学生姓名,并进行LED显示内容的切换。最后LED的显示特效也符合预期,能够正常自下而上地”滑动式”显示输出内容2.源代码清单本系统结构简单,主要的代码量是中文点阵数据,在此就不列出了。以下整个系统的汇编源代码清单。整个系统初始运行时默认是滑动显示学生姓名。MY8255_AEQU0600H;端口定义MY8255_BEQU0602H;键盘输入相关接口MY8255_CEQU0604HMY8255_CONEQU0606HROW1EQU0600H;端口定义ROW2EQU0640H;点阵LED输出相关接口COL1EQU0680HCOL2EQU06C0H;堆栈段STACK1SEGMENTSTACKDW256DUP(?)STACK1ENDS;数据段DATASEGMENTINPUTSDB?INCLUDEchunrong.asm;所有数据汉字点阵DATAENDS;代码段CODESEGMENTASSUMECS:CODE,DS:DATASTART:MOVAX,DATAMOVDS,AXMOVDX,ROW1MOVAL,00HOUTDX,ALMOVDX,ROW2OUTDX,ALMOVAL,0ffHMOVDX,COL1OUTDX,ALMOVDX,COL2OUTDX,ALMOVDX,MY8255_CON;初始化8255AMOVAL,81HOUTDX,ALJMPSHOW_ZHOU;默认显示名字;=====滑动显示姓名=====SHOW_ZHOU:NAME_BG0:MOVAX,16*4MOVSI,OFFSETHZDOT_NameNAME_BG1:CALLDISP;滑动一行SUBSI,2PUSHSIPUSHAXCALLSCAN_KEYBOARD;扫描一个键盘码POPAXPOPSIDECAXJZNAME_BG0;下一轮滑动JMPNAME_BG1;下一行;=====滑动显示学号=====SHOW_XUEHAO:XUEHAO_BG0:MOVAX,24MOVSI,OFFSETHZDOT_XUEXUEHAO_BG1:CALLDISP;滑动一行ADDSI,2PUSHSIPUSHAXCALLSCAN_KEYBOARD;扫描一个键盘码POPAXPOPSIDECAXJZXUEHAO_BG0;下一轮滑动JMPXUEHAO_BG1;下一行;=====扫描键盘并选择功能=====SCAN_KEYBOARD:BEGIN:CALLCCSCAN;扫描JNZINK1RET;INK1:CALLDALLYCALLDALLYCALLCCSCANJNZINK2;有键按下,进行取键值INK2_BRK:MOVAL,INPUTS;得到键值CMPAL,0JZSHOW_ZHOU;0显示姓名;default..CMPAL,1;1显示学号JZSHOW_XUEHAORET;=====获取键盘输入的键值=====INK2:MOVCH,0FEHMOVCL,00HCOLUM:MOVAL,CHMOVDX,MY8255_AOUTDX,ALMOVDX,MY8255_CINAL,DXL1:TESTAL,01H;isLine1?JNZL2MOVAL,00H;Line1JMPKCODEL2:TESTAL,02H;isLine2?JNZL3MOVAL,04H;Line2JMPKCODEL3:TESTAL,04H;isLine3?JNZL4MOVAL,08H;Line3JMPKCODEL4:TESTAL,08H;isLine4?JNZNEXTMOVAL,0CH;Line4KCODE:ADDAL,CLMOVINPUTS,Al;保存输入值NEXT:INCCLMOVAL,CHTESTAL,08HJZKERRROLAL,1MOVCH,ALJMPCOLUMKERR:JMPINK2_BRK;返回,并判断是否需要切换功能;======键盘扫描子程序======CCSCAN:MOVAL,00H;键盘扫描子程序MOVDX,MY8255_AOUTDX,ALMOVDX,MY8255_CINAL,DXNOTALANDAL,0FHRET;======键盘延时子程序======DALLY:PUSHCXMOVCX,0006HT1:MOVAX,009FHT2:DECAXJNZT2LOOPT1POPCXRET;======显示汉字子程序======;入口参数:SI=存放汉字点阵起始地址DISP:MOVCX,000FHPUSHAXML0:PUSHCXMOVBL,01HMOVCX,0008HML1:MOVDX,ROW1;控制0--7行MOVAL,00HOUTDX,ALMOVAL,[SI]notal;0表示高亮MOVDX,COL1;0--7列OUTDX,ALINCSI;下一个字节(下一列)MOVAL,[SI]notalMOVDX,COL2;8--15列OUTDX,ALINCSIMOVDX,ROW1;控制0--7行MOVAL,BLOUTDX,ALROLBL,1CALLDELAYLOOPML1MOVDX,ROW1MOVAL,00HOUTDX,ALMOVCX,0008HML2:MOVDX,ROW2;控制8--15行MOVAL,00HOUTDX,ALMOVAL,[SI]NOTALMOVDX,COL1;0--7列OUTDX,ALINCSIMOVAL,[SI]NOTALMOVDX,COL2;8--15列OUTDX,ALINCSIMOVDX,ROW2;控制8--15行MOVAL,BLOUTDX,ALROLBL,1CALLDELAYLOOPML2MOVDX,ROW2MOVAL,00HOUTDX,ALSUBSI,32POPCXLOOPML0POPAXRET;======显示延时子程序======DELAY:PUSHCX;延时子程序MOVCX,00C0HDL1:PUSHAXPOPAXLOOPDL1POPCXRETCODEENDSENDSTART;;本文件为16×16点阵中文字库文件,字的横向8点构成一字节,左边点在字节的高位,字符点阵四角按左上角→右上角→左下角→右下角取字;如你想在以后继续用HZDotReader打开文件,追加汉字点阵数据,请不要修改或增删所有注释CD5C5EQU00000H;李CBCCCEQUCD5C5+1;俊CB7E5EQUCBCCC+1;杰;杰CBDDCDB080H,001H,080H,001H,0FEH,03FH,0FEH,03FHDB0E0H,003H,0E0H,007H,0B0H,00DH,098H,019HDB08EH,071H,082H,021H,000H,000H,06CH,033HDB04CH,066H,0