📄 huoche.asm
字号:
DATA SEGMENT
Z8279 EQU 212H
D8279 EQU 210H
LEDMOD EQU 00
LEDFEQ EQU 50H
DATA ENDS
code segment
assume cs:code
start:
pos db 0eeh
count db 10
mov al,0d2h ;清除8279的寄存器
mov dx,z8279
out dx,al
ll: in al,dx ;是否清除完毕,如果没有,循环执行ll函数
test al,80h
jnz ll
oo: mov ax,8100h ;设置8279的状态为右端输入8位译码显示,扫描频率为80HZ
mov ds,ax
mov dx,212h
mov al,10h
out dx,al
mov al,50h
out dx,al
mov al,11010000b ;清除8279键盘寄存器
out dx,al
call XIANSHI ;调用循环显示函数
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;循环列车信息
XIANSHI proc near
mov dx,212h ;设置8279的写状态命令字
mov al,10010000b
out dx,al
GUNDONG:
mov si,-1 ;设置循环变量
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;表1中的信息
pp0:
mov dx,212h ;判断是否有键按下
in al,dx
and al,0fh
jz gg
call inta ;有键,调用查询函数
gg:
lea bx,table1 ;无键,循环显示表1中的列车信息
mov ax,si
xlat
mov dx,210h
out dx,al
inc si
call delay1
ac:
cmp si,181 ;判断表1是否循环结束. 181是半个表的长度
jnz pp0
mov si,0 ;如果结束 循环显示表2中信息
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;表2中的信息
pp1:
mov dx,212h
in al,dx
and al,0fh
jz kk
call inta
kk:
lea bx,table2
mov ax,si
xlat
inc si
mov dx,210h
out dx,al
call delay1
zx:
cmp si,181 ;判断表2是否循环结束
jnz pp1
jz GUNDONG
ret
xianshi endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 循环延时
delay1 proc
mov bx,1
delay11:
mov cx,0
loop $
dec bx
jnz delay11
ret
delay1 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;查询延时
delay4 proc
mov bx,4
delay44:
mov cx,0
loop $
dec bx
jnz delay44
ret
delay4 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;查询函数
inta proc near
fg: call p_count ;调用中断
mov dx,212h
in al,dx
test al,0fh
jz fg
mov dx,210h
in al,dx
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;车次查询
cmp al,4 ;比较是否是表1中信息
ja xx
mov cl,36
mov dl,36 ;36是1条信息的长度
mul dl
mov di,ax ;条过al*36个字节
as:
push cx
mov bx,offset table1 ;查询表1 输出查询信息
mov ax,di
xlat
mov dx,210h
out dx,al
inc di
call delay4 ;调用延时函数 使查询信息以不同与循环速度显示
pop cx
loop as
jmp ac
xx:
cmp al,09h ;比较是否是表2中信息
ja uu
mov cl,36
sub al,5
mov dl,36
mul dl
mov di,ax ;条过al*36个字节
bs:
push cx
mov bx,offset table2 ;查询表2 输出查询信息
mov ax,di
xlat
mov dx,210h
out dx,al
inc di
call delay4 ;调用延时函数 使查询信息 以不同与循环速度显示
pop cx
loop bs
jmp ac
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;站地查询
uu:
cmp al,0ah ;比较是否以a为终点站
je aa
cmp al,0bh ;比较是否以b为终点站
je bb
cmp al,0ch
je cc
cmp al,0dh
je dd
cmp al,0eh
je ee
cmp al,0fh
je ff
cmp al,0
jb dispose
cmp al,0fh
ja dispose
jmp ac
aa:
mov al,0 ;调用表2中第1条信息
call dis2
mov al,2 ;调用表2中第3条信息
mov dl,36
mul dl
call dis2
mov al,4 ;调用表2中第5条信息
mov dl,36
mul dl
call dis2
jmp ac
bb:
mov al,0
call dis1
jmp ac
cc:
mov al,1
mov dl,36
mul dl
call dis1
jmp ac
dd:
mov al,2
mov dl,36
mul dl
call dis1
mov al,1
mov dl,36
mul dl
call dis2
jmp ac
ee:
mov al,3
mov dl,36
mul dl
call dis1
mov al,3
mov dl,36
mul dl
call dis2
jmp ac
ff:
mov al,4
mov dl,36
mul dl
call dis1
jmp ac
ol: ret
inta endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;出错处理
dispose :
mov dx,212h ;清除8279寄存器
mov al,11010000b
out dx,al
aa1:
in al,dx ;是否清除完毕,如果没有,循环执行aa1函数
test al,80h
jnz aa1
mov al,10010000b ;设置8279的写状态命令字
out dx,al
mov si,0
mm:
lea bx,table3 ;查表3 输出错误信息:FFFF
mov ax,si
xlat
inc si aa
mov dx,210h
out dx,al
call delay4
cmp si,9
jnz mm
call XIANSHI ;返回初始状态
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; 查询表1中的站地
dis1 proc near
mov cl,36
mov di,al
ts5:
push cx
mov bx,offset table1 ;具体查询表1中信息
mov ax,di
xlat
mov dx,210h
out dx,al
inc di
call delay4
pop cx
loop ts5
ret
dis1 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;查询表2中的站地
dis2 proc near
mov cl,36
mov di,al
ts:
push cx
mov bx,offset table2;具体查询表2中信息
mov ax,di
xlat
mov dx,210h
out dx,al
inc di
call delay4
pop cx
loop ts
ret
dis2 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_count proc near
push ax
push dx
cli
mov dx,20bh
mov al,80h ;方式0,全输出
out dx,al
mov dx,20ah
mov al,1 ;PC0置1
out dx,al
;初始化8255
mov dx,220h
mov al,13h;icw1
out dx,al
mov dx,221h
mov al,30h;icw2
out dx,al
mov al,03h;icw4
out dx,al
mov al,0feh;ocw1
out dx,al
;初始化8259
push ds
xor ax,ax
mov ds,ax
mov bx,30h*4 ;中断向量物理地址
mov ax,offset timer
mov [bx],ax
mov ax,8100h
mov [bx+2],ax
pop ds
;设置中断向量,把timer中断程序的段地址和偏移地址存入中断向量表中即:30h*4--30h*4+3
mov dx,203h
mov al,36h;0#计数器;先写低8位,后写高8位;方式3;二进制计数
out dx,al
mov dx,200h
mov ax,960*25;写入0#计数器计数初值
out dx,al
mov al,ah
out dx,al
sti
pop dx
pop ax
ret
p_count endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_count_pause proc near
push ax
push dx
mov al,0
mov dx,20ah
out dx,al
pop dx
pop ax
ret
p_count_pause endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;中断:实现30s查询功能
timer proc near
push bx
dec count
jnz next11
mov count,10
lea bx,seco
inc bx
inc byte ptr[bx]
cmp byte ptr[bx],10
jnz next
mov byte ptr[bx],0
inc byte ptr[bx-1]
cmp byte ptr[bx-1],3
jnz next
call p_count_pause
lea si,seco
mov byte ptr[si],0
mov byte ptr[si+1],0
mov al,0ffh
mov dx,209h
out dx,al
pop bx
jmp oo
next:
rol pos,1
mov al,pos
mov dx,209h
out dx,al
next11:
pop bx
iret
timer endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
table1 db 3fh,7fh,7dh,71h,00h,7ch,40h,40h,77h,00h,3fh,3fh,09h,7fh,3fh,00h,3fh,3fh,09h,5bh,06h,00h,3fh,6dh,09h,6fh,3fh,00h,6dh,6dh,09h,6fh,3fh,00h,36h,00h
db 06h,7fh,7dh,71h,00h,39h,40h,40h,7ch,00h,3fh,3fh,09h,6fh,3fh,00h,3fh,3fh,09h,6dh,06h,00h,7fh,6dh,09h,3fh,06h,00h,06h,3fh,09h,06h,06h,00h,36h,00h
db 5bh,7fh,7dh,71h,00h,5eh,40h,40h,39h,00h,3fh,3fh,09h,3fh,06h,00h,3fh,3fh,09h,66h,06h,00h,3fh,3fh,09h,3fh,06h,00h,3fh,3fh,09h,6dh,06h,00h,36h,00h
db 4fh,7fh,7dh,71h,00h,79h,40h,40h,5eh,00h,3fh,3fh,09h,06h,06h,00h,3fh,3fh,09h,7fh,06h,00h,07h,3fh,09h,5bh,06h,00h,3fh,06h,09h,5bh,06h,00h,36h,00h
db 66h,7fh,7dh,71h,00h,71h,40h,40h,79h,00h,3fh,3fh,09h,5bh,5bh,00h,3fh,3fh,09h,7fh,3fh,00h,06h,06h,09h,4fh,5bh,00h,6dh,06h,09h,4fh,5bh,00h,36h,00h
table2 db 6dh,7fh,7dh,71h,00h,77h,40h,40h,71h,00h,3fh,3fh,09h,4fh,06h,00h,6dh,4fh,09h,07h,06h,00h,4fh,3fh,09h,6dh,06h,00h,6fh,3fh,09h,6dh,06h,00h,36h,00h
db 7dh,7fh,7dh,71h,00h,7ch,40h,40h,79h,00h,3fh,3fh,09h,3fh,5bh,00h,3fh,3fh,09h,4fh,3fh,00h,06h,6dh,09h,06h,3fh,00h,7dh,6dh,09h,06h,3fh,00h,36h,00h
db 07h,7fh,7dh,71h,00h,77h,40h,40h,5eh,00h,3fh,3fh,09h,6dh,06h,00h,6fh,3fh,09h,5bh,5bh,00h,3fh,4fh,09h,7fh,06h,00h,6dh,4fh,09h,7fh,06h,00h,36h,00h
db 7fh,7fh,7dh,71h,00h,79h,40h,40h,39h,00h,3fh,3fh,09h,7dh,3fh,00h,07h,3fh,09h,66h,06h,00h,66h,5bh,09h,3fh,06h,00h,3fh,4fh,09h,3fh,06h,00h,36h,00h
db 6fh,7fh,7dh,71h,00h,77h,40h,40h,39h,00h,3fh,3fh,09h,07h,06h,00h,3fh,3fh,09h,7fh,3fh,00h,06h,3fh,09h,7fh,06h,00h,07h,3fh,09h,7fh,06h,00h,36h,00h
table3 db 71h,71h,71h,71h,00h,00h,00h,00h
seco db 0,0
LED DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH,77H,7CH,39H
DB 5EH,79H,71H
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -