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

📄 电子时钟.asm

📁 用8253-8255编写的定时响铃程序 可以定时两个时间点
💻 ASM
字号:
.model small
.386
.data
 keep21 db ?
 count db ?
 mess1 db 'Input the time like hh:mm:ss',0dh,0ah,'$'
 string db 12,?,9 DUP(0),0dh,0ah,'$'
 timetable1 db 12,?,9 DUP(0),0dh,0ah,'$'
 timetable2 db 12,?,9 dup(0),0dh,0ah,'$'
 string2 db 'Input your timetable1',13,10,'$'
 string4 db 'Input your timetable2',13,10,'$'
 string3 db 13,10,'$'
 time db 0f3h,60h,0b5h,0f4h,066h,0d6h,0d7h,070h,0f7h,0f6h
 sound db 0
.stack
.code
start:
      mov ax,@data
      mov ds,ax
      mov dx,offset mess1  ;输出提示语句
      mov ah,09h
      int 21h

      mov ah,0ah           ;以字符串形式将输入的时间值存入数据区
      mov dx,offset string
      int 21h
      
      mov dx,offset string3  ;输出提示语句
      mov ah,09h
      int 21h
      mov dx,offset  string2
      mov ah,09h
      int 21h
      mov ah,0ah           ;以字符串形式将输入的时间值存入数据区
      mov dx,offset    timetable1
      int 21h
      
      mov dx,offset string3  ;输出提示语句
      mov ah,09h
      int 21h
      mov dx,offset  string4
      mov ah,09h
      int 21h
      mov ah,0ah           ;以字符串形式将输入的时间值存入数据区
     mov dx,offset    timetable2
      int 21h
      
      mov count,0

;8259的初始化
      cli
      mov ah,35h            ;读中断
      mov al,0fh            ;中断IRQ7
      int 21h
      push bx
      push es
      push ds

      mov ax,seg intproc     ;取中断地址
      mov ds,ax
      mov dx,offset intproc
      mov ah,25h             ;写中断
      mov al,0Fh
      int 21h
      pop ds

;8253的初始化
      mov dx,233h   ;控制字端口 230,(或者213--210)
      mov al,36h    ;CNT0控制字
      out dx,al
      mov dx,230h   ;230口
      OUT DX,AL     ;0端口
      MOV AH,10H
      MOV AL,27H
      OUT DX,AL
;8255 初始化
      mov dx,253h
      mov al,80h
      out dx,al
      mov dx,250h
      mov al,00h
      out dx,al
;8279 初始化
      mov dx,271h
      mov al,06h
      out dx,al
      mov dx,271h
      mov al,2ah
      out dx,al
      ;mov al,90h
      ;out dx,al
;清屏操作和光标设置
      in al,21h      ;读原中断
      mov keep21,al  ;保存原中断屏蔽字
      and al,7fh     ;允许IRQ7中断
      out 21h,al
      ;清屏
      mov bh,07h
      mov ah,07h
      mov al,0
      mov cx,0
      mov dh,24
      mov dl,79
      int 10h
      sti
again:
      mov ah,01h;判断键盘是否有键按下
      int 16h
      jz again
      mov ah,0h;读键盘输入
      int 16h
      cmp al,73h ;是否是s键按下
      jne nextstep1
      mov dx,250h
      in al,dx
      and al,11111110b
      out dx,al
nextstep1:
      cmp al,6eh  ;是否是n键按下
      jne nextstep2
      mov sound,00h
nextstep2:
      cmp al,01bh      ;是否输入 esc
      jne again

      mov al,keep21    ;恢复原中断
      out 21h,al
      pop ds
      pop dx
      mov ah,25h
      mov al,0fh
      int 21h

      mov ah,4ch
      int 21h
;***********************************
intproc proc far
      sti
      push ax
      push bx
      push ds
      mov ax,@data
      mov ds,ax
      
      
      mov dx,250h
      in al,dx
      xor al,sound
      out dx,al
      
      
      inc count
      cmp count,100
      jne exit         ;<=100跳转
      mov count,0    ;否则,count=0,秒个位加1

      mov dx,271h
      mov al,90h
      out dx,al

 mov dx,270h
      mov al,string[2]
      sub al,'0'
      mov bl,al
      mov bh,0
      mov al,time[bx]
      out dx,al
      mov al,string[3]
      sub al,'0'
      mov bl,al
      mov bh,0
      mov al,time[bx]
      out dx,al
      mov al,string[5]
      sub al,'0'
      mov bl,al
      mov bh,0
      mov al,time[bx]
      out dx,al
      mov al,string[6]
      sub al,'0'
      mov bl,al
      mov bh,0
      mov al,time[bx]
      out dx,al
      mov al,string[8]
      sub al,'0'
      mov bl,al
      mov bh,0
      mov al,time[bx]
      out dx,al
      mov al,string[9]
      sub al,'0'
      mov bl,al
      mov bh,0
      mov al,time[bx]
      out dx,al
      
      mov si,0
next:
      mov al,string[si]
      cmp al,timetable1[si]
      jne cmp2
      cmp al,'$'
      je math
      inc si
      jmp next
cmp2:
      mov si,0
next1:
      mov al,string[si]
      cmp al,timetable2[si]
      jne nomatch
      cmp al,'$'
      je math1
      inc si
      jmp next1
math:
      mov ah,02h       ;设光标位置
      mov bh,0h
      mov dh,0bh
      mov dl,0ah
      int 10h
      mov dx,offset  timetable1
      mov ah,09h
      int 21h
      mov dx,250h
      mov al,01h
      out dx,al
      jmp nomatch
math1:
      mov ah,02h       ;设光标位置
      mov bh,0h
      mov dh,0ch
      mov dl,0ah
      int 10h
      mov dx,offset  timetable2
      mov ah,09h
      int 21h
      mov sound,10h
      jmp nomatch
nomatch:
      inc string+9
;秒个位10进制
      cmp string+9,39h
      jbe exit           ;<=9跳转
      mov string+9,30h   ;否则,秒个位赋0 ,秒十位加1
      inc string+8
;秒十位6进制
      cmp string+8,36h
      jb exit             ;<6跳转
      mov string+8,30h    ;否则,秒十位赋0,分个位加1
      inc string+6
;分个位10进制
      cmp string+6,39h
      jbe exit            ;<=9跳转
      mov string+6,30h    ;否则,分个位赋0,分十位加1
      inc string+5
;分十位6进制
      cmp string+5,36h
      jb exit              ;<6跳转
      mov string+5,30h     ;否则,分十位赋0,小时个位加1
      inc string+3
;小时12进制
      cmp string+3,34h
      jne go               ;小时个位<=4跳转
      cmp string+2,32h
      jne go               ;小时十位<=2跳转
      mov string+2,30h     ;否则,小时个位十位赋0
      mov string+3,30h
go:   cmp string+3,39h
      jbe exit              ;<=9跳转
      mov string+3,30h      ;否则,小时个位赋0,小时十位加1
      inc string+2
      


exit:

      mov al,20h
      out 20h,al       ;保存现场
      
      mov ah,02h       ;设光标位置
      mov bh,0h
      mov dh,0ah
      mov dl,0ah
      int 10h
      lea dx,string+2  ;送数据区1单元地址 ,输出时间
      mov ah,09h
      int 21h
      
      pop ds
      pop bx
      pop ax

    
    
      iret
intproc endp
        end start

⌨️ 快捷键说明

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