智能化电子表课程设计说明书.docx
《智能化电子表课程设计说明书.docx》由会员分享,可在线阅读,更多相关《智能化电子表课程设计说明书.docx(22页珍藏版)》请在冰豆网上搜索。
智能化电子表课程设计说明书
智能化电子表课程设计说明书
一、设计任务:
1.电子表,具有十分、分、十秒和秒的计时功能,并可以在数码管上显示。
2电子表具有启动键、停止键、复位键,而且可以随时通过键盘进行各位时间的设置。
二、设计原理:
本程序的主要设计原理是用主程序完成键盘按键的扫描,实现计时结果的数码管显示,实现秒与分之间的转换。
通过判断键盘按键调用相应功能程序段以实现相应功能,即实现了启动、暂停、复位功能,以及通过键盘进行十分、分、十秒、秒时间的手动设置功能。
1.8254的初始化字
由此,本设计中的8254的初始化为:
MOVDX,MY8254_MODE;初始化8254工作方式
MOVAL,36H;计数器0,方式3
OUTDX,AL
MOVDX,MY8254_COUNT0;装入计数初值
MOVAL,00H;18432分频
OUTDX,AL
MOVAL,54H
OUTDX,AL
2.8255的初始化字
由此,本设计中的8255的初始化为:
MOVDX,MY8255_MODE;初始化8255工作方式
MOVAL,81H;方式0,A口、B口输出,C口低4位输入
OUTDX,AL
三、电子表软件流程图
1.主程序流程图
程序初始化
判断小键盘是否有键按下
PC机上面是不是有键按下
若按键值为3,则要转至STARTISRUNING处理程序
若按键值为1,则要转至STOPKEYTAG处理程序
若按键值为2,则要转至CLEARKEYTAG处理程序
返回DOS
结束
调用子程序
开始
若按键值为8、9、0A、0B、0C、0D、0E、0F,则要转至时间设置处理程序
N
Y
NY
2.电子表处理程序
N
Y
N
Y
N
Y
N
Y
四、电子表硬件接线图
XD7
XD6
XD5
XD4
XD3
XD2
XD1
XD0
系
XA3
D7
D6
D5
D4
D3
D28254
D1单元
D0
A1
A2
WR
RD
CS
OUT0
CLK0
XA2
XIOW
XIOR
IOY0
IOY1
INTR
CLK
统
总
线
五.电子表软件代码
;***************根据CHECK配置信息修改下列符号值*******************
IOY0EQU0e000H;片选IOY0对应的端口始地址
IOY1EQU0e040H
;*****************************************************************
MY8255_AEQUIOY0+00H*4;8255的A口地址
MY8255_BEQUIOY0+01H*4;8255的B口地址
MY8255_CEQUIOY0+02H*4;8255的C口地址
MY8255_MODEEQUIOY0+03H*4;8255的控制寄存器地址
MY8254_COUNT0EQUIOY1+00H*4;8254计数器0端口地址
MY8254_COUNT1EQUIOY1+01H*4;8254计数器1端口地址
MY8254_COUNT2EQUIOY1+02H*4;8254计数器2端口地址
MY8254_MODEEQUIOY1+03H*4;8254控制寄存器端口地址
STACK1SEGMENTSTACK
DW256DUP(?
)
STACK1ENDS
DATASEGMENT
DTABLEDB3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,67H,77H,7CH,39H
5EH,79H,71H;键值表,0~F对应的7段数码管的段位值
TIMETABLEDB0,0,0,0
STARTKEYDB3;启动键
STOPKEYDB1;停止键
CLEARKEYDB2;清0键
SETTMADDKEYDB8;设置十位分钟加
SETMADDKEYDB9;设置个位分钟加
SETTSADDKEYDB0AH;设置十位秒加
SETSADDKEYDB0BH;设置个位秒加
SETTMSUBKEYDB0CH;设置十位分钟减
SETMSUBKEYDB0DH;设置个位分钟减
SETTSSUBKEYDB0EH;设置十位秒减
SETSSUBKEYDB0FH;设置个位秒减
STATUSDB0;8254out端口状态键
ISRUNINGDB0
WTHOUSANDDB0
WSECDB0
WMSECDB0
TENSECDB0
SECDB0
MINTDB0
TENMINTDB0
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA
START:
MOVAX,DATA
MOVDS,AX
MOVES,AX
MOVDX,MY8254_MODE;初始化8254工作方式
MOVAL,36H;计数器0,方式3
OUTDX,AL
MOVDX,MY8254_COUNT0;装入计数初值
MOVAL,00H;18432分频
OUTDX,AL
MOVAL,54H
OUTDX,AL
MOVDX,MY8255_MODE;初始化8255工作方式
MOVAL,81H;方式0,A口、B口输出,C口低4位输入
OUTDX,AL
BEGIN:
CALLDIS;显示刷新
CALLCLEAR;清屏
CALLCCSCAN;扫描按键
JZNOKEYDOWN;有键按下则跳置GETKEY1
JMPGETKEY1
NOKEYDOWN:
MOVAH,1;判断PC键盘是否有按键按下
INT16H
JZKEYSCANEND;无按键则跳回继续循环,有则退出
JMPQUIT
KEYSCANEND:
CMPISRUNING,1
JNEBEGIN
TIMESTART:
MOVAL,11100010B;设置回读命令
MOVDX,MY8254_MODE
OUTDX,AL
MOVDX,MY8254_COUNT0;读0端口状态控制字
INAL,DX
CMPSTATUS,1
JNENOTSTATUS
TESTAL,80H
JZCHANGEWMSEC
JMPBEGIN
NOTSTATUS:
TESTAL,80H
JNZCHANGEWMSEC
JMPBEGIN
CHANGEWMSEC:
TESTAL,80H
JZCHANGESTATUS
MOVSTATUS,1
JMPHASCHANGE
CHANGESTATUS:
MOVSTATUS,0
HASCHANGE:
INCWMSEC
CMPWMSEC,0AH;百分秒到10,十分秒加1
JNECHANGESEC
MOVWMSEC,0
INCWSEC
CMPWSEC,0AH;十分秒秒到10,个位秒加1
JNECHANGESEC
MOVWSEC,0
INCSEC
CMPSEC,0AH;个位秒秒到10,十位秒加1
JNECHANGESEC
MOVSEC,0
INCTENSEC
CMPTENSEC,06H;十位秒到6,清零
JNECHANGESEC
MOVTENSEC,0
INCMINT
CMPMINT,0AH;分钟个位到10,十位加1
JNZCHANGESEC
MOVMINT,0
INCTENMINT
CMPTENMINT,06H;十位分到6,清零
JNECHANGESEC
MOVTENMINT,0
CHANGESEC:
MOVSI,0
;存储时间
MOVAL,TENMINT;十位分
MOVTIMETABLE[SI],AL
INCSI
MOVAL,MINT;个位分
MOVTIMETABLE[SI],AL
INCSI
MOVAL,TENSEC;十位秒
MOVTIMETABLE[SI],AL
INCSI
MOVAL,SEC;个位秒
MOVTIMETABLE[SI],AL
INCSI
MOVTIMETABLE[SI],0
INCSI
JMPBEGIN
QUIT:
MOVAX,4C00H;返回到DOS
INT21H
GETKEY1:
CALLDIS;显示刷新
CALLDALLY
CALLDALLY
CALLCLEAR;清屏
CALLCCSCAN;再次扫描按键
JNZGETKEY2;有键按下则跳置GETKEY2
JMPBEGIN;否则跳回开始继续循环
GETKEY2:
MOVCH,0FEH
MOVCL,00H;设置当前检测的是第几列
COLUM:
MOVAL,CH;选取一列,将X1~X4中一个置0
MOVDX,MY8255_A
OUTDX,AL
MOVDX,MY8255_C;读Y1~Y4,用于判断是哪一行按键闭合
INAL,DX
L1:
TESTAL,01H;是否为第1行
JNZL2;不是则继续判断
MOVAL,00H;设置第1行第1列的对应的键值
JMPKCODE
L2:
TESTAL,02H;是否为第2行
JNZL3;不是则继续判断
MOVAL,04H;设置第2行第1列的对应的键值
JMPKCODE
L3:
TESTAL,04H;是否为第3行
JNZL4;不是则继续判断
MOVAL,08H;设置第3行第1列的对应的键值
JMPKCODE
L4:
TESTAL,08H;是否为第4行
JNZkk;不是则继续判断
MOVAL,0CH;设置第4行第1列的对应的键值
MYNEXT:
PUSHAX
KON:
CALLDIS;显示刷新
CALLCLEAR;清屏
CALLCCSCAN;扫描按键,判断按键是否弹起
JNZKON;未弹起则继续循环等待弹起
POPAX
KCODE:
ADDAL,CL;将第1列的值加上当前列数,确定按键值
CMPAL,STARTKEY;判断是否为开始键
JNESTOPKEYTAG
CMPISRUNING,0
JNESTARTISRUNING
MOVISRUNING,1
STARTISRUNING:
JMPTIMESTART
STOPKEYTAG:
;判断是否为停止键
CMPAL,STOPKEY
JNECLEARKEYTAG
MOVISRUNING,0
JMPSTARTISRUNING
CLEARKEYTAG:
;判断是否为清零键
CMPAL,CLEARKEY
JNZSETTMADDTAG
CALLCLEARCLOCK
JMPKERR
KK:
JMPNEXT
SETTMADDTAG:
;判断是否为十位分钟加设置键
CMPAL,SETTMADDKEY
JNZSETMADDTAG
CALLSETTMADD
JMPKERR
SETMADDTAG:
;判断是否为个位分钟加设置键
CMPAL,SETMADDKEY
JNZSETTSADDTAG
CALLSETMADD
JMPKERR
SETTSADDTAG:
;判断是否为十位秒加设置键
CMPAL,SETTSADDKEY
JNZSETSADDTAG
CALLSETTSADD
JMPKERR
SETSADDTAG:
;判断是否为个位秒加设置键
CMPAL,SETSADDKEY
JNZSETTMSUBTAG
CALLSETSADD
JMPKERR
SETTMSUBTAG:
;判断是否为十位分钟减设置键
CMPAL,SETTMSUBKEY
JNZSETMSUBTAG
CALLSETTMSUB
JMPKERR
SETMSUBTAG:
;判断是否为个位分钟减设置键
CMPAL,SETMSUBKEY
JNZSETTSSUBTAG
CALLSETMSUB
JMPKERR
SETTSSUBTAG:
;判断是否为十位秒减设置键
CMPAL,SETSSUBKEY
JNZSETSSUBTAG
CALLSETTSSUB
JMPKERR
SETSSUBTAG:
;判断是否为个位秒减设置键
CMPAL,SETSSUBKEY
JNZKERR
CALLSETSSUB
NEXT:
INCCL;当前检测的列数递增
MOVAL,CH
TESTAL,08H;检测是否扫描到第4列
JZKERR;是则跳回到开始处
ROLAL,1;没检测到第4列则准备检测下一列
MOVCH,AL
JMPCOLUM
KERR:
JMPBEGIN
CCSCANPROCNEAR;扫描是否有按键闭合子程序
MOVAL,1H
MOVDX,MY8255_A;将4列全选通,X1~X4置0
OUTDX,AL
MOVDX,MY8255_C
INAL,DX;读Y1~Y4
NOTAL
ANDAL,0FH;取出Y1~Y4的反值
RET
CCSCANENDP
CLEARPROCNEAR;清除数码管显示子程序
MOVDX,MY8255_B;段位置0即可清除数码管显示
MOVAL,00H
OUTDX,AL
RET
CLEARENDP
DISPROCNEAR;显示键值子程序
PUSHAX;以缓冲区存放的键值为键值表偏移找到键值并显示
MOVSI,OFFSETTIMETABLE
MOVCX,SI
ADDCX,1
ADDSI,5
MOVDL,0DFH
MOVAL,DL
AGAIN:
PUSHDX
MOVDX,MY8255_A
OUTDX,AL;设置X1~X4,选通一个数码管
MOVAL,[SI];取出缓冲区中存放键值
MOVBX,OFFSETDTABLE
ANDAX,00FFH
ADDBX,AX
MOVBL,[BX]
CMPSI,CX
JNECOMER
ORBL,80H
COMER:
MOVAL,BL;将键值作为偏移和键值基地址相加得到相应的键值
MOVDX,MY8255_B
OUTDX,AL;写入数码管A~Dp
CALLDALLY
DECSI;取下一个键值
POPDX
MOVAL,DL
TESTAL,01H;判断是否显示完?
JZOUT1;显示完,返回
RORAL,1
MOVDL,AL
JMPAGAIN;未显示完,跳回继续
OUT1:
POPAX
RET
DISENDP
DALLYPROCNEAR;软件延时子程序
PUSHCX
MOVCX,00FFH
D1:
MOVAX,00FFH
D2:
DECAX
JNZD2
LOOPD1
POPCX
RET
DALLYENDP
;设置十位分钟加子程序
SETTMADDPROCNEAR
ADDTENMINT,1
MOVAL,TENMINT
MOVSI,0
MOVTIMETABLE[SI],AL
RET
SETTMADDENDP
;设置个位分钟加子程序
SETMADDPROCNEAR
ADDMINT,1
MOVAL,MINT
MOVSI,1
MOVTIMETABLE[SI],AL
RET
SETMADDENDP
;设置十位秒加子程序
SETTSADDPROCNEAR
ADDTENSEC,1
MOVAL,TENSEC
MOVSI,2
MOVTIMETABLE[SI],AL
RET
SETTSADDENDP
;设置个位秒加子程序
SETSADDPROCNEAR
ADDSEC,1
MOVAL,SEC
MOVSI,3
MOVTIMETABLE[SI],AL
RET
SETSADDENDP
;设置十位分钟减子程序
SETTMSUBPROCNEAR
SUBTENMINT,1
MOVAL,TENMINT
MOVSI,0
MOVTIMETABLE[SI],AL
RET
SETTMSUBENDP
;设置个位分钟减子程序
SETMSUBPROCNEAR
SUBMINT,1
MOVAL,MINT
MOVSI,1
MOVTIMETABLE[SI],AL
RET
SETMSUBENDP
;设置十位秒减子程序
SETTSSUBPROCNEAR
SUBTENSEC,1
MOVAL,TENSEC
MOVSI,2
MOVTIMETABLE[SI],AL
RET
SETTSSUBENDP
;设置个位秒减子程序
SETSSUBPROCNEAR
SUBSEC,1
MOVAL,SEC
MOVSI,3
MOVTIMETABLE[SI],AL
RET
SETSSUBENDP
;电子表复位子程序
CLEARCLOCKPROCNEAR
MOVTENMINT,0
MOVMINT,0
MOVTENSEC,0
MOVSEC,0
MOVSI,0
MOVTIMETABLE[SI],0
INCSI
MOVTIMETABLE[SI],0
INCSI
MOVTIMETABLE[SI],0
INCSI
MOVTIMETABLE[SI],0
RET
CLEARCLOCKENDP
CODEENDS
ENDSTART
五、心得体会
在设计刚开始时,我们只是知道要用8254完成计数,用8255与数码管单元完成显示功能,但是具体怎么实现的还不是很清楚。
在接下来的一小段时间里,我们觉得无从下手,但通过自己耐心搜集资料,向老师和同学请教,慢慢理出了头绪,也有了自己的设计思想和设计框架,并有了一定的实现方法。
对于设计题目来说,并非那么得复杂,但要设计者将所学转换成相应的实际应用却并非一件容易的事情。
本设计题目的设计思想是简单的,只需要使用8254完成计数,用8255与数码管单元完成显示功能,并通过自己的理解附加一些功能片段来完成电子表的人性化功能设计,如电子表的校准、电子表的开始、停止、清零等功能。
在课程设计过程中,我深刻地体会到:
《微机原理与接口技术》这门课程对于我们的要求不仅限于对书本知识的理解,更重要的是对书本知识的运用。
除此之外,我们应该在学习过程中充分发挥自己的想象力和创新意识,将对书本知识的理解与我们的创新意识相结合,设计出实用且功能良好的实物。
通过本次课程设计,也提高了我们的编程能力、协作能力和创新能力,为以后的学习打下了良好的基础。
参考文献
[1]郭兰英祥模,《微机原理与接口技术》清华大学
[2]荣祥,《微型计算机原理》,中国电力
[3]会敏晋惠,《微型计算机原理及接口技术应用》,科学
评语
评语