汇编实现交通灯控制模拟程序设计.docx

上传人:b****2 文档编号:22808738 上传时间:2023-04-28 格式:DOCX 页数:27 大小:18.48KB
下载 相关 举报
汇编实现交通灯控制模拟程序设计.docx_第1页
第1页 / 共27页
汇编实现交通灯控制模拟程序设计.docx_第2页
第2页 / 共27页
汇编实现交通灯控制模拟程序设计.docx_第3页
第3页 / 共27页
汇编实现交通灯控制模拟程序设计.docx_第4页
第4页 / 共27页
汇编实现交通灯控制模拟程序设计.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

汇编实现交通灯控制模拟程序设计.docx

《汇编实现交通灯控制模拟程序设计.docx》由会员分享,可在线阅读,更多相关《汇编实现交通灯控制模拟程序设计.docx(27页珍藏版)》请在冰豆网上搜索。

汇编实现交通灯控制模拟程序设计.docx

汇编实现交通灯控制模拟程序设计

使用方法:

使用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

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 人文社科 > 哲学历史

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1