○交通灯设计

DATAS SEGMENT

MESS DB 'TPCA INTERRUPT3!',0DH,0AH,'$'

WARN DB 'WARNING!',0DH,0AH,'$'

TIPS DB '1-night:[n] 2-change light:[c], 3-exigency red light[e]',0DH,0AH,'$'

D8255A EQU 288H ;常量


D8255B EQU 289H

D8255C EQU 28AH

D8255S EQU 28BH

proth EQU 2a0h

protlr EQU 298h

protly EQU 290h

LIGHT DB 34H ; 0011 0100


DB 54h ; 0101 0100


DB 91H ; 1001 0001


DB 92H ; 1001 0010


DB 0FFH

NUM DB 6FH,7FH,07H,7DH,6DH,66H,4FH,5BH,06H,3FH ; 9,8,7,6,5,4,3,2,1,0


TENS DB 5BH,06H,3FH ; 2,1,0


YELLOWNUM DB 5BH,06H,3FH ; 2,1,0


min1 DB 00h,01h,02h,03h,04h,05h,06h,07h

BUFF DB 50H,5FH,52H,10H,0c0H,3fH,90H,50H

MESS1 DB 00H,0F0H,90H,90H,90H,0ffH,00H,00H

DATA ENDS

STACKS SEGMENT

X DB 100 DUP(?)

STACKS ENDS

CODES SEGMENT

ASSUME CS:CODES,DS:DATAS,SS:STACKS

START:

MOV AX,DATAS

MOV DS,AX ; 载入


MOV DX,OFFSET TIPS

MOV AH,09H

INT 21H

;; 设置8254


MOV DX,283h

MOV AL,36h ; 00110110 方式三,方波


OUT DX,AL

MOV AX,1000

MOV DX,280h

OUT DX,AL

MOV AL,AH

OUT DX,AL

MOV DX,283h

MOV AL,76h ; 01110110 方式三,方波


OUT DX,AL

MOV DX,281h

MOV AX,1000

OUT DX,AL

MOV AL,AH

OUT DX,AL

;; 初步设置8259

;; 设置8255


MOV DX,D8255S

MOV AL,80H

OUT DX,AL

MAINLP:

CALL MAIN

JMP MAINLP

EXIT:

MOV AH,4CH

INT 21H

MAIN PROC

MOV BX,0

MOV SI,0

LP1:

MOV DX,D8255C

MOV AL,LIGHT[BX]

CMP AL,0FFH

JZ EX1

OUT DX,AL

CMP AL,91H

JE SHOW_XING

; 其他情况显示"P"


; CALL SHOW_P


CALL DISPLAY_DOT_MATRIX ; 显示点阵字符


INC BX

TEST AL,21H

JZ S1

CALL GREEN

JMP LP1

S1:

CALL YELLOW ; 再次调用{黄色显示}


JMP LP1 ; 循环判断


EX1:

RET

MAIN ENDP

DISPLAY_DOT_MATRIX PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH SI

MOV CX,01H ;共存21组点阵代码,21帧图案


MOV BX,00H

WORDTIMES1:

MOV CX,40H

MOV SI,0

A1:

MOV AH,01H

PUSH CX

MOV CX,8 ; 8x8 点阵


MOV SI,0

NEXT1:

MOV AL,[MESS1+SI+BX] ; 分别得到第1组到第21组行代码首址


MOV DX,2a0H ; 行开始信号 CS1 接 280H


OUT DX,AL

MOV AL,AH ; 得到列代码


MOV DX,298H ; 列开始信号 CS2 接 288H

OUT DX,AL ; 显示行


MOV AL,0

OUT DX,AL

SHL AH,1 ; 滚屏左移一位


INC SI ; SI 加 1


CALL DELAY ; 显示一列后延时

LOOP NEXT1

POP CX

CALL DELAY ; 显示一行后延时


LOOP A1

MOV AL,0

MOV DX,298H

OUT DX,AL

ADD BX,8 ; BX 加 8,8 为每组点阵代码的大小


CALL DELAY

;LOOP WORDTIMES1


POP SI

POP DX

POP CX

POP BX

POP AX

RET

DISPLAY_DOT_MATRIX ENDP

SHOW_XING PROC NEAR

PUSH AX

PUSH BX

PUSH CX

PUSH DX

PUSH SI

MOV CX,01H ;共存21组点阵代码,21帧图案


MOV BX,00H

WORDTIMES2:

MOV CX,40H

MOV SI,0

A11:

MOV AH,01H

PUSH CX

MOV CX,8 ; 8x8 点阵


MOV SI,0

NEXT2:

MOV AL,[MESS1+SI+BX] ; 分别得到第1组到第21组行代码首址


MOV DX,2a0H ; 行开始信号 CS1 接 280H


OUT DX,AL

MOV AL,AH ; 得到列代码

MOV DX,290H ; 列开始信号 CS2 接 288H


OUT DX,AL ; 显示行


MOV AL,0

OUT DX,AL

SHL AH,1 ; 滚屏左移一位

INC SI ; SI 加 1

CALL DELAY ; 显示一列后延时


LOOP NEXT2

POP CX

CALL DELAY ; 显示一行后延时


LOOP A11

MOV AL,0

MOV DX,290H

OUT DX,AL

ADD BX,8 ; BX 加 8,8 为每组点阵代码的大小


CALL DELAY

;LOOP WORDTIMES1


POP SI

POP DX

POP CX

POP BX

POP AX

RET

SHOW_XING ENDP

DELAY PROC NEAR ; 延时子程序


PUSH CX

MOV CX,0FFH

L: LOOP L

POP CX

RET

DELAY ENDP

 DCmotor proc
        push dx
        push ax
        
         
        
        MOV     DX,D8255S
        MOV     AL,82h       ; Modify to configure PORT B as input
        
        OUT     DX,AL            ;8255 PORT B INPUT
        
LLL:            MOV     AL,80h
        MOV     DX,proth
        OUT     DX,AL             ;D/A OUTPUT 0V
        
               
INTK:           MOV     DX,D8255B
        IN      AL,DX             ;READ SWITCH
        
      
        JMP     LLL
        pop ax
        pop dx
        

        
        ret
        Dcmotor endp


GREEN PROC ;; 绿色显示(和红色)


PUSH CX

PUSH BX

PUSH AX

PUSH DX

PUSH SI ; 保留现场,减少不必要的麻烦


MOV CX,3

MOV SI,0

REDBREAK:

CLI ; 设置红色计时中断


PUSH DS

MOV AX,SEG REDTIME

MOV DS,AX

MOV DX,OFFSET REDTIME

MOV AX,250BH

INT 21H

IN AL,21H

AND AL,0F7H ; 开启三号口


OUT 21H,AL

POP DS

STI

LP2:

MOV DI,0

PUSH CX

LP3:

; MOV CX,5 ; 红绿色延时时间


LP4:

MOV AL,22H ; 由于存在两位数码管,因此需要在两位数码管之间快速刷新


MOV DX,D8255A

OUT DX,AL

MOV AL,TENS[SI]

MOV DX,D8255B

OUT DX,AL

CALL DELAY_02S ; 调用延时函数


MOV AL,NUM[DI]

MOV DX,D8255B

OUT DX,AL

MOV AL,11H

MOV DX,D8255A ; 把0001 0001传递给A口


OUT DX,AL

CALL DELAY_02S


; LOOP LP4 ; 循环50次执行完50次才会改变数值

; JMP LP4


; INC DI


CMP DI,10

JNE LP3

INC SI

POP CX ; CX初始为3,即循环三次


LOOP LP2

POP SI

POP DX

POP AX

POP BX

POP CX ; 还原现场


RET

GREEN ENDP ; 退出数码管倒计显示

REDTIME PROC ; 红灯计时


STI

PUSH AX

INC DI

MOV AL,20H

OUT 20H,AL

POP AX

IRET

REDTIME ENDP

YELLOW PROC ; 黄灯闪烁情况下的计时与显示

PUSH SI

PUSH CX

PUSH BX

PUSH DX ; 保护现场


PUSH AX

CLI

PUSH DS

MOV AX,SEG YELLOTIME

MOV DS,AX

MOV DX,OFFSET YELLOTIME

MOV AX,250BH

INT 21H

IN AL,21H

AND AL,0F7H ; 开启三号口


OUT 21H,AL

POP DS

STI

MOV AL,11H

MOV DX,D8255A ; A口 0001 0001


OUT DX,AL

SHOW:

MOV AL,YELLOWNUM[SI] ; 2 2 1 1 0 0


MOV DX,D8255B

OUT DX,AL ; B口传递2,2,1,1,0,0


BACK:

MOV BX,0003H

CMP SI,BX

JNZ SHOW ; 此处循环三次 用loop比较混乱


POP DX

POP AX

POP BX

POP CX

POP SI

RET

YELLOW ENDP

YELLOTIME PROC ; 实现SI和BX加一


STI

PUSH DX

PUSH AX

INC SI ; 慎重


MOV AL,20H

OUT 20H,AL

POP AX

POP DX

iret

YELLOTIME ENDP

DELAY_02S PROC ; 循环 60*4000次,0.2大约


PUSH CX

PUSH SI

MOV CX,60

DD1: MOV SI,4000

DD2: DEC SI

JNZ DD2

LOOP DD1

POP SI

POP CX

RET

DELAY_02S ENDP

DELAY_05S PROC ; 循环4000*3000次大约0.5秒


PUSH CX

PUSH SI

MOV CX,4000

D1: MOV SI,4000

D2: DEC SI

JNZ D2

LOOP D1

POP SI

POP CX

RET

DELAY_05S ENDP

CODES ENDS

END START

  • 6
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jax不摆烂

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值