汇编实现交通灯控制模拟程序设计Word下载.docx
《汇编实现交通灯控制模拟程序设计Word下载.docx》由会员分享,可在线阅读,更多相关《汇编实现交通灯控制模拟程序设计Word下载.docx(23页珍藏版)》请在冰豆网上搜索。
绿灯亮的时间
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
ROAD2:
LOOPROAD2
MOVSI,OFFSETSTRTIME
MOVSI,OFFSETSTRSHOW
MOVSI,OFFSETSTRRED
MOVSI,OFFSETSTRBLUE
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;
字符重复一次
MOVBYTEPTR[SAVE+1],AL;
输入红灯亮时间十位放在高地址
MOVCX,0FFFFH
DELAY:
LOOPDELAY
MOVDL,47
MOVAH,2;
MOVAH,00H
MOVAH,09
MOVCX,01
MOVBYTEPTR[SAVE],AL;
输入红灯点亮时间的个位放在低地址
DELAY1:
LOOPDELAY1
MOVDL,48
MOVAH,2
MOVCX,01
MOVBYTEPTR[SAVE+2],AL;
在红黄亮灯时间中间可以输入字符加以区分
DELAY2:
LOOPDELAY2
MOVDL,49
MOVBYTEPTR[SAVE+4],AL;
输入黄灯点亮时间的十位放在高地址
DELAY3:
LOOPDELAY3
MOVDL,50
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;
读取键盘状态
JNZCONTRL;
如果有键盘输入,进入手动控制
AUTO:
MOVDH,14;
如果没有键盘输入,进入自动状态
MOVDL,38
INT10H;
置光标位置
在当前光标处按指定属性显示
MOVAL,[DI+1];
将红灯点亮时间高位送AL并显示
MOVBL,09H;
设置颜色
时间的位置
MOVDL,39
INT10H
MOVAL,[DI];
将红灯点亮时间低位送AL并显示
MOVAH,01H;
隐藏光标
MOVCX,2000H
PUSHAX
PUSHBX
PUSHDX
PUSHCX
INT1AH
ADDDL,18;
18是一秒跳的次数
MOVBL,DL
LOP:
读取当前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;
设置西北的绿灯
设置南边的绿灯
设置东边的黄灯
JMPBACK1
NB_BLUE:
MOVBYTEPTR[SAVE_BLUE_NB],0AH;
南北方向的绿灯置为绿色
MOVBYTEPTR[SAVE_BLUE_DX],07H
JMPNEW_BLUE
CARRY_RED:
MOVBYTEPTR[DI],39H;
红灯亮的时间个位置9
SUBBYTEPTR[DI+1],1;
红灯亮的时间十位减1
CMPBYTEPTR[DI+1],30H;
十位和零作比较
JBRESTART;
红灯倒计时结束,重新计时
JMPCOUNT
RESTART:
MOVCL,[SI];
红灯的低位送CL
MOVBYTEPTR[DI],CL
MOVCL,[SI+1]
MOVBYTEPTR[DI+1],CL
MOVBYTEPTR[SI+3],30H
MOVBYTEPTR[SI+4],30H
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;
设置北边红灯
设置东边红灯
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:
DELAYTIME:
LOOPDELAYTIME
DELAYTIME1:
LOOPDELAYTIME1
DELAYTIME2:
LOOPDELAYTIME2
从键盘上读入字符
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
JMPHAND_CONTRL
DX_RL:
MOVBYTEPTRSAVE_RED_DX,04H;
JMPSHOW_DX_RED
DX_RM:
MOVBYTEPTRSAVE_RED_DX,07H;
SHOW_DX_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:
CALLEAST_YELLOW;
DX_BL:
MOVBYTEPTRSAVE_BLUE_DX,0AH
JMPSHOW_DX_BLUE
DX_BM:
MOVBYTEPTRSAVE_BLUE_DX,07H
SHOW_DX_BLUE:
CALLEAST_BLUE;
NB_RL:
MOVBYTEPTRSAVE_RED_NB,04H
JMPSHOW_NB_RED
NB_RM:
MOVBYTEPTRSAVE_RED_NB,07H
SHOW_NB_RED:
CALLNORTH_RED;
CALLSOUTH_RED;
NB_YL:
MOVBYTEPTRSAVE_YELLOW_NB,0EH
JMPSHOW_NB_YELLOW
NB_YM:
MOVBYTEPTRSAVE_YELLOW_NB,07H
SHOW_NB_YELLOW:
CALLSOUTH_YELLOW;
NB_BL:
MOVBYTEPTRSAVE_BLUE_NB,0AH
JMPSHOW_NB_BLUE
NB_BM:
MOVBYTEPTRSAVE_BLUE_NB,07H
SHOW_NB_BLUE:
CALLSOUTH_BLUE;
NIGHT:
MOVBYTEPTRSAVE_BLUE_NB,07H;
将所有灯熄灭
MOVBYTEPTRSAVE_YELLOW_DX,07H
MOVBYTEPTRSAVE_YELLOW_NB,07H
MOVBYTEPTRSAVE_RED_NB,07H
MOVBYTEPTRSAVE_RED_DX,07H
SHANSUO:
XORBYTEPTRCOLOUR_CHANGE,00000001B;
对COLOUR_CHANGE最低位取反
TESTBYTEPTRCOLOUR_CHANGE,00000001B
JZLIANG
YANSHI:
DELAYTIME5:
LOOPDELAYTIME5
DELAYTIME6:
LOOPDELAYTIME6
DELAYTIME7:
LOOPDELAYTIME7
JMPSHANSUO
LIANG:
MOVBYTEPTRSAVE_YELLOW_DX,0EH
MOVBYTEPTRSAVE_YELLOW_NB,0EH
JMPYANSHI
UNFAIR:
DELAY8:
LOOPDELAY8
MOVAX,03H;
检查鼠标左键是否按下
INT33H
TESTBX,0000000000000001B;
不为零表示按下了鼠标左键
JNZAUTO
MOVBYTEPTRSAVE_RED_DX,04H;
东西方向红灯亮
MO