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

📄 clock.asm

📁 包含串行通行的收发程序、电子钟、AD、DA转换、LED按键显示等的源代码
💻 ASM
字号:
data segment para'data'
     port equ 280h
     port_led equ 2b0h
     old_0b  dw 0,0
     time db 2,3,5,9,5,0
     old_8259 db 0
     code_led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh
data ends

sstack segment stack'stack'
      db 256 dup(?)
sstack ends

code segment
     assume cs:code,ds:data,ss:sstack,es:data
main proc far
     mov ax,data
     mov es,ax
     mov ds,ax
     
     mov al,00110110b     ;初始化8253,选择计数器0,LSB,MSB,方式3,2进制计数
     mov dx,port+3
     out dx,al
     mov ax,1000
     mov dx,port
     out dx,al
     mov al,ah
     out dx,al
     
     mov al,01110110b     ;选择计数器1,LSB,MSB,方式3,2进制计数,与计数器0级联
     mov dx,port+3
     out dx,al
     mov ax,1000
     mov dx,port+1
     out dx,al
     mov al,ah
     out dx,al


     mov ax,350bh         ;保护原中断
     int 21h
     mov old_0b,bx
     mov old_0b+2,es
     
     push ds
     mov ax,250bh         ;设置新中断
     mov dx,offset int_0b
     mov bx,seg int_0b
     mov ds,bx     
     int 21h
     pop ds

     in al,21h             
     mov old_8259,al		;保存当前中断屏蔽标志
     
     and al,11110111b		;清除中断屏蔽位
     out 21h,al
     sti			;开中断

display:mov si,0		;显示时间
      mov bl,00000001b		;用于数码管位选
display1:                

     mov dx,port_led
     mov al,bl
     out dx,al 
     
     mov dx,port_led+1
     mov al,time[si]		;选择小时、分、秒
     mov ah,0
     mov di,ax
     mov al,code_led[di]	;显示小时、分、秒
     out dx,al
     call delay			;延时
     
     rol bl,1			;左旋bl
     inc si
     cmp al,10000000B   
     jz display			;显示完秒的低位,继续循环显示
     jmp display1
     
     mov ah,1
     int 16h
     jnz old_int		;有键按下,恢复原中断
     jmp display1

old_int:                     
     cli			;关中断

     push ds			;恢复原中断		
     mov dx,old_0b
     mov ax,old_0b+2
     mov ds,ax
     mov ax,250bh
     int 21h
     pop ds

     mov al,old_8259		;恢复原中断屏蔽标志
     out 21h,al

     mov ah,4ch
     int 21h
main endp

int_0b  proc far           	;中断服务程序

     cmp time+5,9	   	;比较秒的低位
     je a1
     inc time+5			;加一秒
     jmp exit

a1:
     mov time+5,0
     inc time+4			;加十秒
     cmp time+4,6		;比较秒的高位
     jne exit

     mov time+4,0
     inc time+3			;加一分
     cmp time+3,10		;比较分的低位
     jne exit

     inc time+2			;加十分
     mov time+3,0
     cmp time+2,6		;比较分的高位
     jne exit

     inc time+1			;加一小时
     mov time+2,0
     cmp time,2			;比较时的高位
     je a2

     cmp time+1,4		;比较时的低位
     jne exit

     inc time			;加十小时
     mov time+1,0
     jmp exit

a2:
     cmp time+1,4
     jne exit
 
     mov time,0
     mov time+1,0

exit:
     mov al,20h			;EOI,结束中断
     out 20h,al

     iret
int_0b endp

delay proc near			;延时子程序
        mov ax,0066h
        
d2:       mov dl,0ffh
d1:       dec dl
          jnz d1
          dec ax
          jnz d2
          ret
delay endp 
code ends
     end main

⌨️ 快捷键说明

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