📄 ic.asm
字号:
data segment
m1_va dw 0;存放应付金额的总数
m2_va dw 0;存放所付金额的总数
count db 10;软件计数器
key db 0;读键盘后,存放读入的键值
pos db 0;存放“写显示RAM命令字”,用来传递参数
d8253 equ 200h
z8253 equ 203h
d8255 equ 212h
z8255 equ 213h
z82590 equ 220h
z82591 equ 221h
d8279 equ 230h
z8279 equ 232h
data ends
code segment
assume cs:code
start:
main proc far
mov ax,8100h
mov ds,ax;段地址8100H赋给DS
mov dx,z8279
mov al,0d2h
out dx,al;清空显示RAM和FIFO RAM
aa: in al,dx
test al,80h
jnz aa ;判断是否清空完毕,没有则等待
mov al,0
out dx,al;8279控制字,表示:左边输入,八位显示外部译码八位显示
bb: call getkey;读键盘,将键值放入变量KEY
mov al,key
cmp al,0ah
jnz b
call search;键值为“A”则执行查找子程序
jmp bb
b: cmp al,0bh;键值为“B”则执行购买子程序
jnz c
call buy
jmp bb
c: cmp al,0ch;键值为“C”则执行修改子程序
jnz e
call updata
jmp bb
e: cmp al,0eh;键值为“E”则执行结束子程序
jnz bb
call clear
call p_exit
jmp e
mov ah,4ch
int 21h
main endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
search proc near;查找子程序
push ax
push bx
call clear
call p_printno
call getkey
mov pos,84h
call p_print1
call delay1
call clear
mov ah,0
mov bh,0
mov al,key
mov bl,7
mul bl
lea bx,cola
add bx,ax
call p_print7
pop bx
pop ax
ret
search endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
updata proc near;修改子程序
push ax
push bx
push cx
call clear
call p_printno
call getkey
mov pos,84h
call p_print1
call delay1
call clear
mov ah,0
mov bh,0
mov al,key
mov bl,7
mul bl
lea bx,cola
add bx,ax
add bx,2
mov cx,5
mov pos,87h
nn: call getkey
call p_print1
mov al,key
mov [bx],al
inc bx
dec pos
loop nn
mov bl,71h;F
call p_printefc
call clear
pop cx
pop bx
pop ax
ret
updata endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
buy proc near;购买子程序
call clear
call p_count
restart:
call p_printno
call getkey
mov pos,84h
call p_print1
call delay1
call clear
mov ah,0
mov bh,0
mov al,key
mov bl,7
mul bl
lea si,cola
add si,ax
mov m1_va,0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ah,0
mov al,[si+2]
mov bh,0
mov bl,100
mul bl
add m1_va,ax
mov ah,0
mov al,[si+3]
mov bh,0
mov bl,10
mul bl
add m1_va,ax
mov ah,0
mov al,[si+5]
;cbw
add m1_va,ax;单价存入m1_va
call p_printno
call getkey
call p_print1
call delay1
call clear
mov cl,key
mov ch,0
mov dx,0
mov ax,m1_va
mul cl
mov m1_va,ax ;价格总额存入m1_va
lea si,mon1
mov ax,m1_va
mov bh,0
mov bl,100
div bl
mov [si],al
mov al,ah
mov ah,0
mov bh,0
mov bl,10
div bl
mov [si+1],al
mov [si+3],ah
lea bx,mon1
call p_print7;显示价格总额
lea si,seco
cmp byte ptr[si],4
jnz oth;==================================
mov key,0ch
oth:
call getkey
mov al,key
cmp al,0dh
jnz cle;---------------------
call clear
call empty1
jmp restart
cle:
cmp al,0ch
jnz fin
call empty1
call empty2
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
call p_count_pause
call p_print2
mov bl,39h
call p_printefc
lea si,seco
mov byte ptr[si],0
mov byte ptr[si+1],0
call clear
jmp en
fin:
cmp al,0fh
jnz oth;------------------------------
mov bl,71h
call p_printefc
repay:
call clear
lea si,mon2
mov cx,5
mov pos,87h
ll: call getkey
call p_print1
mov al,key
cmp al,0ch
jz cle
mov [si],al
inc si
dec pos
loop ll
call delay1;将所付金额存入mon2
lea si,mon2
mov m2_va,0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
mov ax,0
mov al,[si]
mov ch,0
mov cl,100
mul cl
add m2_va,ax
mov ax,0
mov al,[si+1]
mov ch,0
mov cl,10
mul cl
add m2_va,ax
mov ax,0
mov al,[si+3]
cbw
add m2_va,ax;将所付金额存入m2_va
mov ax,m1_va
cmp m2_va,ax
jnb s1;------------------
call empty2
mov bl,79h
call p_printefc
jmp repay
s1: sub m2_va,ax
mov ax,m2_va
mov bh,0
mov bl,100
div bl
lea si,mon2
mov [si],al
mov al,ah
mov ah,0
mov bh,0
mov bl,10
div bl
mov [si+1],al
mov [si+3],ah
lea bx,mon2
call p_print7
call p_count_pause
call p_print2
call empty1
call empty2
lea si,seco
mov byte ptr[si],0
mov byte ptr[si+1],0
en: ret
buy endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
getkey proc near;读键盘子程序
push ax
push bx
push dx
w: mov dx,z8279
in al,dx
mov ah,al
test al,80h
jnz w
lea bx,seco
mov al,[bx]
cmp al,4
jz ex
mov al,ah
and al,0fh
jz w
mov al,40h
out dx,al
mov dx,d8279
in al,dx
mov key,al
mov dx,z8279
mov al,0c2h
out dx,al
ex: pop dx
pop bx
pop ax
ret
getkey endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
clear proc near;清屏子程序
push ax
push cx
push dx
mov al,90h
mov dx,z8279
out dx,al
mov al,0
mov cx,8
cir:mov dx,d8279
out dx,al
loop cir
pop dx
pop cx
pop ax
ret
clear endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
delay1 proc near;延迟子程序
push ax
push bx
push cx
mov bx,2
del:mov cx,0
de: loop de
dec bx
jnz del
pop cx
pop bx
pop ax
ret
delay1 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_printno proc near;打印提示字符串“NO—”
push ax
push dx
mov al,95h
mov dx,z8279
out dx,al
mov dx,d8279
mov al,40h;-
out dx,al
mov al,3fh;o
out dx,al
mov al,37h;n
out dx,al
pop dx
pop ax
ret
p_printno endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_print1 proc near;将读键盘操作读入的键值显示出来,显示的位置通过参数POS传递
push ax
push bx
push dx
mov al,pos
mov dx,z8279
out dx,al
mov al,key
lea bx,tab
xlat
mov dx,d8279
out dx,al
pop dx
pop bx
pop ax
ret
p_print1 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_printefc proc near;闪烁显示字符E/F/C,具体由BL传递参数
push ax
push cx
push dx
mov al,82h
mov dx,z8279
out dx,al
mov cx,5
pp: mov al,bl
mov dx,d8279
out dx,al
call delay1
mov al,0
out dx,al
call delay1
loop pp
pop dx
pop cx
pop ax
ret
p_printefc endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_print7 proc near;显示价格信息,通过BX传递参数
cmp key,0ch
jz jp
push ax
push bx
push cx
mov cx,7
mov si,bx
add si,6
mov al,91h
mov dx,z8279
out dx,al
lea bx,tab
tt: mov al,[si]
xlat
mov dx,d8279
out dx,al
dec si
loop tt
pop cx
pop bx
pop ax
jp: ret
p_print7 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_count proc near;计时子程序
push ax
push dx
cli
mov dx,z8255
mov al,80h;方式0,全输出
out dx,al
mov dx,d8255
mov al,1;PC0置1
out dx,al
;初始化8255
mov dx,z82590
mov al,13h;icw1
out dx,al
mov dx,z82591
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,z8253
mov al,36h;0#计数器;先写低8位,后写高8位;方式3;二进制计数
out dx,al
mov dx,d8253
mov ax,960*25;写入0#计数器计数初值
out dx,al
mov al,ah
out dx,al
sti
pop dx
pop ax
ret
p_count endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_print2 proc near;打印计时信息
push ax
push bx
push cx
push dx
push si
mov al,90h
mov dx,z8279
out dx,al
lea si,seco
inc si
lea bx,tab
mov cx,2
ss1: mov al,[si]
xlat
mov dx,d8279
out dx,al
dec si
loop ss1
pop si
pop dx
pop cx
pop bx
pop ax
ret
p_print2 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_count_pause proc near;停止计时子程序停止
push ax
push dx
mov al,0
mov dx,d8255
out dx,al
pop dx
pop ax
ret
p_count_pause endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
timer proc near;中断程序
push bx
dec count
jnz next
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],4
jnz next
call p_count_pause
mov key,0ch
next:
call p_print2
pop bx
iret
timer endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
empty1 proc near;将应付金额信息置空
push si
mov m1_va,0
lea si,mon1
mov byte ptr[si],0
mov byte ptr[si+1],0
mov byte ptr[si+3],0
pop si
ret
empty1 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
empty2 proc near;将所付金额信息置空
push si
mov m2_va,0
lea si,mon2
mov byte ptr[si],0
mov byte ptr[si+1],0
mov byte ptr[si+3],0
pop si
ret
empty2 endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
p_exit proc near;闪烁显示字符串“END”
push ax
push cx
push dx
mov cx,6
mov pos,95h
qq: mov al,pos
mov dx,z8279
out dx,al
mov dx,d8279
mov al,5eh
out dx,al
mov al,37h
out dx,al
mov al,79h
out dx,al
call delay1
call clear
call delay1
dec pos
loop qq
pop dx
pop cx
pop ax
ret
p_exit endp
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
cola db 0,0ah,0,2,10h,5,0
bread db 1,0ah,0,3,10h,0,0
apple db 2,0ah,0,2,10h,0,0
grape db 3,0ah,0,3,10h,0,0
bana db 4,0ah,0,4,10h,0,0
beaf db 5,0ah,0,6,10h,8,0
sweat db 6,0ah,1,4,10h,0,0
coffe db 7,0ah,0,7,10h,4,0 ;8种商品号码和价格信息
mon1 db 0,0,10h,0,0,11,11 ;应付金额的显示形式
mon2 db 0,0,10h,0,0,11,11 ;所付金额的显示形式
seco db 0,0 ;秒的十位和个位
tab db 3fh,6,5bh,4fh,66h,6dh,7dh,7,7fh,6fh,40h,0,0,0,0,0,80h ;对应字符0—9,“-”,“。”
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
code ends
end start
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -