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

📄 复件200708311058 jiaotongdeng.asm

📁 一、实验目的 通过并行接口8255实现十字路口交通灯的模拟控制,进一步掌握对并行口的使用。 二、实验内容 如图8-1
💻 ASM
字号:
.model small
.stack
.data
led    db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码
buf    db 3,0         ;存放要显示的十位和个位
;
intseg    dw ?
intoff    dw ?
intimr    db ?
.code
.startup
start:
    mov dx,28bh         ;将8255设为A和C口输出 
    mov al,80h          ;1000 0000b
    out dx,al
    mov al,0            ;关掉数码管显示
    mov dx,288h         ;port C --28ah
    out dx,al
    ;                    
    mov ax,350bh    ;中断设置 --ES:BX  IRQ3
    int 21h
    mov intseg,es
    mov intoff,bx
    
    cli
    push ds
    mov dx,offset intproc
    mov ax,seg intproc
    mov ds,ax
    mov ax,250bh
    int 21h
    pop ds
    
    in al,21h
    mov intimr,al   ;保存原来的中断屏蔽字
    and al,0f7h     ;允许IRQ3
    out 21h,al
    ;
    mov dx,283h      ;向8253写控制字
    mov al,36h       ;使通道0为工作方式3
    out dx,al
    mov ax,1000      ;写入循环计数初值1000
    mov dx,280h
    out dx,al        ;先写入低字节
    mov al,ah
    out dx,al        ;后写入高字节
    ;
    mov dx,283h
    mov al,76h       ;设8253通道1工作方式3
    out dx,al
    mov ax,1000      ;写入循环计数初值1000
    mov dx,281h
    out dx,al        ;先写低字节
    mov al,ah
    out dx,al        ;后写高字节
    ;
    sti

;主程序
        mov dx,28ah
again1:
        in  al,dx
        and al,18h
        or  al,24h
        out dx,al
again11:
        call disp
        cmp buf,0h
        ja  again11
        cmp buf+1,0h
        ja  again11

        mov cx,5
        mov buf,0
        mov buf+1,3
again12:        
        cmp cx,0
        jne again121
        mov cx,5
        in  al,dx
        and al,0dfh
        xor al,40h
        out dx,al
again121:
        call disp
        dec cx
        cmp buf,3h
        jne again12
        cmp buf+1,0h
        jne again12
        ;
        
again2:
        in  al,dx
        and al,18h
        or  al,81h
        out dx,al
again21:
        call disp
        cmp buf,0h
        ja  again21
        cmp buf+1,0h
        ja  again21

        mov cx,5
        mov buf,0
        mov buf+1,3
again22:
        cmp cx,0
        jne again221
        mov cx,5
        in  al,dx
        and al,0feh
        xor al,02h
        out dx,al
again221:
        call disp
        dec cx
        cmp buf,3h
        jne again22
        cmp buf+1,0h
        jne again22
        jmp again1
;
    
;显示程序
disp  proc
    push ax
    push bx
    push cx
    push dx
    
    mov bl,buf      ;bl为要显示的数
    mov bh,0
    mov al,led[bx]  ;求出对应的led数码
    mov dx,288h     ;自8255A的口输出
    out dx,al
    mov dx,28ah     ;使左边的数码管亮
    in  al,dx
    or  al,10h
    out dx,al
    mov cx,3000      ;延时
delay1:
    loop delay1
    ;
    mov dx,28ah      ;关掉数码管显示
    in  al,dx
    and al,0efh
    out dx,al
     ;
    mov bl,buf+1      ;bl为要显示的数
    mov bh,0
    mov al,led[bx]    ;求出对应的led数码
    mov dx,288h       ;自8255A的口输出
    out dx,al
    mov dx,28ah         ;使右边的数码管亮
    in  al,dx
    or  al,08h
    out dx,al
    mov cx,3000       ;延时
delay2:
    loop delay2
    ;
    mov dx,28ah     ;关掉数码管显示
    in  al,dx
    and al,0f7h
    out dx,al
    ;
    mov  ah,0bh
    int  21h
    test al,al
    je  retp         ;无键按下则正常退出显示程序
                    ;有键按下退出所有程序
    mov al,0          ;关掉数码管显示
    mov dx,28ah
    out dx,al
    cli
    mov al,intimr
    out 21h,al
    mov dx,intoff
    mov ax,intseg
    mov ds,ax
    mov ax,250bh
    int 21h
    sti
    .exit          ;返回
retp:
    pop dx
    pop cx
    pop bx
    pop ax
    ret
disp  endp

;0bh的定时中断服务程序
intproc proc
        sti
        push ax
        push ds
        ;
        mov ax,@data
        mov ds,ax
        ;
        mov al,buf+1    ;秒数减1
        mov ah,buf
        cmp al,0
        ja  intp3
        cmp ah,0
        ja  intp2
        mov ah,3
        jmp intp1
intp2:
        dec ah
        mov al,9
        jmp intp1
intp3:
        dec al
intp1:
        mov buf+1,al
        mov buf,ah
        ;
        mov al,20h
        out 20h,al
        pop ds
        pop ax
        iret
intproc endp
    end

⌨️ 快捷键说明

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