⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mainx.asm

📁 十字路口交通灯管理 现对交通信号灯进行管理
💻 ASM
字号:
DATA SEGMENT
KEEP_CS  DW ?                  ;保存ic号中断向量原来的段基址
KEEP_IP  DW ?                  ;保存ic号中断向量原来的偏移量  
COUNT    DB 20                 ;中断次数计数单元,计20次为一秒
SWIT DB 040H                   ;保存8位开关状态
STR1 DB '0','0','$'            ;保存主干道车的数量
STR2 DB  '0','0','$'           ;保存支干道车的数量
MTIM1 DB 30H                   ;主干道秒倒数计数单元十位
MTIM2 DB 30H                   ;主干道秒倒数计数单元个位
STIM1 DB 30H                   ;支干道秒倒数计数单元十位  
STIM2 DB 30H                   ;支干道秒倒数计数单元个位
MCOL  DB 02H                   ;主干道红绿灯颜色,默认为绿色
MCOL1 DB 8                     ;主干道红灯颜色,默认为灰色(即此时灯是灭的,下同)
MCOL2 DB 8                     ;主干道黄灯颜色,默认为灰色
MCOL3 DB 2                     ;主干道绿灯颜色,默认为绿色
SCOL  DB 04H                   ;支干道红绿灯颜色,默认为红色
SCOL1 DB 4                     ;支干道红灯颜色,默认为红色
SCOL2 DB 8                     ;支干道黄灯颜色,默认灰色
SCOL3 DB 8                     ;支干道绿灯颜色,默认灰色
SW1   DB 4                     ;开关1对应的颜色,默认红色(红色代表断开,绿色闭合,下同)
SW2   DB 4                     ;开关2对应的颜色,默认红色
SW3   DB 4                     ;开关3对应的颜色,默认红色
SW4   DB 4                     ;开关4对应的颜色,默认红色
SW5   DB 4                     ;开关5对应的颜色,默认红色
SW6   DB 4                     ;开关6对应的颜色,默认红色
SW7   DB 4                     ;开关7对应的颜色,默认红色
SW8   DB 4                     ;开关8对应的颜色,默认红色
RED   EQU 04H                  ;红色的颜色代码
GRE   EQU 02H                  ;绿色的颜色代码
YEL   EQU 0EH                  ;黄色的颜色代码
DATA ENDS

STACK1 SEGMENT PARA STACK 'STACK'
       DB 256 DUP(0)
STACK1 ENDS

CODE SEGMENT
          ASSUME CS:CODE,DS:DATA,SS:STACK1
START:    MOV AX,DATA
          MOV DS,AX             ;数据段段基址
          MOV AX,0012H          ;设置屏幕工作方式:12号640*480图形16色
          INT 10H
          mov dx,20bh
          mov al, 89h
          out dx,al

CHSWIT  MACRO X
        LOCAL CHSX,CHSEX
        MOV AL,SWIT
        NOT AL
        MOV DL,01H
        ROL DL,X-1
        TEST  AL,DL
        JZ  CHSX
        MOV SW&X,4
        JMP CHSEX
CHSX:    MOV SW&X,2
CHSEX:   ENDM                 ;宏定义,将swit中第x位的开关状态转变为sw2~sw8中的颜色值

          CLI                 ;关中断
          MOV AL,1CH
          MOV AH,35H
          INT 21H
          MOV KEEP_CS,ES
          MOV KEEP_IP,BX      ;保护1ch原来的中断向量
          MOV AL,1CH
          MOV AH,25H
          MOV DX,SEG CLOCK
          MOV DS,DX
          MOV DX,OFFSET CLOCK 
          INT 21H             ;将clock作为1ch新的中断服务程序

          MOV AX,DATA
          MOV DS,AX           ;恢复ds值

          MOV AL,36H
          OUT 43H,AL
          MOV AX,59660
          OUT 40H,AL
          MOV AL,AH
          OUT 40H,AL
          MOV AL,0FCH
          OUT 21H,AL          ;板载8254初始化,方式3,50ms中断一次
          
          CALL DISP1          ;显示背景画面,十字路口
          STI                 ;开中断

MAIN:     MOV AX,DATA
          MOV DS,AX
          CMP COUNT,00H
          JZ CHANG            ;count归零表示1秒计时到,调用clock1修改显示的时钟
          mov dx,20ah
          in al,dx
          MOV SWIT,AL

          CALL CC             ;根据swit(开关状态)修改各状态变量的值

          CALL CHANG2         ;根据mcol,scol等变量,修改其他变量.
          CALL DISP           ;调用显示子程序

          MOV AH,0BH
          INT 21H
          CMP AL,0FFH
          JZ EXIT          
          JMP MAIN            ;扫描键盘,若有键按下则退出

CHANG:   CALL CLOCK1
         JMP MAIN

EXIT:     CLI                 ;关中断
          MOV AL,1CH
          MOV AH,25H
          MOV BX,KEEP_CS
          MOV DX,KEEP_IP
          MOV DS,BX
          INT 21H             ;恢复原来的中断向量
          STI
          MOV AH,4CH
          INT 21H             ;退出

CLOCK PROC FAR                ;中断服务程序,将count减一,若归零则重新赋值20
           PUSH AX
           PUSH BX
           PUSH CX
           PUSH DX
           MOV AX,DATA
           MOV DS,AX
           CMP COUNT,00H
           JZ  CT00
           DEC COUNT

CBACK:     MOV AL,20H
           OUT 20H,AL
          
           POP DX
           POP CX
           POP BX
           POP AX             
           IRET
CT00:      MOV COUNT,20
           JMP CBACK
CLOCK ENDP

CLOCK1 PROC NEAR                  ;每过一秒修改一次倒计时单元
           CMP MTIM2,30H
           JZ  MT20
           DEC MTIM2
MBACK:     CMP STIM2,30H
           JZ  ST20
           DEC STIM2
SBACK:     MOV COUNT,20
           RET

MT20:      CMP MTIM1,30H
           JZ  MT10
           DEC MTIM1
           MOV MTIM2,39H
MT10:      JMP MBACK

ST20:      CMP STIM1,30H
           JZ  ST10
           DEC STIM1
           MOV STIM2,39H
ST10:      JMP SBACK
CLOCK1 ENDP         

DISP PROC NEAR
          MOV BH,00H

          MOV DH,4
          MOV DL,37
          MOV AH,02H
          INT 10H                  ;光标定位(下同)
          MOV BL,SW4
          MOV AX,091EH
          MOV CX,1
          INT 10H                  ;显示4个主线开关状态

          MOV DH,4
          MOV DL,39
          MOV AH,02H
          INT 10H                 
          MOV BL,SW3
          MOV AX,091EH
          MOV CX,1
          INT 10H
          
          MOV DH,4
          MOV DL,41
          MOV AH,02
          INT 10H                 
          MOV BL,SW2
          MOV AX,091EH
          MOV CX,1
          INT 10H
          
          MOV DH,4
          MOV DL,43
          MOV AH,2
          INT 10H
          MOV BL,SW1
          MOV AX,091EH
          MOV CX,1
          INT 10H
          
          MOV DH,6
          MOV DL,39
          MOV AH,02H
          INT 10H             ;光标定位
          LEA DX,STR1
          MOV AH,09H
          INT 21H             ;显示主干道车的数目
          
          MOV DH,8
          MOV DL,37
          MOV AH,02H
          INT 10H             ;光标定位
          MOV BL,MCOL1
          MOV AX,0903H
          MOV CX,01H
          INT 10H             ;显示主干道3个红绿灯的颜色

          MOV DH,8
          MOV DL,39
          MOV AH,02H
          INT 10H
          MOV BL,MCOL2
          MOV AX,0903H
          MOV CX,01H
          INT 10H
          
          MOV DH,8
          MOV DL,41
          MOV AH,02H
          INT 10H
          MOV BL,MCOL3
          MOV AX,0903H
          MOV CX,01H
          INT 10H
                  
          MOV DH,8            ;显示主干道秒倒计时器
          MOV DL,43
          MOV AH,02H
          INT 10H         
          MOV BL,MCOL 
          MOV AL,MTIM1
          MOV CX,1
          MOV AH,09H
          INT 10H
          INC DX
          MOV AH,02H
          INT 10H
          MOV AL,MTIM2
          MOV CX,1
          MOV AH,09H
          INT 10H

          MOV DH,14          ;显示4个支线开关状态
          MOV DL,11
          MOV AH,02H
          INT 10H
          MOV BL,SW8
          MOV AX,091EH
          MOV CX,1
          INT 10H

          MOV DH,14
          MOV DL,13
          MOV AH,02H
          INT 10H
          MOV BL,SW7
          MOV AX,091EH
          MOV CX,1
          INT 10H

          MOV DH,14
          MOV DL,15
          MOV AH,02H
          INT 10H
          MOV BL,SW6
          MOV AX,091EH
          MOV CX,1
          INT 10H

          MOV DH,14
          MOV DL,17
          MOV AH,02H
          INT 10H
          MOV BL,SW5
          MOV AX,091EH
          MOV CX,1
          INT 10H

          MOV DH,14           ;显示支线车的数目
          MOV DL,19
          MOV AH,02H
          INT 10H
          LEA DX,STR2
          MOV AH,09H
          INT 21H
       
          MOV BL,SCOL         ;显示支线秒倒计时器
          MOV DH,14
          MOV DL,23
          MOV AH,02H
          INT 10H
          MOV AL,STIM1
          MOV CX,1
          MOV AH,09H
          INT 10H
          INC DX
          MOV AH,02H
          INT 10H
          MOV AH,09H
          MOV AL,STIM2
          MOV CX,1
          INT 10H

          MOV DH,12          ;显示支线3个红绿灯颜色
          MOV DL,27
          MOV AH,02H
          INT 10H
          MOV BL,SCOL1
          MOV AX,0903H
          MOV CX,01H
          INT 10H

          MOV DH,14
          MOV DL,27
          MOV AH,02H
          INT 10H
          MOV BL,SCOL2
          MOV AX,0903H
          MOV CX,01H
          INT 10H

          MOV DH,16
          MOV DL,27
          MOV AH,02H
          INT 10H
          MOV BL,SCOL3
          MOV AX,0903H
          MOV CX,01H
          INT 10H
                         
          RET
DISP ENDP
DISP1 PROC NEAR               ;屏幕背景初始化程序,显示十字路口
          MOV BH,00H    

          MOV DX,0            ;显示主干道的上半部分
LINESTART:MOV CX,240
LINESCAN: MOV AX,0C03H
          INT 10H
          CMP CX,410
          JZ  NEXTL
          INC CX
          JMP LINESCAN
NEXTL:    INC DX
          CMP DX,175
          JZ S2
          JMP LINESTART
S2:       MOV CX,00H         ;显示支线
S2SCAN:   MOV AX,0C03H
          INT 10H
          CMP CX,639
          JZ  NEXTL2
          INC CX
          JMP S2SCAN
NEXTL2:   INC DX
          CMP DX,295
          JZ  S3
          JMP S2
S3:       MOV CX,240         ;显示主干道的下半部分
S3SCAN:   MOV AX,0C03H
          INT 10H
          CMP CX,410
          JZ  NEXTL3
          INC CX
          JMP S3SCAN
NEXTL3:   INC DX
          CMP DX,479
          JZ  SEND
          JMP S3

SEND:     RET
DISP1 ENDP

CHANG2 PROC NEAR             ;根据mcol,scol,swit的值给其他变量赋值
          MOV AL,SWIT
          AND AL,0FH
          CMP AL,0AH
          JNB  CHNEXT
          ADD AL,30H
          MOV STR1[1],AL
          MOV STR1[0],30H
          JMP CHEX
CHNEXT:   MOV STR1[0],31H
          SUB AL,0AH
          ADD AL,30H
          MOV STR1[1],AL    ;根据swit的值给str1赋主干道车的数目(16进制转化为10进制)

CHEX:     MOV AL,SWIT
          AND AL,0F0H
          ROR AL,4
          CMP AL,0AH
          JNB  CHNEXT2
          ADD AL,30H
          MOV STR2[1],AL
          MOV STR2[0],30H
          JMP CHEX2
CHNEXT2:  MOV STR2[0],31H
          SUB AL,0AH
          ADD AL,30H
          MOV STR2[1],AL    ;给str2赋支线车的数目

CHEX2:   MOV AL,SWIT
         NOT AL
         TEST AL,01H
         JZ CHSW1
         MOV SW1,4
         JMP CHSNEXT
CHSW1:   MOV SW1,2          ;根据swit值,给显示的开关赋颜色值
CHSNEXT: CHSWIT 2
         CHSWIT 3
         CHSWIT 4
         CHSWIT 5
         CHSWIT 6
         CHSWIT 7
         CHSWIT 8           ;宏调用,给其他几个开关赋颜色值

         MOV AL,MCOL
         CMP AL,2
         JZ CMCOG
         JMP CHECKR
CMCOG:   MOV MCOL1,8
         MOV MCOL2,8
         MOV MCOL3,2
CHECKR:  MOV AL,MCOL
         CMP AL,4
         JZ  CMCOR
         JMP CHECKY
CMCOR:   MOV MCOL1,4
         MOV MCOL2,8
         MOV MCOL3,8
CHECKY:  MOV AL,MCOL
         CMP AL,0EH
         JZ CMCOLY
         JMP CHECKS
CMCOLY:  MOV MCOL1,8
         MOV MCOL2,0EH
         MOV MCOL3,8       ;根据mcol,给主干道的3个红绿灯赋颜色值

CHECKS:  MOV AL,SCOL
         CMP AL,2
         JZ CSCOG
         JMP CHECKR2
CSCOG:  MOV SCOL1,8
         MOV SCOL2,8
         MOV SCOL3,2
CHECKR2: MOV AL,SCOL
         CMP AL,4
         JZ  CSCOR
         JMP CHECKY2
CSCOR:   MOV SCOL1,4
         MOV SCOL2,8
         MOV SCOL3,8
CHECKY2: MOV AL,SCOL
         CMP AL,0EH
         JZ CSCOLY
         JMP CHECKEND
CSCOLY:  MOV SCOL1,8
         MOV SCOL2,0EH
         MOV SCOL3,8      ;根据scol,给支线的3个红绿灯赋颜色值


CHECKEND:RET
CHANG2 ENDP

CC PROC NEAR              ;根据原来红绿灯的颜色和路上车的数目切换红绿灯状态和秒计时器初值
        MOV AL,MCOL
        CMP AL,GRE
        JE  MG
        MOV AL,MCOL
        CMP AL,YEL
        JE  MY
        MOV AL,MCOL
        CMP AL,RED
        JE  MRX
        JMP CCEND

MG:     MOV AL,SWIT       ;当主干道为红灯时...
        AND AL,0F0H
        ROR AL,4
        CMP AL,3
        JA MG1
        JMP CCEND

MG1:    MOV AL,SWIT
        AND AL,0F0H
        ROR AL,4
        MOV AH,AL
        MOV AL,SWIT
        AND AL,0FH
        CMP AH,AL
        JNA CCEND1

        MOV MCOL,YEL
        MOV MTIM1,30H
        MOV MTIM2,33H
        MOV SCOL,RED
        MOV STIM1,30H
        MOV STIM2,33H
        JMP CCEND

MRX:    JMP MR

MY:     CMP MTIM1,30H     ;当主干道为黄灯时...
        JNE CCEND1
        CMP MTIM2,30H
        JNE CCEND1

        MOV MCOL,RED
        MOV MTIM1,32H
        MOV MTIM2,38H
        MOV SCOL,GRE
        MOV STIM1,32H
        MOV STIM2,35H
        JMP CCEND

CCEND1: JMP CCEND

MR:     MOV AL,SCOL       ;当主干道为红灯时...
        CMP AL,YEL
        JE  MR1


        MOV AL,SWIT
        AND AL,0F0H
        ROR AL,4
        MOV AH,AL
        MOV AL,SWIT
        AND AL,0FH
        CMP AL,4
        JB  MR3
        CMP AH,AL
        JBE MR2

MR3:    CMP STIM1,30H
        JNE CCEND
        CMP STIM2,30H
        JNE CCEND
        MOV SCOL,YEL
        MOV STIM1,30H
        MOV STIM2,33H
        MOV MCOL,RED
        MOV MTIM1,30H
        MOV MTIM2,33H        

        JMP CCEND

MR1:    CMP STIM1,30H
        JNE CCEND
        CMP STIM2,30H
        JNE CCEND
        MOV MCOL,GRE
        MOV SCOL,RED
        JMP CCEND
MR2:    MOV MCOL,RED
        MOV MTIM1,30H
        MOV MTIM2,33H
        MOV SCOL,YEL
        MOV STIM1,30H
        MOV STIM2,33H
        JMP CCEND

        JMP CCEND


CCEND:  RET
CC ENDP
CODE ENDS
     END START

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -