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

📄 asm81.asm

📁 微机接口技术的入门必备试验代码 试验平台msdi
💻 ASM
字号:
;*********************************************************************
;  Aexp8.asm  走马灯(灯光变幻)程序                                  *
;   内容:用DIP的8位开关控制走马灯的花样,用SW3控制走马灯的起/停                                                                                                                          
;   运行步骤:1.按下一次开关SW3,开始灯光变幻,再按下一次则停止; 可重复进行 *
;           2.按下SW3后,拨动不同的数码开关DIP,就会出现不同的灯光变幻  *
;           3.按下"q"或者"Q",退出                                     *
;*********************************************************************
sseg segment para stack 'stack'
     dw 200 dup (?)
sseg ends

dseg segment para public 'data'
message db 'press SW3 to start and then press SW3 to stop,and so on!',0ah,0dh;系统提示信息
        db 'turn on DIP one by one and display various soud-op patterns!'
        db 0ah,0dh
        db 'if you want to quit, please hit ''q'' or ''Q''!',0ah,0dh,'$'
flag  db 0                                                                 ;初始化状态标志变量为0
t     dw 0                                                                 ;初始化延时变量为0                                                                      
num   dw 0                                                                 ;初始化数字变量为0
data1    db 0a0h,50h,28h,14h,0ah,05h,82h,41h                                ;八种不同的灯光变幻组合 
data2    db 41h,82h,05h,0ah,14h,28h,50h,0a0h 
data3    db 81h,42h,24h,18h,18h,24h,42h,81h   
data4    db 18h,24h,42h,81h,81h,42h,24h,18h
data5    db 92h,49h,24h,92h,49h,24h,92h,49h
data6    db 49h,92h,24h,49h,92h,24h,49h,92h
data7    db 0c0h,60h,30h,18h,0ch,0bh,03h,0ffh 
data8    db 03h,06h,0ch,18h,30h,60h,0c0h,00h
dseg ends

cseg segment para public 'code'
     assume ss:sseg,cs:cseg,ds:dseg

m proc far
start:   mov   ax,ds
	 push  ax
	 mov   ax,00h
	 push  ax                             ;保留程序数据段地址
	  
         mov ah,09h                           ;显示系统提示信息
	 mov dx,seg message
	 mov ds,dx
	 mov dx,offset message
	 int 21h
          
         ;初始化8255
         mov dx,303h                          ;取8255的控制端口的地址
         mov al,83h                           ;初始化8255的A口和C口高四位为输出模式                
         out dx,al                            ;B口和C口低四位为输入模式

         ;初始化灯LED全灭
         mov dx,300h                          ;取8255的端口A的地址
         mov al,00h                           ;使8255的PA0-PA7全为0
         out dx,al                            ;使所有的灯LED全灭
   
wait:    ;检测"q"或者"Q"键
         mov ah,0bh
         int 21h                              ;调用DOS 21H 功能0BH 进行键盘判断
	      inc al
	      jnz readpc                           ;检测是否有键按下
	      mov ah,08h
	      int 21h                              ;调用DOS 21H 功能08H 进行键盘输入判断
	      cmp al,'q'                         
	      jz quit                              ;检测到"q",退出 
	      cmp al,'Q'
         jz quit                              ;检测到"Q",退出 

readpc:  ;判断开关SW3的状态
         mov dx,302h                          ;取8255的端口C的地址                         
         in al,dx                             ;读端口C的值
				                                   ;当按下开关SW3时,PC2口为低电平                    
	      test al,04h                          ;检测PC2口状态
         jnz case
lp:      in al,dx
         test al,04h
         jz lp                                ;循环检测直至放开
         xor flag,01h                         ;将状态值取反
case:    cmp flag,01h                         ;进行状态值比较
         jne stop

begin:   call ledflash                        ;调用灯光变幻过程  
               
 

         call delay2
         jmp wait

         ;灯LED全灭 
stop:    mov dx,300h                          ;取8255的端口A的地址
         mov al,00h                           ;使8255的PA0-PA7全为0
         out dx,al                            ;使所有的灯LED全灭
         jmp wait

quit:    ;灯LED全灭
         mov dx,300h                          ;取8255的端口A的地址
         mov al,00h                           ;使8255的PA0-PA7全为0
         out dx,al                            ;使所有的灯LED全灭
0
         ;返回DOS
         mov ah,4ch                           ;DOS功能调用
         int 21h                              ;返回DOS
m endp


delay2 proc 
         push cx
         push bx
         mov cx,02ffh
dl4:	   mov bx,0ffffh
dl3:     dec bx
	      jnz dl3
         dec cx 
	      jnz dl4
         pop bx
         pop cx
         ret
delay2 endp 


;检测数码开关DIP的状态,以便产生八种不同的灯光变幻
ledflash proc
         mov dx,301h                          ;取8255的端口B的地址 
 	      in al,dx                             ;读端口B的值
         cmp al,0feh                          ;检测PB0口是否为0
         jne choice1
         mov si,offset data1                  ;置第一种灯光变幻组合                                                                 
         jmp here
choice1: cmp al,0fdh                          ;检测PB1口是否为0    
         jne choice2
         mov si,offset data2                  ;置第二种灯光变幻组合                                                                
         jmp here
choice2: cmp al,0fbh                          ;检测PB2口是否为0
         jne choice3
         mov si,offset data3                  ;置第三种灯光变幻组合                                               
         jmp here
choice3: cmp al,0f7h                          ;检测PB3口是否为0
         jne choice4
         mov si,offset data4                  ;置第四种灯光变幻组合                                                                 
         jmp here
choice4: cmp al,0efh                          ;检测PB4口是否为0
         jne choice5 
         mov si,offset data5                  ;置第五种灯光变幻组合
         jmp here
choice5: cmp al,0dfh                          ;检测PB5口是否为0
         jne choice6
         mov si,offset data6                  ;置第六种灯光变幻组合  
         jmp here
choice6: cmp al,0bfh                          ;检测PB6口是否为0
         jne choice7
         mov si,offset data7                  ;置第七种灯光变幻组合
         jmp here
choice7: cmp al,7fh                           ;检测PB7口是否为0 
         jne choice0
         mov si,offset data8                  ;置第八种灯光变幻组合
         jmp here  
;choice0: call m0                              ;调用声光变幻过程                                                
choice0: jmp  wait        

         ;送加电数据
here:    add si,num                                                                   
         mov al,[si]                          ;取当前加电数据
 	      mov dx,300h                          ;取8255的端口A的地址 
         out dx,al                            ;输出加电数据到端口A    
         inc num                              ;改变数字变量的值                            
         cmp  num,08h
         jne  next
         mov num,00h
next:    ret
ledflash endp


cseg     ends
         end start



⌨️ 快捷键说明

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