汇编实现交通灯控制模拟程序设计.docx
《汇编实现交通灯控制模拟程序设计.docx》由会员分享,可在线阅读,更多相关《汇编实现交通灯控制模拟程序设计.docx(27页珍藏版)》请在冰豆网上搜索。
汇编实现交通灯控制模拟程序设计
使用方法:
使用win-masm运行后,首先输入个任意的两位数表示红灯亮的时间如05或99,然后输入个其他任意字符来作为分隔,接着输入个任意的小于红灯的两位数表示红灯亮的时间如03或98等等来表示黄灯亮的时间,绿灯亮的时间为红灯的时间减去黄灯的时间。
输入后开始工作。
当输入9时进入手动控制状态,接着可分别输入1,2,3,4,5,6,来点亮各方向的灯,输入a,b,c,d,e,f分别灭各方向灯。
输入7时返回自动控制状态。
当输入0时,则进入夜间状态,黄灯开始闪烁。
当输入8时进入紧急状态,个方向红灯亮起。
后两个状态没有做返回到自动控制的功能。
STACKSEGMENTSTACK
DW64DUP(0)
STACKENDS
DATASEGMENT
STRING0DB13,10,3DUP(9,20H),6DUP(20H),'+',12DUP(20H),'+$'
STRING1DB13,10,3DUP(9,20H),'=======***=======$';上面一行
STRING2DB13,10,3DUP(9,20H),6DUP(20H),'*',12DUP(20H),'*$';一个制表等于7个空格
STRING3DB13,10,3DUP(9,20H),'=======******=======$';下面一行
STRTIMEDB13,10,4DUP(9,20H),'TIME:
S$';显示时间的格式
STRSHOWDB13,10,2DUP(9,20H),'SHOWTIME:
$'
STRREDDB13,10,2DUP(9,20H),'REDLIGHT(S),YELLOWLIGHT(S):
$'
STRBLUEDB13,10,2DUP(9,20H),'BLUELIGHT(S)=REDLIGHT(S)-YELLOWLIGHT(S)$'
REDDB35H,30H;红灯亮的时间
BLUEDB33H,30H;绿灯亮的时间
YELLOWDB32H,30H;黄灯亮的时间
SAVEDB35H,30H,?
32H,30H;初始红,黄两种灯亮的时间
COLOUR_CHANGEDB01H;COLOUR_CHANGE为1时,表示南北红灯亮。
为0表示东西
SAVE_RED_NBDB?
;南北方向
SAVE_YELLOW_NBDB?
SAVE_BLUE_NBDB?
SAVE_RED_DXDB?
;东西方向
SAVE_YELLOW_DXDB?
SAVE_BLUE_DXDB?
DATAENDS
CODESEGMENT
ASSUMECS:
CODE,DS:
DATA,SS:
STACK
START:
MOVAX,DATA
MOVDS,AX
MOVBYTEPTRSAVE_RED_NB,04H;红色
MOVBYTEPTRSAVE_YELLOW_NB,07H;白色·
MOVBYTEPTRSAVE_BLUE_NB,07H
MOVBYTEPTRSAVE_RED_DX,07H
MOVBYTEPTRSAVE_YELLOW_DX,0EH;黄色
MOVBYTEPTRSAVE_BLUE_DX,07H
MOVSI,OFFSETSTRING0
MOVCX,3
ROAD1:
CALLSHOW;设置南北方向的道路
LOOPROAD1
MOVSI,OFFSETSTRING1
CALLSHOW
MOVSI,OFFSETSTRING2
MOVCX,5
NEXT:
CALLSHOW
LOOPNEXT
MOVSI,OFFSETSTRING3
CALLSHOW
MOVSI,OFFSETSTRING0
MOVCX,3
ROAD2:
CALLSHOW;设置南北方向的道路
LOOPROAD2
MOVSI,OFFSETSTRTIME
CALLSHOW
MOVSI,OFFSETSTRSHOW
CALLSHOW
MOVSI,OFFSETSTRRED
CALLSHOW
MOVSI,OFFSETSTRBLUE
CALLSHOW
CALLNORTH_RED;设置北边的红灯
CALLNORTH_YELLOW;设置北边的黄灯
CALLNORTH_BLUE;设置北边的绿灯
CALLWEST_BLUE;设置西边的绿灯
CALLWEST_YELLOW;设置西边的黄灯
CALLWEST_RED;设置西边的红灯
CALLEAST_RED;设置东边的红灯
CALLEAST_YELLOW;设置东边黄灯
CALLEAST_BLUE;设置东边的绿灯
CALLSOUTH_BLUE;设置南边绿灯
CALLSOUTH_YELLOW;设置南边的黄灯
CALLSOUTH_RED;设置南边的红灯
MOVDH,16
MOVDL,46
MOVAH,02H;设置光标位置
INT10H
MOVAH,00H;从键盘读入字符
INT16H
MOVAH,09;按当前指定属性显示
MOVBH,0
MOVBL,SAVE_RED_NB;红色
MOVCX,01;字符重复一次
INT10H
MOVBYTEPTR[SAVE+1],AL;输入红灯亮时间十位放在高地址
MOVCX,0FFFFH
DELAY:
LOOPDELAY
MOVDH,16
MOVDL,47
MOVAH,2;设置光标位置
INT10H
MOVAH,00H
INT16H
MOVAH,09
MOVBH,0
MOVBL,SAVE_RED_NB;红色
MOVCX,01
INT10H
MOVBYTEPTR[SAVE],AL;输入红灯点亮时间的个位放在低地址
MOVCX,0FFFFH
DELAY1:
LOOPDELAY1
MOVDH,16
MOVDL,48
MOVAH,2
INT10H
MOVAH,00H
INT16H
MOVAH,09
MOVBH,0
MOVBL,SAVE_RED_NB;红色
MOVCX,01
INT10H
MOVBYTEPTR[SAVE+2],AL;在红黄亮灯时间中间可以输入字符加以区分
MOVCX,0FFFFH
DELAY2:
LOOPDELAY2
MOVDH,16
MOVDL,49
MOVAH,2
INT10H
MOVAH,00H
INT16H
MOVAH,09
MOVBH,0
MOVBL,SAVE_RED_NB;红色
MOVCX,01;字符重复一次
INT10H
MOVBYTEPTR[SAVE+4],AL;输入黄灯点亮时间的十位放在高地址
MOVCX,0FFFFH
DELAY3:
LOOPDELAY3
MOVDH,16
MOVDL,50
MOVAH,2
INT10H
MOVAH,00H
INT16H
MOVAH,09
MOVBH,0
MOVBL,SAVE_RED_NB;红色
MOVCX,01;字符重复一次
INT10H
MOVBYTEPTR[SAVE+3],AL;输入黄灯点亮时间的个位放在低地址
MOVAL,[SAVE]
MOVBYTEPTR[RED],AL;将输入红灯点亮的时间送入红灯亮的时间
MOVAL,[SAVE+1]
MOVBYTEPTR[RED+1],AL
MOVAL,[SAVE+3]
MOVBYTEPTR[YELLOW],AL;将黄灯点亮的时间送入红灯亮的时间
MOVAL,[SAVE+4]
MOVBYTEPTR[YELLOW+1],AL
MOVBYTEPTR[SAVE+3],30H;将输入黄灯点亮时间清零
MOVBYTEPTR[SAVE+4],30H
A1:
MOVDI,OFFSETRED;红灯亮的时间送DI
MOVSI,OFFSETSAVE
COUNT:
MOVAH,01H;读取键盘状态
INT16H
JNZCONTRL;如果有键盘输入,进入手动控制
AUTO:
MOVDH,14;如果没有键盘输入,进入自动状态
MOVDL,38
MOVAH,2
INT10H;置光标位置
MOVAH,09;在当前光标处按指定属性显示
MOVAL,[DI+1];将红灯点亮时间高位送AL并显示
MOVBH,0
MOVBL,09H;设置颜色
MOVCX,01
INT10H
MOVDH,14;时间的位置
MOVDL,39
MOVAH,2
INT10H
MOVAL,[DI];将红灯点亮时间低位送AL并显示
MOVAH,09
INT10H
MOVAH,01H;隐藏光标
MOVCX,2000H
INT10H
PUSHAX
PUSHBX
PUSHDX
PUSHCX
MOVAH,00H
INT1AH
ADDDL,18;18是一秒跳的次数
MOVBL,DL
LOP:
MOVAH,00H;读取当前DL中的值
INT1AH
CMPDL,BL
JNZLOP;小于一秒,继续计数
INCWORDPTR[SI+3];每过一秒,黄灯亮的时间加1
MOVCX,WORDPTR[SI+3]
CMPWORDPTR[YELLOW],CX;将当前黄灯时间与设定黄灯时间比较
JZBIANLV;若相等,绿灯变绿
BACK1:
DECBYTEPTR[DI];倒计时减一
CMPBYTEPTR[DI],30H;红灯时间的个位和0比较
JBCARRY_RED;小于0,转到借位
POPCX
POPDX
POPBX
POPAX
JMPCOUNT;读取键盘状态
BIANLV:
TESTBYTEPTR[COLOUR_CHANGE],00000001B
JZNB_BLUE;为0,表示南北绿灯亮
MOVBYTEPTR[SAVE_BLUE_DX],0AH;为1时,东西方向绿灯亮
MOVBYTEPTR[SAVE_BLUE_NB],07H
MOVBYTEPTR[SAVE_YELLOW_DX],07H
MOVBYTEPTR[SAVE_YELLOW_NB],07H
NEW_BLUE:
CALLNORTH_BLUE;设置北边的绿灯
CALLWEST_BLUE;设置西北的绿灯
CALLEAST_BLUE;设置东边的绿灯
CALLSOUTH_BLUE;设置南边的绿灯
CALLNORTH_YELLOW;设置北边的黄灯
CALLWEST_YELLOW;设置西边的黄灯
CALLEAST_YELLOW;设置东边的黄灯
CALLSOUTH_YELLOW;设置南边的黄灯
JMPBACK1
NB_BLUE:
MOVBYTEPTR[SAVE_BLUE_NB],0AH;南北方向的绿灯置为绿色
MOVBYTEPTR[SAVE_BLUE_DX],07H
MOVBYTEPTR[SAVE_YELLOW_NB],07H
MOVBYTEPTR[SAVE_YELLOW_DX],07H
JMPNEW_BLUE
CARRY_RED:
MOVBYTEPTR[DI],39H;红灯亮的时间个位置9
SUBBYTEPTR[DI+1],1;红灯亮的时间十位减1
CMPBYTEPTR[DI+1],30H;十位和零作比较
JBRESTART;红灯倒计时结束,重新计时
POPCX
POPDX
POPBX
POPAX
JMPCOUNT
RESTART:
MOVCL,[SI];红灯的低位送CL
MOVBYTEPTR[DI],CL
MOVCL,[SI+1]
MOVBYTEPTR[DI+1],CL
MOVBYTEPTR[SI+3],30H
MOVBYTEPTR[SI+4],30H
MOVBYTEPTR[SAVE_BLUE_NB],07H
MOVBYTEPTR[SAVE_BLUE_DX],07H
XORBYTEPTR[COLOUR_CHANGE],00000001B;对COLOUR_CHANGE最低位取反
TESTBYTEPTR[COLOUR_CHANGE],00000001B
JNZNB_RED;为1,南北红灯亮
MOVBYTEPTR[SAVE_RED_NB],07H;南北方向红灯灭
MOVBYTEPTR[SAVE_RED_DX],04H;东西方向红灯亮
MOVBYTEPTR[SAVE_YELLOW_NB],0EH;南北方向黄灯亮
NEW_RED:
CALLNORTH_RED;设置北边红灯
CALLWEST_RED;设置西边的红灯
CALLEAST_RED;设置东边红灯
CALLSOUTH_RED;设置南边的红灯
CALLNORTH_YELLOW;设置北边的黄灯
CALLWEST_YELLOW;设置西边的黄灯
CALLEAST_YELLOW;设置东边的黄灯
CALLSOUTH_YELLOW;设置南边的黄灯
CALLNORTH_BLUE;设置北边的绿灯
CALLWEST_BLUE;设置西边的绿灯
CALLEAST_BLUE;设置东边的绿灯
CALLSOUTH_BLUE;设置南边的绿灯
POPCX
POPDX
POPBX
POPAX
JMPCOUNT
NB_RED:
MOVBYTEPTR[SAVE_RED_NB],04H;南北方向红灯亮
MOVBYTEPTR[SAVE_RED_DX],07H;东西方向红灯灭
MOVBYTEPTR[SAVE_YELLOW_DX],0EH;东西方向黄灯亮
JMPNEW_RED
CONTRL:
CMPAL,39H;判断输入的是否为9,是则进入手动控制
JZHAND_CONTRL
CMPAL,30H;判断是否为0,是则进入夜间状态
JZNIGHT
CMPAL,38H;判断是否为8,是则进入紧急状态
JZUNFAIR
JMPAUTO
HAND_CONTRL:
MOVCX,0FFFFH
DELAYTIME:
LOOPDELAYTIME
MOVCX,0FFFFH
DELAYTIME1:
LOOPDELAYTIME1
MOVCX,0FFFFH
DELAYTIME2:
LOOPDELAYTIME2
MOVAH,00H;从键盘上读入字符
INT16H
CMPAL,37H
JZAUTO;输入字符7时,跳转到自动模式
CMPAL,31H;输入字符1时,东西方向红灯亮
JZDX_RL
CMPAL,61H;输入小写a时,东西方向红灯灭
JZDX_RM
CMPAL,32H;输入字符2时,东西方向黄灯亮
JZDX_YL
CMPAL,62H;输入小写b时,东西方向黄灯灭
JZDX_YM
CMPAL,33H;输入字符3时,东西方向绿灯亮
JZDX_BL
CMPAL,63H;输入小写c时,东西方向绿灯灭
JZDX_BM
CMPAL,34H;输入字符4时,南北方向红灯亮
JZNB_RL
CMPAL,64H;输入小写d时,南北方向红灯灭
JZNB_RM
CMPAL,35H;输入字符5时,南北方向黄灯亮
JZNB_YL
CMPAL,65H;输入小写e时,南北方向黄灯灭
JZNB_YM
CMPAL,36H;输入字符6时,南北方向绿灯亮
JZNB_BL
CMPAL,66H;输入小写f时,南北方向绿灯灭
JZNB_BM
MOVAH,01H;隐藏光标
MOVCX,2000H
INT10H
JMPHAND_CONTRL
DX_RL:
MOVBYTEPTRSAVE_RED_DX,04H;东西方向红灯亮
JMPSHOW_DX_RED
DX_RM:
MOVBYTEPTRSAVE_RED_DX,07H;东西方向红灯灭
SHOW_DX_RED:
CALLWEST_RED;设置西边的红灯
CALLEAST_RED;设置东边的红灯
MOVAH,01H;隐藏光标
MOVCX,2000H
INT10H
JMPHAND_CONTRL
DX_YL:
MOVBYTEPTRSAVE_YELLOW_DX,0EH
JMPSHOW_DX_YELLOW
DX_YM:
MOVBYTEPTRSAVE_YELLOW_DX,07H
SHOW_DX_YELLOW:
CALLWEST_YELLOW;设置西边的黄灯
CALLEAST_YELLOW;设置东边的黄灯
MOVAH,01H;隐藏光标
MOVCX,2000H
INT10H
JMPHAND_CONTRL
DX_BL:
MOVBYTEPTRSAVE_BLUE_DX,0AH
JMPSHOW_DX_BLUE
DX_BM:
MOVBYTEPTRSAVE_BLUE_DX,07H
SHOW_DX_BLUE:
CALLWEST_BLUE;设置西边的绿灯
CALLEAST_BLUE;设置东边的绿灯
MOVAH,01H;隐藏光标
MOVCX,2000H
INT10H
JMPHAND_CONTRL
NB_RL:
MOVBYTEPTRSAVE_RED_NB,04H
JMPSHOW_NB_RED
NB_RM:
MOVBYTEPTRSAVE_RED_NB,07H
SHOW_NB_RED:
CALLNORTH_RED;设置北边的红灯
CALLSOUTH_RED;设置南边的红灯
MOVAH,01H;隐藏光标
MOVCX,2000H
INT10H
JMPHAND_CONTRL
NB_YL:
MOVBYTEPTRSAVE_YELLOW_NB,0EH
JMPSHOW_NB_YELLOW
NB_YM:
MOVBYTEPTRSAVE_YELLOW_NB,07H
SHOW_NB_YELLOW:
CALLNORTH_YELLOW;设置北边的黄灯
CALLSOUTH_YELLOW;设置南边的黄灯
MOVAH,01H;隐藏光标
MOVCX,2000H
INT10H
JMPHAND_CONTRL
NB_BL:
MOVBYTEPTRSAVE_BLUE_NB,0AH
JMPSHOW_NB_BLUE
NB_BM:
MOVBYTEPTRSAVE_BLUE_NB,07H
SHOW_NB_BLUE:
CALLNORTH_BLUE;设置北边的绿灯
CALLSOUTH_BLUE;设置南边的绿灯
MOVAH,01H;隐藏光标
MOVCX,2000H
INT10H
JMPHAND_CONTRL
NIGHT:
MOVBYTEPTRSAVE_BLUE_NB,07H;将所有灯熄灭
MOVBYTEPTRSAVE_BLUE_DX,07H
MOVBYTEPTRSAVE_YELLOW_DX,07H
MOVBYTEPTRSAVE_YELLOW_NB,07H
MOVBYTEPTRSAVE_RED_NB,07H
MOVBYTEPTRSAVE_RED_DX,07H
CALLNORTH_RED;设置北边的红灯
CALLNORTH_BLUE;设置北边的绿灯
CALLWEST_BLUE;设置西边的绿灯
CALLWEST_RED;设置西边的红灯
CALLEAST_RED;设置东边的红灯
CALLEAST_BLUE;设置东边的绿灯
CALLSOUTH_BLUE;设置南边的绿灯
CALLSOUTH_RED;设置南边的红灯
SHANSUO:
CALLNORTH_YELLOW;设置北边的黄灯
CALLWEST_YELLOW;设置西边的黄灯
CALLEAST_YELLOW;设置东边的黄灯
CALLSOUTH_YELLOW;设置南边的黄灯
XORBYTEPTRCOLOUR_CHANGE,00000001B;对COLOUR_CHANGE最低位取反
TESTBYTEPTRCOLOUR_CHANGE,00000001B
JZLIANG
MOVBYTEPTRSAVE_YELLOW_DX,07H
MOVBYTEPTRSAVE_YELLOW_NB,07H
YANSHI:
MOVCX,0FFFFH
DELAYTIME5:
LOOPDELAYTIME5
MOVCX,0FFFFH
DELAYTIME6:
LOOPDELAYTIME6
MOVCX,0FFFFH
DELAYTIME7:
LOOPDELAYTIME7
MOVAH,01H;隐藏光标
MOVCX,2000H
INT10H
JMPSHANSUO
LIANG:
MOVBYTEPTRSAVE_YELLOW_DX,0EH
MOVBYTEPTRSAVE_YELLOW_NB,0EH
JMPYANSHI
UNFAIR:
DELAY8:
LOOPDELAY8
MOVCX,0FFFFH
MOVAX,03H;检查鼠标左键是否按下
INT33H
TESTBX,0000000000000001B;不为零表示按下了鼠标左键
JNZAUTO
MOVBYTEPTRSAVE_RED_NB,04H;南北方向红灯亮
MOVBYTEPTRSAVE_RED_DX,04H;东西方向红灯亮
MO