1、1题目实时时钟的设计与实现姓名:学院:计算机与控制工程学院指导老师:邱秀芹时间:20141218一、设计内容:设计并实现实时时钟并通过LED显示时、分、秒2二、设计要求:、通过8253产生1s信号中断信号。、每秒钟产生中断,在中断子程序中修改时间。、在LED上显示时、分、秒。、通过键盘修改时钟。三、程序流程图:本次试验主要用到了8254,8255,825934四、硬件接线图图1 8259内部连续及外部管脚引出图图2 8254技术应用实验接线图5图3 8255键盘扫描及数码管显示实验线路图五、程序代码MY8255_A EQU 0600HMY8255_B EQU 0602HMY8255_C EQU
2、 0604HMY8255_CON EQU 0606HA8254EQU06C0H ;计数器0的接口地址CON8254EQU06C6H ;控制口SSTACK SEGMENTSTACKDW64DUP(?)SSTACK ENDSDATA SEGMENTTEMPWORDDW0000H ;放置当前要调的是哪一位TEMPT DB01H,00H,00H ;临时数据6TIME DB00H,00H,00H ;时、分、秒DTABLE DB3FH,06H,5BH,4FH,66H,6DH,7DH,07H ;定义16进制数字DB7FH,6FH,77H,7CH,39H,5EH,79H,71HDATA ENDSCODE SE
3、GMENTASSUMECS:CODE,DS:DATASTART: PUSHDSPUSHSIMOVAX,0000HMOVDS,AXMOVAX,OFFSETIRQ7 ;取中断入口地址MOVSI,00C4H ;中断矢量地址MOVSI,AX ;填IRQ7的偏移矢量MOVAX,CS ;段地址MOVSI,00C6HMOVSI,AX ;填IRQ7的段地址矢量CLIPOPSIPOPDS;初始化主片8259MOVAL,11HOUT20H,AL ;ICW1MOVAL,08HOUT21H,AL ;ICW2MOVAL,04H ;表明,IR2接口上接从片OUT21H,AL ;ICW3MOVAL,01HOUT21H,AL
4、 ;ICW4;从片MOVAL,11HOUT0A0H,AL;ICW1MOVAL,30HOUT0A1H,AL;ICW2MOVAL,02HOUT0A1H,AL;ICW3,终端类型码是010,中断源是IR2MOVAL,01HOUT0A1H,AL;ICW4MOVAL,0FDHOUT0A1H,AL ;OCW1=11111101B,只有IR1不被屏蔽MOVAL,6BHOUT21H,AL ;主片8259,OCW1(IR7,IR4,IR2不被屏蔽)STI;时钟显示MOVAX,DATAMOVDS,AX7MOVSI,3000HMOVAL,00HMOVSI,AL;清显示缓冲MOVSI+1,ALMOVSI+2,ALMO
5、VSI+3,ALMOVSI+4,AL ;第2个LEDMOVSI+5,AL ;第1个LEDLEADI,TIMEMOVDX,MY8255_CON;写8255控制字MOVAL,81H ;A,B口式0,C口下半部输入,其他口输出OUTDX,AL;计数器PUSHDXPUSHAXMOVDX,CON8254MOVAL,00110000B ;计数器0,16位计数,方式0,二进制OUTDX,ALMOVDX,A8254MOVAL,00H ;计数初值为18432(十进制)OUTDX,AL ;写低8位MOVAL,48H;写高8位OUTDX,ALSTIPOPAXPOPDXBEGIN: CALLDIS ;调用显示子程序C
6、ALLCLEAR ;清屏CALLCCSCAN ;扫描JNZINK1JMPBEGININK1: CALLDISCALLDALLYCALLDALLYCALLCLEARCALLCCSCANJNZINK2 ;有键按下,转到INK2JMPBEGIN;确定按下键的位置INK2: MOVCH,0FEHMOVCL,00HCOLUM: MOVAL,CHMOVDX,MY8255_AOUTDX,ALMOVDX,MY8255_C8INAL,DX ;IN为输入字节或字L1: TESTAL,01H ;isL1?JNZL2MOVAL,00H ;L1JMPKCODEL2: TESTAL,02H ;isL2?JNZL3MOVA
7、L,04H ;L2JMPKCODEL3: TESTAL,04H ;isL3?JNZL4MOVAL,08H ;L3JMPKCODEL4: TESTAL,08H ;isL4?JNZNEXTMOVAL,00H ;L4ADDAL,CLCALLSETIME ;用来确定是调时还是调分还是调秒还是清零JMPCONTINUEKCODE: ADDAL,CLCALLPUTBUFCONTINUE:PUSHAXKON: CALLDIS ;调用显示子程序CALLCLEAR ;清屏CALLCCSCAN ;扫描JNZKONPOPAXNEXT: INCCL ;次数加1MOVAL,CHTESTAL,08HJZKERRROLAL
8、,1 ;左移MOVCH,ALJMPCOLUMKERR: JMPBEGINCCSCAN: MOVAL,00H ;键盘扫描子程序MOVDX,MY8255_AOUTDX,ALMOVDX,MY8255_CIN AL,DXNOTALANDAL,0FHRETCLEAR: MOVDX,MY8255_B ;清屏子程序MOVAL,00H9OUTDX,ALRETDIS: PUSHAX ;显示子程序MOVSI,3000HMOVDL,0DFHMOVAL,DLAGAIN: PUSHDXMOVDX,MY8255_AOUTDX,ALMOVAL,SIMOVBX,OFFSETDTABLEANDAX,00FFHADDBX,AXM
9、OVAL,BXMOVDX,MY8255_BOUTDX,ALCALLDALLYINCSIPOPDXMOVAL,DLTESTAL,01HJZ OUT1RORAL,1MOVDL,ALJMPAGAINOUT1: POPAXRETDALLY: PUSHCX ;延时子程序MOVCX,0006HT1: MOVAX,009FHT2: DECAXJNZT2LOOPT1POPCXRETPUTBUF: PUSHSIPUSHDXLEASI,TEMPT ;TEMPT有3个字节记录,输入数据是十位还是个位,第二个和第三个数据放置十位和个位的值MOVAH,SICMPAH,01HJZPUT1JMPPUT2PUT1: MOVS
10、I+1,ALMOVAH,02H10MOVSI,AHLEASI,TEMPWORDMOVSI,SIMOVSI,ALJMPGOBACKPUT2: MOVAH,01HMOVSI,AHMOVSI+2,ALMOVAL,SI+1MOVDL,0AHMULDL ;AX=DL*ALMOVAH,SI+2ADDAL,AH ;AL当前存放的是两次输入的正确的时间,2位LEASI,TEMPWORDMOVSI,SIMOVSI,ALJMPGOBACKGOBACK: POPDXPOPSIRETSETIME: ;找出最后一行阵列按的是第几个,确定调整时分秒PUSHAXPUSHSILEASI,TEMPTMOVAH,01HMOVSI
11、,AHLEASI,TEMPWORDLEADI,TIMEL40: CMPAL,00HJNZL41MOVSI,DICALLSETIMENDL41: CMPAL,01HJNZL42INCDIMOVSI,DICALLSETIMENDL42: CMPAL,02HJNZL43INCDIINCDIMOVSI,DICALLSETIMENDL43: MOVSI,DI ;时钟全部置0MOVAH,00H11MOVSI,AHMOVSI+1,AHMOVSI+2,AHSETIMEND:POPSIPOPAXRETIRQ7: STI ;中断服务子程序,自动修改时间PUSHSIPUSHAXPUSHDXMOVDX,CON8254
12、MOVAL,00110000B ;计数器0?16位计数,方式0,二进制OUTDX,ALMOVDX,A8254MOVAL,00H ;计数器初值是18432(十进制)OUTDX,AL ;写低8位MOVAL,48H ;写高8位OUTDX,ALMOVDL,00111100BMOVDH,00011000BLEASI,TIMEMOVAX,0000H ;清空MOVAL,SI+2;取得时间,秒ADDAL,01H ;秒+1DIVDL ;取模60MOVSI+2,AH;AH=余数(),装回去MOVAH,SI+1;取时间,分ADDAL,AH;AL=秒位的进位(0或1),分+1或0MOVAH,00HDIVDL;取模60
13、MOVSI+1,AH;AH=模(余数),装回去MOVAH,SI;小时ADDAL,AH;取分位进位MOVAH,00H ;防止混DIVDH ;取模24MOVSI,AH;模(余数)=新时间,装回去;将时钟时间写入到6个内存块中LEADI,TIMEMOVSI,3000HMOVDL,00001010B;=10MOVAX,0000HMOVAL,DI+2;读取秒DIVDLMOVSI,AH;放余数MOVSI+1,AL;放商MOVAX,0000H12MOVAL,DI+1;读取分DIVDLMOVSI+2,AHMOVSI+3,ALMOVAX,0000HMOVAL,DI ;读取小时DIVDLMOVSI+4,AHMOV
14、SI+5,ALPOPDXPOPAXPOPSIMOVAL,20HOUT0A0H,ALOUT20H,AL ;中断结束命令IRETCODE ENDSENDSTART六、实验结果:数码管:时分秒前两格显示时,中间两格显示分,最后两格显示秒。如12:35:48,十二时,三十五分,四十八秒13键盘:0 1 2 34 5 6 78 9 10 11时分秒清零功能实现:、通过8253产生1s信号中断信号。、每秒钟产生中断,在中断子程序中修改时间。、在LED上显示时、分、秒。、通过键盘修改时钟。示例:如果要将时间调成12:35:41,先按一下“改时”键,然后按1,此时1显示在时的个位,要想现实“12”,此时要再按
15、一下2,这样,个位的1会被进位到时的十位上去,此时“12”就通过数码管显示出来了,也就是说这个时钟可以实现一位一位更改时间的功能,分和秒的更改也一样。清零:要想时间全部清零,按一下清零键即可。七、实验心得:通过这次的实验我学习了很多知识,锻炼了我的动手能力。刚开始拿到题目,我感觉不知道从哪里下手。但是,通过老师的讲解和请教一些有能力的同学,我渐渐找到了实验的方法和思路。14在实验过程中程序的编写成了我最头疼的部分,由于基础知识不扎实的限制程序总是调试不出来,最后只能请教同学。在同学的帮助和自己的琢磨下终于实现了通过8253产生1s信号中断信号、每秒钟产生中断,在中断子程序中修改时间、在LED上显示时、分、秒等功能。由于我们对中断向量表的装载比较模糊,对中断的初始化、具体设置、中断返回还不是很清楚,以致程序设计一度陷入停滞状态,不过通过向老师、同学询问和自己查书,终于对中断的内容有了深刻的了解。实验结束的同时我也对自己的不足做了一个总结,由于基础知识不扎实导致很多的功能无法自己实现和调试。也认识到了自己在学习过程中的浮躁,对编程知识的学习只停留在皮毛,这是导致自己做课程设计不能得心应手的根本原因。所以,在以后的学习中我一定要夯实基础,好好学习专业知识。