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

📄 lx.asm

📁 用户可以借助于该程序
💻 ASM
字号:
;模拟交通灯
;宏定义
;>>>>>>>>>>>>清屏>>>>>>>>>>>>>>>>>
clear macro al1,ch1,cl1,dh1,dl1,bh1
            push ax
            push bx
            push cx
            push dx
            
            mov ah,6
            mov al,al1
            mov ch,ch1
            mov cl,cl1
            mov dh,dh1
            mov dl,dl1
            mov bh,bh1
            int 10h
            
            pop dx
            pop cx
            pop bx
            pop ax
endm
;>>>>>>>>>>>>>光标定位>>>>>>>>>>>>>>>>>>>>>>>>
SetGb macro dh1,dl1
     push ax
     push bx
     push dx
     
     mov dh,dh1
     mov dl,dl1
     mov bh,0
     mov ah,02h
     int 10h
     
     pop dx
     pop cx
     pop ax
endm
;>>>>>>>>>>>>>>>>>>提示信息>>>>>>>>>>>>>>>>>>>>>>>    
ShowMess macro mess
     push ax
     push dx
     
     mov ah,09
     lea dx,mess
     int 21h
     
     pop dx
     pop ax
endm 
;>>>>>>>>>>>>输出>>>>>>>>>>>>>>>>>>>>>>>>>>
OutPut macro dl1
       mov ah,02h
       mov dl,dl1
       int 21h
endm
;数据段
data segment
   COUNT    DW 0    ;计时器
   SEC      DW 0
   MIN      DW 0
   HOURS    DW 0
   SAVE_LC  DW 2 DUP(?)
   
   North db 'N$'
   South db 'S$'
   East  db 'E$'
   West  db 'W$'
   tital db 'Welocome to My Programing$'
   
   mess1 db 'Time:$'
   mess2 db 'Designed by LiuXia$'
   mess3 db 'Please press enter to begin!$'
data ends
;代码段
code segment
  assume cs:code,ds:data
start:
  mov ax,data
  mov ds,ax
  
  clear 0,0,0,24,79,7  ;清全屏
  clear 0,8,10,16,60,04h
  SetGb 10,28
  ShowMess mess2
  SetGb 12,24
  ShowMess mess3
 Get:
  mov ah,08h
  int 21h
  cmp al,1bh
  je leave
  cmp al,0dh
  je next
  jmp get
leave:
  jmp exit
next:
  clear 0,0,0,2,79,04h
  SetGb 1,30
  ShowMess tital
  clear 0,2,2,22,77,31h
  
  clear 0,9,10,15,70,74h        ;模拟十字路口
  clear 0,3,35,21,45,74h
                                ;显示东南西北
  SetGb 12,11
  ShowMess West
  SetGb 12,69
  ShowMess East
  SetGb 3,40
  ShowMess North
  SetGb 21,40
  ShowMess South
                                ;输出模拟交通灯和警察
  SetGb 12,40
  OutPut 02h
                                ;上方的交通灯
  clear 0,8,35,9,45,71h         ;改交通灯初始颜色为蓝色
  SetGb 8,37
  OutPut 40h
  SetGb 8,40
  OutPut 40h
  SetGb 8,43
  OutPut 40h
                                ;下方的交通灯
  clear 0,15,35,16,45,71h         ;改交通灯初始颜色为蓝色
  SetGb 16,37
  OutPut 40h
  SetGb 16,40
  OutPut 40h
  SetGb 16,43
  OutPut 40h    
                                ;右方的交通灯
  clear 0,9,45,15,46,71h         ;改交通灯初始颜色为蓝色
  SetGb 10,46
  OutPut 40h
  SetGb 12,46
  OutPut 40h
  SetGb 14,46
  OutPut 40h    
                                ;左方的交通灯
  clear 0,9,34,15,35,71h         ;改交通灯初始颜色为蓝色
  SetGb 10,34
  OutPut 40h
  SetGb 12,34
  OutPut 40h
  SetGb 14,34
  OutPut 40h  
  
     MOV AH,35H      ;将原中断保存在自设单元中
     MOV AL,1CH
     INT 21H
     MOV SAVE_LC,BX
     MOV SAVE_LC+2,ES

     PUSH DS          ;自设中断调用计数器
     MOV DX,SEG CLINT
     MOV DS,DX
     MOV DX,OFFSET CLINT
     MOV AL,1CH
     MOV AH,25H
     INT 21H
     POP DS
         
     IN  AL,21H             ;允许定时器中断 
     AND AL,11111110B
     OUT 21H,AL   
begin:                    
     ;开始 东西先行,再南北
     MOV COUNT,0                    ;计时器  
     MOV SEC,0                      ;将时间各单元计数器,时,分,秒清0
     MOV MIN,0
     MOV HOURS,0  
          ;左方的交通灯
     clear 0,9,34,15,35,72h        ;改交通灯初始颜色为绿色--放行
     SetGb 10,34
     OutPut 40h
     SetGb 12,34
     OutPut 40h
     SetGb 14,34
     OutPut 40h 
          ;右方的交通灯
     clear 0,9,45,15,46,72h         ;改交通灯初始颜色为绿色
     SetGb 10,46
     OutPut 40h
     SetGb 12,46
     OutPut 40h
     SetGb 14,46
     OutPut 40h 
          ;上方的交通灯
     clear 0,8,35,9,45,74h           ;改交通灯初始颜色为红色--禁止通行
     SetGb 8,37
     OutPut 40h
     SetGb 8,40
     OutPut 40h
     SetGb 8,43
     OutPut 40h
          ;下方的交通灯
     clear 0,15,35,16,45,74h         ;改交通灯初始颜色为红色
     SetGb 16,37
     OutPut 40h
     SetGb 16,40
     OutPut 40h
     SetGb 16,43
     OutPut 40h 
  
     MOV DX,35890                 ;时间延迟5秒    通行时间
    aa1:
     MOV CX,65535
    bb1:
     LOOP bb1
     DEC DX
     JNE aa1
   
     SetGb 4,10                     ;输出通行时间 
     ShowMess mess1
     SetGb 5,12
     call DISPTIME
     
     MOV DX,25890                 ;时间延迟1秒 显示通行时间
    aa2:
     MOV CX,5535
    bb2:
     LOOP bb2
     DEC DX
     JNE aa2
     ;开始变黄灯 
     clear 0,4,10,5,20,31h           ;清除上次的时间
     MOV COUNT,0                     ;计时器  
     MOV SEC,0                        ;将时间各单元计数器,时,分,秒清0
     MOV MIN,0
     MOV HOURS,0  
     
         ;左方的交通灯
     clear 0,9,34,15,35,7eh        ;改交通灯初始颜色为黄色--警告
     SetGb 10,34
     OutPut 40h
     SetGb 12,34
     OutPut 40h
     SetGb 14,34
     OutPut 40h 
         ;右方的交通灯
     clear 0,9,45,15,46,7eh         ;改交通灯初始颜色为黄色--警告
     SetGb 10,46
     OutPut 40h
     SetGb 12,46
     OutPut 40h
     SetGb 14,46
     OutPut 40h 
          ;上方的交通灯
     clear 0,8,35,9,45,7eh           ;
     SetGb 8,37
     OutPut 40h
     SetGb 8,40
     OutPut 40h
     SetGb 8,43
     OutPut 40h
          ;下方的交通灯
     clear 0,15,35,16,45,7eh         ; 
     SetGb 16,37
     OutPut 40h
     SetGb 16,40
     OutPut 40h
     SetGb 16,43
     OutPut 40h
     
     MOV DX,35890          ;时间延迟3秒
    aa3:
     MOV CX,35535
    bb3:
     LOOP bb3
     DEC DX
     JNE aa3
     ;开始南北通行 
     clear 0,4,10,5,20,31h          ;清除上次的时间
     MOV COUNT,0                    ;计时器  
     MOV SEC,0                      ;将时间各单元计数器,时,分,秒清0
     MOV MIN,0
     MOV HOURS,0  
     
         ;左方的交通灯
     clear 0,9,34,15,35,74h        ;改交通灯初始颜色为红色
     SetGb 10,34
     OutPut 40h
     SetGb 12,34
     OutPut 40h
     SetGb 14,34
     OutPut 40h 
         ;右方的交通灯
     clear 0,9,45,15,46,74h         ;改交通灯初始颜色为红色--禁止通行
     SetGb 10,46
     OutPut 40h
     SetGb 12,46
     OutPut 40h
     SetGb 14,46
     OutPut 40h 
         ;上方的交通灯
     clear 0,8,35,9,45,72h           ;改交通灯初始颜色为绿色
     SetGb 8,37
     OutPut 40h
     SetGb 8,40
     OutPut 40h
     SetGb 8,43
     OutPut 40h
         ;下方的交通灯
     clear 0,15,35,16,45,72h         ;改交通灯初始颜色为绿色--放行
     SetGb 16,37
     OutPut 40h
     SetGb 16,40
     OutPut 40h
     SetGb 16,43
     OutPut 40h
     
     MOV DX,35890          ;时间延迟5秒
    aa5:
     MOV CX,65535
    bb5:
     LOOP bb5
     DEC DX
     JNE aa5
     
     SetGb 4,10
     ShowMess mess1
     SetGb 5,12
     call DISPTIME
     
     MOV DX,25890          ;时间延迟1秒 显示通行时间
    aa6:
     MOV CX,5535
    bb6:
     LOOP bb6
     DEC DX
     JNE aa6
     
     ;开始变黄灯 
     clear 0,4,10,5,20,31h      ;清除上次的时间
     MOV COUNT,0                 ;计时器  
     MOV SEC,0                   ;将时间各单元计数器,时,分,秒清0
     MOV MIN,0
     MOV HOURS,0  
     
           ;左方的交通灯
     clear 0,9,34,15,35,7eh        ;改交通灯初始颜色为黄色--警告
     SetGb 10,34
     OutPut 40h
     SetGb 12,34
     OutPut 40h
     SetGb 14,34
     OutPut 40h 
           ;右方的交通灯
     clear 0,9,45,15,46,7eh         ;改交通灯初始颜色为黄色
     SetGb 10,46
     OutPut 40h
     SetGb 12,46
     OutPut 40h
     SetGb 14,46
     OutPut 40h 
           ;上方的交通灯
     clear 0,8,35,9,45,7eh           ;
     SetGb 8,37
     OutPut 40h
     SetGb 8,40
     OutPut 40h
     SetGb 8,43
     OutPut 40h
           ;下方的交通灯
     clear 0,15,35,16,45,7eh         ;
     SetGb 16,37
     OutPut 40h
     SetGb 16,40
     OutPut 40h
     SetGb 16,43
     OutPut 40h
     
     MOV DX,35890          ;时间延迟3秒
    aa7:
     MOV CX,65535
    bb7:
     LOOP bb7
     DEC DX
     JNE aa7
     
     mov ah,0bh
     int 21h
     inc al
     je exit
     clear 0,4,10,5,20,31h ;清除上次的时间
     jmp begin
                             
                                      
exit:
  mov ah,4ch
  int 21h
;***************
;中断函数
;***************
CLINT    PROC NEAR     ;自设时间中断子过程
         PUSH DS
         PUSH BX
         MOV BX,DATA
         MOV DS,BX

         LEA BX,COUNT
         INC WORD PTR[BX]
         CMP WORD PTR[BX],18     ;18次中断为1秒
         JNE RETURN1
         CALL INCT                ;调用分秒转换子程序
       ADJ:
         CMP HOURS,12             ;处理"时"
         JLE RETURN1
         SUB HOURS,12
       RETURN1:
         POP BX
         POP DS
         STI
         IRET
CLINT    ENDP
;************** 
;分秒转换子程序
;************** 
INCT     PROC NEAR                                

         MOV WORD PTR[BX],0
         ADD BX,2
         INC WORD PTR[BX]
         CMP WORD PTR[BX],60      ;60秒为1分
         JNE EXIT1
         CALL INCT
       EXIT1:   
         RET
INCT     ENDP
;**************** 
;显示计时器时间
;**************** 
DISPTIME PROC NEAR                               
         
         MOV AX,MIN           ;显示"分"
         CALL BINDECCXC1

         MOV BX,0
         MOV AL,':'
         MOV AH,0EH
         INT 10H
         MOV AX,SEC           ;显示"秒"
         CALL BINDECCXC1

         MOV BX,0
         MOV AL,':'
         MOV AH,0EH
         INT 10H

         MOV BX,COUNT          ;显示"毫秒"
         MOV AL,55
         MUL BL
         CALL BINDECCXC
    RET
DISPTIME    ENDP
;******************** 
;为显示时间而服务的二进制->十进制(3位)
;******************** 
BINDECCXC  PROC  NEAR                            
         MOV CX,100
         CALL DECDIVCXC
         MOV CX,10
         CALL DECDIVCXC
         MOV CX,1
         CALL DECDIVCXC
         RET
BINDECCXC   ENDP
;********************* 
;为显示时间而服务的二进制->十进制(2位)
;********************* 
BINDECCXC1  PROC  NEAR                            
         MOV CX,10
         CALL DECDIVCXC
         MOV CX,1
         CALL DECDIVCXC
         RET
BINDECCXC1   ENDP
;************************** 
;为显示时间而服务的二进制->十进制(1位)
;************************** 
DECDIVCXC   PROC NEAR                             

         MOV DX,0
         DIV CX
         MOV BX,0
         ADD AL,30H
         MOV AH,0EH
         INT 10H
         MOV AX,DX
     RET
DECDIVCXC   ENDP
code ends
     end start

⌨️ 快捷键说明

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