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

📄 jh2.asm

📁 本题目的主要要求是要实现闹钟的功能内容:设计一个能够显示时分秒的数字时钟
💻 ASM
字号:
C8253 EQU 22BH
;8253控制口
JSQ0 EQU 228H  ;通道0
Z8279 EQU 212H ;8279控制口
D8279 EQU 210H ;8279数据口
O8259 EQU 200H ;8259偶地址
J8259 EQU 201H ;8259奇地址

CODE SEGMENT
ASSUME  CS:CODE
START PROC FAR
  PUSH DS
  MOV AX,0
  PUSH AX
  JMP SSTT
LED DB 3FH,06H,5BH,4FH,66H;0—9 的LED显示
    DB 6DH,7DH,07H,7FH,6FH
ap  dw 7700h
HOUR DW 11 ;小时
MIN DW 59 ;分钟
SEC DW 40 ;秒
ap1  dw 7300h
HOUR1 DW 0 ;小时
MIN1 DW 0 ;分钟
SEC1 DW 10 ;秒
zd   db 1
dn  db 0
edd  db 0


DISPCODE DB 8 DUP(0)  ;用于存放每次的计数值
SSTT:
   cli
   MOV AX,CS
   MOV DS,AX
;----------8255初始化-----------
  mov  al,80h
  mov  dx,233h
  out  dx,al
  mov  dx,230h
  mov  al,0ffh
  out  dx,al
;--------8253初始化-------
  MOV DX,C8253 
  MOV AL,00110110B ;通道0,先读/写计数器低字节,后读/写高字节,方式3,二进制计数
  OUT DX,AL
  MOV DX,JSQ0;从通道0输出计数初值3000
  MOV AX,3000 
  OUT DX,AL 
  MOV AL,AH
  OUT DX,AL  
 MOV DX,C8253
  MOV AL,01110110B ;通道1,先读/写计数器低字节,后读/写高字节,方式3,二进制计数
  OUT DX,AL
  MOV DX,229h ;从通道0输出计数初值100
  MOV AX,100
  OUT DX,AL 
  MOV AL,AH
  OUT DX,AL 
;------8259初始化------
  MOV DX,O8259 
  MOV AL,13H ;00010011B,边缘触发,单级使用
  OUT DX,AL;--ICW1----
  MOV DX,J8259 
  MOV AL,08H ;中断类型码
  OUT DX,AL ;---ICW2----
  MOV AL,01H ;非特殊完全嵌套方式,非缓冲方式,非自动EOI方式
  OUT DX,AL  ;---ICW4---
  MOV AL,0FEH ;仅保留IR0的中断请求,屏蔽掉IR1—IR7的中断请求
  OUT DX,AL ;---OCW1----
;------中断向量表的装填-------08H*4=20H-----
  PUSH  DS
  MOV  AX,0
  MOV  DS,AX

  MOV  BX,OFFSET INT0
  MOV  SI,20H
  MOV  [SI],BX

  MOV  BX,CS
  MOV  SI,22H
  MOV  [SI],BX
  POP DS
;----8279初始化-------
  MOV  DX,Z8279
  MOV  AL,00H ;8字符显示,左入口,编码扫描键盘,双键所定
  OUT  DX,AL
  MOV  AL,38H ;24分频
  OUT  DX,AL
   mov  di,offset ap
  call xianshi

sti



t4:   mov  di,offset ap
      sti
      mov cx,90h
      push cx
t2:   mov ah,01h
      mov dx,212h
      in al,dx
      and al,0fh
jz t1

      mov  al,40h
      out dx,al
      mov dx,210h
      in al,dx

      cmp al,0ah      ;a为调时间
jnz y0
      cli
      mov ah,0h
      lea di, ap
      jmp aa
y0:   cmp al,0ch      ;c为调定时
      jnz t4
      
      mov ah,0h
      lea di, ap1
aa:   
t5:   mov  dx,212h
      pop  cx
      push cx
      mov  al,cl
      out  dx,al
      mov  dx,210h
      mov  cx,2h
      mov  al,0
  t:  out  dx,al
      loop t
      mov  cx,0ffffh
      loop $
t1:
call  xianshi
      cmp  ah,1h
jz    t2
      mov  cx,0ffffh
      loop $


      mov dx,212h
      in al,dx
      and al,0fh
jz t5
      mov  al,40h
      out dx,al
      mov dx,210h
      in al,dx
      cmp al,13h     ;读‘+’号加1
      jnz t3
       
      pop cx
      push cx
      cmp  cx,90h
      jnz  loop22
      mov  bx,1
      ADD 6[di],bx
     
        mov bx,60
        CMP 6[di],bx
        JNZ t5 ;SEC≠60时跳
        mov  bx,0
        MOV 6[di],bx
        jmp t5
     LOOP22:   
      cmp  cx,92h
      jnz  loop33
      mov  bx,1
      ADD 4[di],bx

      mov bx, 60
      CMP 4[di],bx
      JNZ t5;MIN≠60时跳转
      mov bx,0
      MOV 4[di],bx
      jmp t5
     LOOP33:   
      mov bx,1
      ADD 2[di],bx
      mov bx,12
      CMP 2[di],bx
     JNZ t5 ;HOUR≠12时跳转
      mov bx, 0
      MOV 2[di],bx
     cmp [di],7700h
     jz f11
     mov [di],7700h
     jmp loop44
 f11:mov [di],7300h
LOOP44:  jmp  t5


 t3:  cmp al,12h     ; 读‘-’号 改另一个
      jz  tt5
      jmp t5
           
 tt5: pop cx
      add cx,2
      push cx   
      cmp  cx,96h
      jnz   tt4 
      jmp  t4

 tt4: jmp t5
     


  


xianshi proc
     push di
     push ax
     mov  si,di
     MOV  BX,OFFSET LED
     MOV  DI,OFFSET DISPCODE
     MOV  AX,6[si]
     CALL  HUANMA
     MOV  AX,4[si]
     CALL  HUANMA
     MOV  AX,2[si]
     CALL  HUANMA
     mov   ax,[si]
     mov   [di],al
     mov   1[di],ah 
;----------显示部分--------
     MOV  DX,Z8279
     MOV  AL,90H
     OUT  DX,AL ;写显示RAM命令
     MOV  DX,D8279
     MOV  DI,OFFSET DISPCODE
     MOV  CX,8
LOP1:
     MOV AL,[DI]
     OUT DX,AL
     INC DI
     LOOP LOP1
     pop ax
     pop di
     ret
xianshi endp
HUANMA PROC
     MOV  CL,10
     DIV  CL ;AX/CL,商在AL中,余数在AH中
     PUSH AX
     MOV AL,AH
     LEA BX,LED
     XLAT
     MOV [DI],AL
     INC DI
     POP AX
     XLAT
     MOV [DI],AL
     INC DI
    RET
HUANMA ENDP
INT0 PROC
  PUSH AX
  PUSH DX
  push cx
  push bx
  ADD SEC,1
LOOP1:
  cmp zd,1
  jz  mn

  mov al,0ffh
  mov dx,230h
  out dx,al
  mov al,1
  mov zd,al
  
mn: mov bl,[edd]
   cmp bl,0
   jz  n1
   mov bx,[sec]
   cmp dn,bl
   jnz n1

   mov al,0ffh
   mov dx,230h
   out dx,al
   mov al,0
   mov [edd],al

n1:
  CMP SEC,60
  JNZ LOOP2 ;SEC≠60时跳转
  MOV SEC,0
  ADD MIN,1
LOOP2:
  CMP MIN,60
  JNZ LOOP3 ;MIN≠60时跳转
  MOV MIN,0
  ADD [HOUR],1

  mov al,0feh
  mov dx,230h
  out dx,al
  mov al,0
  mov zd,al

LOOP3:
  CMP HOUR,12
  JNZ LOOP4 ;HOUR≠12时跳转
  MOV HOUR,0
  cmp ap,7700h
  jz f1
  mov ap,7700h
  jmp loop4
f1:mov ap,7300h 
  
LOOP4:

   mov ax,hour
   cmp ax,hour1
   jz  m1
   jmp  m
m1:mov ax,min
   cmp ax,min1
   jz  m2
   jmp  m
m2:mov ax,sec
   cmp ax,sec1
   jz   m3
   jmp  m
m3:mov ax,sec
   cmp ax,sec1
   jz   m4
   jmp  m
m4:mov  al,1
   mov  edd,al
   mov  ax,sec
   mov  dn,al
   mov  al,0fh
   mov  dx,230h
   out  dx,al
   








m:  MOV DX,O8259
  MOV AL,20H ;普通EOI结束方式
  OUT DX,AL ;---OCW2----
  pop bx
  pop cx  
  POP DX
  POP AX
  IRET ;中断返回
INT0 ENDP
  MOV AH,4CH
  INT 21H
START ENDP
CODE ENDS
  END START



    

⌨️ 快捷键说明

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