微机原理课程设计交通灯模拟控制器Word文档格式.docx
《微机原理课程设计交通灯模拟控制器Word文档格式.docx》由会员分享,可在线阅读,更多相关《微机原理课程设计交通灯模拟控制器Word文档格式.docx(12页珍藏版)》请在冰豆网上搜索。
4、显示时间子程序:
将计时单元的二进制转换为十进制数加以显示。
参考资料:
1.《微型计算机接口技术及应用》
2.《汇编语言程序设计》
3.《微型计算机汇编语言程序设计》
一、教科书中关于IBM-PC/XT机系统硬件的内容,包括8250(串行口控制器),8253,8255,8259等。
二、DOS系统功能调用。
INT21H
1、显示
显示单个字符
入参:
AH=02H
DL=字符ASCII值
出参:
无
显示字符串
AH=09H
DS:
DX此寄存器对指向内存中字符串的首地址,字符串以$结束
2、键盘
检查键盘状态
AH=0BH
AL=00H无输入0FFH有一字符
读键盘字符
AH=08H
AL=字符ASCII值
3、其它
退出程序,返回系统
AH=4CH
取中断矢量
AH=35H
AL=中断类型号
出参:
ES:
BX中断矢量,ES为段地址,BX为偏移地址
置中断矢量
AH=25H
DS:
DX中断矢量,DS为段地址,DX为偏移地址
三、BIOS屏幕功能调用。
INT10H
1、清屏操作
MOVAX,0600H
MOVCX,0000H
MOVDX,184FH
MOVBH,07H
2、移动光标
MOVAH,02H
MOVDH,**;
**为目的地行数(0-24)
MOVDL,**;
**为目的地列数(0-79)
MOVBH,00H
3、禁止光标显示
MOVAH,01H
MOVCX,2000H
4、恢复光标显示
MOVCX,0C0DH
本程序由西南科技大学信息工程学院通信08级电子测试实验室李同学提供,包含全部操作过程源代码解释说明
stacksegmentstack
dw64dup(?
)
stackends
showlinemacroSTR,STA,LEN,POS,COL;
显示字符串宏
pushDX
pushBX
pushAX
movBP,OFFSETSTR;
显示起始位置
addBP,STA;
第几个开始
movDX,POS;
位置
movCX,LEN;
长度
movBX,COL;
颜色
movAX,1301H;
字符串显示中断
int10H
popAX
popBX
popDX
endm
delaymacro;
延时一秒
localdloop
pushax
pushbx
pushdx
movah,00H;
BIOS调用
int1aH
adddl,18;
定时1s,需要18个定时单位
movbl,dl
dloop:
movah,00H
int1ah
cmpdl,bl;
是否累计到1s
jnzdloop;
没到,继续读
popdx
popbx
popax
datasegment;
数据定义
timedb20
timesdb20
bufdb'
00'
;
定义交通路口
table01db'
||N'
table02db'
||'
table03db'
table04db'
table05db'
table06db'
W||E'
table07db'
__________________________'
table08db'
table09db'
table10db'
table11db'
table12db'
table13db'
table14db'
||S'
strdb'
pleaseinputtimes:
'
strcldb'
'
flgdb0
dataends
codesegment
assumecs:
code,ds:
data
mainprocfar;
主函数
movax,data
movds,ax
moves,ax
movah,01h;
清除光标
movcx,2000h
int10h
callinitial
funct:
moval,times
movtime,al
N1:
callshowtime
callgetchar
cmpal,'
r'
调整时间
jneloop1
callchangtime
jmpfunct
loop1:
a'
手动/自动控制状态
jneloop2
callopenclose
loop2:
b'
夜间模式
jneloop3
callnight
loop3:
t'
紧急模式
jneloop4
calltense
loop4:
q'
退出
jneN1
esc:
movah,4ch
int21h
tenseprocnear
movtime,0
movflg,1
calltimebuf
showlinebuf,0,2,0514h,0004h;
红灯;
紧急情况
showlinebuf,0,2,0e10h,0004h;
红灯
showlinebuf,0,2,080bh,0004h;
红灯
showlinebuf,0,2,0c19h,0004h;
tn2:
紧急控制按钮是否按下
jnetn1
tn1:
退出控制按钮是否按下
jnetn2
jmpesc
ret
tenseendp
nightprocnear
calltimebuf
showlinebuf,0,2,0514h,000eh;
黄灯;
夜间显示控制
showlinebuf,0,2,0e10h,000eh;
黄灯
showlinebuf,0,2,080bh,000eh;
黄灯
showlinebuf,0,2,0c19h,000eh;
ng2:
夜间控制按钮是否按下
jneng1
ng1:
jneng2
nightendp
opencloseprocnear;
开关子函数
movtime,0
op:
movflg,0
callshowd
op4:
callgetchar;
调用输入控制字符
o'
手动控制下开
jneop1
jmpop
op1:
c'
手动控制下关
jneop2
callshowd
op2:
jneop3;
jmpesc
op3:
jneop4;
手动/自动控制
jmpfunct
opencloseendp
changtimeprocnear;
改变时间子函数
showlinestrcl,0,2,0043h,000fh
showlinestr,0,19,0030h,000fh
movah,01h
int21h
subal,30h;
将输入时间值转化成
movbl,10输出十进制值
mulbl
movtimes,al
subal,30h
addtimes,al
movtime,al
changtimeendp
showtimeprocnear;
时钟程序
s1:
int16h
jnzs3
delay;
延时一秒
dectime
cmptime,-1
jnes2;
倒计时
incflg
cmpflg,2
jnes2
s2:
jmps1
s3:
ret
showtimeendp
showdprocnear
cmpflg,0
jned1
showlinebuf,0,2,0514h,0002h;
绿灯
showlinebuf,0,2,0e10h,0002h;
jmpd2
d1:
showlinebuf,0,2,080bh,0002h;
showlinebuf,0,2,0c19h,0002h;
d2:
showdendp
timebufprocnear;
显示时间time==>
buf
movdi,offsetbuf
moval,time
movbl,0ah
movah,00h
divbl
addal,30h
addah,30h
movdi[0],al
movdi[1],ah
timebufendp
getcharprocnear;
得到字符
movah,07h
getcharendp
initialprocnear;
初始化交通路口的显示
showlinetable01,0,38,0000h,15
showlinetable02,0,38,0100h,15
showlinetable03,0,38,0200h,15
showlinetable04,0,38,0300h,15
showlinetable05,0,38,0400h,15
showlinetable06,0,38,0500h,15
showlinetable07,0,38,0600h,15
showlinetable08,0,38,0d00h,15
showlinetable09,0,38,0e00h,15
showlinetable10,0,38,0f00h,15
showlinetable11,0,38,1000h,15
showlinetable12,0,38,1100h,15
showlinetable13,0,38,1200h,15
showlinetable14,0,38,1300h,15
initialendp
codeends
endmain