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

📄 时钟.asm

📁 时钟程序,用汇编语言写成,功能包括计时,闹钟,设置时间
💻 ASM
字号:

;*******************************;
;* 用中断方式获取8253的1秒钟计时,实现00~59循环计数 *;
;*******************************;
data segment
io8255a        equ 28ah  ;C
io8255b        equ 28bh  
io8255c        equ 288h  ;A
io8255d        equ 289h  ;B

io8253a        equ 280h
io8253b        equ 281h
io8253c        equ 283h

led      db   3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh ;段码
buffer1  db   0,0         ;存放要显示的十位和个位
bz       dw   ?           ;位码
data ends
code segment
assume cs:code,ds:data
start:
    mov ax,cs
    mov ds,ax
    mov dx,offset int3
    mov ax,250bh
    int 21h
    
    in al,21h
    and al,0f7h
    out 21h,al
    
    mov dx,io8253c     ;向8253写控制字
    mov al,36h       ;使0通道为工作方式3
    out dx,al
    mov ax,1000      ;写入循环计数初值1000
    mov dx,io8253a
    out dx,al        ;先写入低字节
    mov al,ah
    out dx,al        ;后写入高字节
    mov dx,io8253c
    mov al,76h       ;设8253通道1工作方式2
    out dx,al
    mov ax,1000      ;写入循环计数初值1000
    mov dx,io8253b
    out dx,al        ;先写低字节
    mov al,ah
    out dx,al        ;后写高字节

disp:  
    mov ax,data
    mov ds,ax
    mov dx,io8255b            ;将8255设为A口输出,B口输入
   ; mov al,80h              ;1000 0000
     mov al,82h              ;1000 0010
    out dx,al
    mov di,offset buffer1      ;设di为显示缓冲区
    
ll:loop ll
loop1:    mov bh,02
lll:    mov byte ptr bz,bh
    push di
    dec di
    add di, bz
    mov bl,[di]                  ;bl为要显示的数
    pop di
    mov bh,0
    mov si,offset led            ;置led数码表偏移地址为SI
    add si,bx                    ;求出对应的led数码
    mov al,byte ptr [si]
    mov dx,io8255c               ;自8255A的口输出
    out dx,al
    mov al,byte ptr bz           ;使相应的数码管亮
    mov dx,io8255a
    out dx,al
    push cx
        mov cx,100                 
delay:    loop delay                  ;延时
      pop cx
      
    mov al,00h
    out dx,al
    
    mov bh,byte ptr bz
    shr bh,1
    jnz lll
    jmp loop1               ;循环延时

   sti
    
int3: 
    mov  ax,word ptr [di]
    cmp  ah,05
    jnz  set
    cmp  al,09
    jnz  set
    mov  ax,0000
    mov  [di],al
    mov  [di+1],ah
    jmp OUT1
set:    
    mov  ah,01
    int  16h
    jne  exit                   ;有键按下则转exit
    mov  ax,word ptr [di]
    inc  al
    aaa
    mov [di],al                 ;al为十位
    mov [di+1],ah               ;ah中为个位
  
      
OUT1:
    mov al,20h
    out 20h,al
    jmp next
    in al,21h
    or al,08h
    out 21h,al
    sti
    
    
exit:
    mov ah,4ch
    int 21h
next:    iret
    code ends
    end start

⌨️ 快捷键说明

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