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

📄 dabanew.asm

📁 微机系统课程设计 移动靶射击比赛 源程序
💻 ASM
字号:
;***********************;
;*    移动打靶  1.0     *;
;*     作者:黄儒        *;
;*     学号:08005432    *;
;***********************;
;8255CS-288h PB7-PB0接发光二极管L7-L0 PA7接led dp PA6-PA0接led g-a PC7-PC4接led位选 s3-s0
;8253Cs-280h clk0-1Mhz gate0-vcc out0-IRQ
;点阵行选—290h 红选-298h
;ls244 k0-2,k1-4,k2-6,k3-8,k4-11,k5-13,k6-15,k7-17;
;      D0-18,D1-14,D2-16,D3-12,D4-9,D5-7,D6-5,D7-3
;2A0h~	和!IOR相或接ls244的19,1  ls244的10-GND 20-Vcc
;单脉冲接PC0




ioport		equ 0c800h-0280h
io8253a		equ ioport+280h
io8253b		equ ioport+281h
io8253c		equ ioport+283h

proth	equ	  ioport+290h
protlr	equ      ioport+298h


io8255c		equ ioport+28ah;c口
io8255b		equ ioport+28bh;控制寄存器
io8255a		equ ioport+288h;a口
io8255bb		equ ioport+289h

ls244		equ ioport+2a0h

data segment
int_vect EQU 0dH ;中断0-7 的向量为:08h-0fh,中断8-15 的向量为:70h-77h
irq_mask_2_7 equ 011011111b ;中断掩码,中断0-7 时从低至高相应位为零,中断8-15 时第2 位为零
irq_mask_9_15 equ 011111111b;中断0-7 时全一,中断8-15 时从低至高相应位为零
ioport_cent equ 0c400h ;tpc 卡中9054 芯片的io 地址
msgbb db	0dh,0ah,'YiDongDaBa  1.0',0dh,0ah,'$'
msgzz db	0dh,0ah,'Written by HuangRu(08005432)',0dh,0ah,'$'
msgz1 db	0dh,0ah,'8255CS-288h PB7-PB0接发光二极管L7-L0 PA7接led dp PA6-PA0接led g-a PC7-PC4接led位选 s3-s0',0dh,0ah,'$'
msgz2 db	0dh,0ah,'8253Cs-280h clk0-1Mhz gate0-vcc out0-IRQ',0dh,0ah,'$'
msgz3 db	0dh,0ah,'点阵行选-290h 红选-298h',0dh,0ah,'$'
msgz4 db	0dh,0ah,'ls244 k0-2,k1-4,k2-6,k3-8,k4-11,k5-13,k6-15,k7-17',0dh,0ah,'$'
msgz5 db	0dh,0ah,'ls244 D0-18,D1-14,D2-16,D3-12,D4-9,D5-7,D6-5,D7-3',0dh,0ah,'$'
msgz6 db	0dh,0ah,'2A0h~和!IOR相或接ls244的19,1  ls244的10-GND 20-Vcc   单脉冲接PC0',0dh,0ah,'$'
msgkg db	0dh,0ah,'Press The Switch To Begin The Game!',0dh,0ah,'$'

msg1 db	0dh,0ah,'Start!',0dh,0ah,'$'
msg2 db	0dh,0ah,'Score!',0dh,0ah,'$'
msg3 db	0dh,0ah,'Pressed',0dh,0ah,'$'
msg_choose1 db	0dh,0ah,'7:Hard  8:middle 9:easy',0dh,0ah,'$'
msg_choose2 db	0dh,0ah,'Choose mode(play key 1 or 2 or 3)',0dh,0ah,'$'
sym_end db 0;结束标志
led_now db 0;当前开关状态
key11 db 0;是否打靶
counter_time db 0;时间计数
counter_mov  db 0;靶移动计数
num_mov db  0;靶移动计时
random_en db 0;随机使能
counter_max1 db  0;规定时间高位
counter_max2 db  0;规定时间低位
counter_score1 db  0;计分高位
counter_score2 db  0;计分低位
table_key dw 0;开关状态偏移地址
table_led dw 0;发光二极管表的偏移地址
led_number db 0;发光二极管表码数目
key_now db 0;当前开关状态按键状态,用键盘打靶时可改为开关状态对应ascii码值
key_en db 0;按键是否有效

led1 db 80h,40h,20h,10h,08h,04h,02h,01h,02h,04h,08h,10h,20h,40h;发光二极管输出
led2 db 80h,20h,08h,02h,01h,04h,10h,40h;发光二极管输出
key1 db 80h,40h,20h,10h,08h,04h,02h,01h,02h,04h,08h,10h,20h,40h;当前发光二极管对应的开关状态,用键盘打靶时可改为对应的ascii码
key2 db 80h,20h,08h,02h,01h,04h,10h,40h;当前发光二极管对应的开关状态,用键盘打靶时可改为对应的ascii码
led   DB 3FH,06H,5BH,4FH,66H,6DH,7DH,07H,7FH,6FH;七段数码管断码



csreg dw ?
ipreg dw ? ;旧中断向量保存空间
data ends



stacks segment
db 100 dup (?)
stacks ends


code segment
assume cs:code,ds:data,ss:stacks,es:data
main proc far
;Enable Local Interrupt Input
.386
start:	cli
mov ax,data
mov ds,ax
mov es,ax
mov ax,stacks
mov ss,ax

	mov dx,io8255b   ;将8255设为A口输出,c7-4out,c3-0in
	mov al,81h
	out dx,al

	mov dx,io8253c     ;向8253写控制字
	mov al,34h       ;使0通道为工作方式3
	out dx,al
	mov ax,60000     ;写入循环计数初值60000
	mov dx,io8253a
	out dx,al        ;先写入低字节
	mov al,ah
	out dx,al        ;后写入高字节
	
mov dx,ioport_cent+68h ;设置 tpc 卡中9054 芯片io 口,使能中断
in ax,dx
or ax,0900h
out dx,ax
mov al,int_vect ;保存原中断向量
mov ah,35h
int 21h
mov ax,es
mov csreg,ax
mov ipreg,bx
mov ax,cs ;设置新中断向量
mov ds,ax
mov dx,offset int_proc
mov al,int_vect
mov ah,25h
int 21h
in al, 21h ;设置中断掩码
and al, irq_mask_2_7
out 21h, al
in al, 0a1h
and al, irq_mask_9_15

out 0a1h, al

 mov ax,data
 mov ds,ax;ds指向数据段
 mov dx,offset msgbb	;显示提示信息
	mov ah,09
	int 21h
 mov dx,offset msgzz	;显示提示信息
	mov ah,09
	int 21h
 mov dx,offset msgz1	;显示提示信息
	mov ah,09
	int 21h
 mov dx,offset msgz2;显示提示信息
	mov ah,09
	int 21h
 mov dx,offset msgz3	;显示提示信息
	mov ah,09
	int 21h
 mov dx,offset msgz4	;显示提示信息
	mov ah,09
	int 21h
 mov dx,offset msgz5;显示提示信息
	mov ah,09
	int 21h
 mov dx,offset msgz6;显示提示信息
	mov ah,09
	int 21h


mov dx,offset msgkg	;显示提示信息
	mov ah,09
	int 21h


read_start: mov dx,io8255c
	in al,dx
	 mov dx,io8255c
	in al,dx

	test al,01h
	jz read_start

	 mov ax,data
 	mov ds,ax;ds指向数据段

	mov dx,offset msg1	;显示提示信息
	mov ah,09
	int 21h

restart1: mov ax,data
 mov ds,ax;ds指向数据段
 
 
 mov dx,offset msg_choose1	;显示提示信息
	mov ah,09
	int 21h
read_choose:  mov ah,07h
  int 21h
  cmp al,37h;h
  jnz  choose1
   mov  num_mov,15;耙移动计时,
   jmp read_choose2n
choose1: cmp al,38h;m
    jnz  choose2
   mov  num_mov,30;耙移动计时,
   jmp read_choose2n
choose2: cmp al,39h;e
     jnz read_choose
        mov  num_mov,50;耙移动计时,
 
read_choose2n:  mov dx,offset msg_choose2;显示提示信息
	mov ah,09
	int 21h


read_choose2:  mov ah,07h
  int 21h
 cmp al,31h;1
    jnz  choose22
	mov random_en,0
   mov table_key,offset key1;开关表偏移地址
 mov table_led , offset led1;发光二极管表的偏移地址
 mov led_number ,14;发光二极管表数目
   jmp csh
choose22: cmp al,32h;2
    jnz choose23
	mov random_en,0

   mov table_key,offset key2;开关表偏移地址
 mov table_led , offset led2;发光二极管表的偏移地址
 mov led_number ,8;发光二极管表数目
   jmp csh

choose23: cmp al,33h;3
    jnz read_choose2
	mov random_en,1
	  mov table_key,offset key1;开关表偏移地址
 mov table_led , offset led1;发光二极管表的偏移地址


;初始化数据
  csh:
mov sym_end , 0;结束标志
 mov led_now,0
 
 mov key11 ,0
 
 mov    counter_time,0;时间计数
 mov counter_mov ,0;靶移动计数
  

 mov counter_max1 , 09h;规定时间高位
 mov counter_max2,09h;规定时间低位
 mov  counter_score1,0;计分高位
 mov counter_score2 ,  0;计分低位

 
 mov key_now , 0
 mov key_en ,0;按键是否有效
 mov si,0

  sti
	
 main2: mov dx,io8255c
	in al,dx
	 mov dx,io8255c
	in al,dx

	test al,01h;是否结束程序
	jnz exit
	
;************显示部分*********************************		 
display0: mov al,00h;全部禁止显示
 mov dx,io8255c		
 out dx,al

 mov bx,offset led
 mov al,counter_max1
	xlat
 mov dx,io8255a
 out dx,al;送断码

 mov al,80h;送位码
 mov dx,io8255c		
 out dx,al
 call delay
 
display1: mov al,00h;全部禁止显示
 mov dx,io8255c		
 out dx,al

 mov bx,offset led

 mov al,counter_max2
	xlat
 mov dx,io8255a
 out dx,al;送断码


 mov al,40h;送位码
 mov dx,io8255c		
 out dx,al

 call delay

display2: mov al,00h;全部禁止显示
 mov dx,io8255c		
 out dx,al

 mov bx,offset led

 mov al,counter_score1
	xlat
 mov dx,io8255a
 out dx,al;送断码


 mov al,20h;送位码
 mov dx,io8255c		
 out dx,al
  call delay
 

display3: mov al,00h;全部禁止显示
 mov dx,io8255c		
 out dx,al

 mov bx,offset led

 mov al,counter_score2
	xlat
 mov dx,io8255a
 out dx,al;送断码


 mov al,10h;送位码
 mov dx,io8255c		
 out dx,al
 call delay
 cmp key11,01h;轨迹显示,是否有键按下
 jnz llll
 mov dx, protlr;有键按下(打靶)
 mov al,key_now	
	out dx,al
	mov dx,proth 
	mov al,0ffh
	out dx,al
	call delay
	mov key11,00h
	jmp main1
  llll: mov dx, protlr;未打靶
 mov al,led_now	
	out dx,al
	mov dx,proth 
	mov al,80h
	out dx,al

;*************以上为显示部分*****************88888888	


main1: cmp sym_end,1
	jnz main12
	jmp main2;一轮结束
main12:  cmp key_en,01h
	 jz main13
	jmp main2;按键无效
main13:
	mov dx,ls244        ;读开关状态
	in al,dx
	
	
main11:
	
	test al,0ffh
	jz main2;是否打靶
	mov key_now,al
	mov key11,01h

	mov bx,table_key
	mov ax,si
	xlat
	cmp al,key_now
	jz main111;对应键按下
	jmp main2
main111: cmp key_en,01h
	 jnz main2


        mov dx,offset msg2	;显示提示信息
	mov ah,09
	int 21h

  cmp counter_score2,9
	jnz main112
	mov counter_score2,0;得分
	dec counter_score2
	inc counter_score1
 main112:	inc counter_score2
	and key_en,00h;以后按键无效
	 jmp main2



exit: cli
mov bl, irq_mask_2_7 ;恢复中断掩码
not bl
in al, 21h
or al, bl
out 21h, al
mov bl, irq_mask_9_15
not bl
in al, 0a1h
or al, bl
out 0a1h, al
mov dx,ipreg ;恢复原中断向量
mov ax,csreg
mov ds,ax
mov ah,25h
mov al,int_vect
int 21h
mov dx,ioport_cent+68h ;设置 tpc 卡中9054 芯片io 口,关闭中断
in ax,dx
and ax,0f7ffh
out dx,ax
mov ax,4c00h
int 21h

main endp



int_proc proc far ;中断处理程序
cli
push ax
push dx
push ds
	
	mov ax,data ;ds指向数据段
	mov ds,ax



	
	cmp sym_end,01h
	jz exit1;一轮结束
int1:	inc counter_time
	inc counter_mov
	mov al,num_mov
	cmp counter_mov,al;是否到靶移动时间
	jnz int2
	mov counter_mov,00h
	cmp random_en,01h
	jnz ran1
	call iRand;调用随机子程序
	jmp int3
 ran1:	inc si
	mov ax,si
	 cmp al,led_number;是否到表顶
	jnz int3
	mov si,0
   int3: mov key_en,01h	
	mov key11,00h
       mov dx,ls244        ;读开关状态
	in al,dx
	mov key_now,al
	mov bx,table_key
	mov ax,si
	xlat
	cmp al,key_now
	jnz int31;对应键未按下
	mov key_en,00h;以后按键无效
	mov dx,offset msg3	;显示提示信息pressed
	mov ah,09
	int 21h

	int31:

     mov bx,table_led;输出靶	
		mov ax,si
		xlat
		mov led_now,al;记录放光二极管状态
		mov dx,io8255bb
		out dx,al;输出靶
		mov dx,protlr	
		out dx,al
		mov dx,proth 
		mov al,80h
		out dx,al


int2:	cmp counter_time,100;是否到一秒
	jnz exit1
	mov counter_time,00h
	cmp counter_max2,00h ;一秒到,低位是否为0
	jnz int22
	cmp counter_max1,00h;低位是0,高位是否为0
	jnz int221;
		mov sym_end,1;一轮结束
		jmp exit1
	int221:	mov counter_max2,09h;低位0,高位不为0
			dec counter_max1
			jmp exit1
	int22: 	dec  counter_max2;一秒到,低位不为0

   


exit1:
	mov al,20h ;Send EOI
out 0a0h,al
out 20h,al
pop ds
pop dx
pop ax
sti
iret
int_proc endp
iRand       proc  near;随机数子程序
          push ax
	push dx
	push ds  
	mov ah,2ch;取系统时间做种子
	int 21h
	mov ax,dx
        mov   cx,   23                   ;   X   =   cx   =   23   
          mul   cx                           ;   ax   =   ax   *   X   
          add   ax,   7                     ;   ax   =   ax   +   Y   (Y   =   7)   
          mov  cx,14  
          xor   dx,   dx                 ;   dx   =   0   
          div   cx                           ;   ax   =   ax   mod   Z   (余数在dx里面)   
          add   dx,  0             ;   修正产生的随机数的范围   
          mov   si,   dx                 ;   si  =   Rand_Number   
	pop ds
   pop dx
	pop ax

          ret   
  iRand       endp   

delay	  PROC	NEAR                           ;延迟子程序
	  push	cx
	  mov	cx,0ffffh
ccc:	  loop	ccc
	  pop	cx
	  ret
delay   ENDP	  
code ends
end start



⌨️ 快捷键说明

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