clock

.486p

code segment use16
assume cs:code
ORG 03000H

BEG:jmp start

tab db 0c0h,0f9h,0a4h,0b0h,099h,092h,082h,0f8h,080h,090h,088h,083h,0c6h,0a1h,086h,08eh
porta1 equ 200h
portb1 equ 204h 
portc1 equ 208h
portp1 equ 20ch
porta2 equ 201h
portb2 equ 205h 
portc2 equ 209h
portp2 equ 20dh
porta3 equ 202h
portb3 equ 206h 
portc3 equ 20ah
portp3 equ 20eh
porta4 equ 203h
portb4 equ 207h 
portc4 equ 20bh
portp4 equ 20fh
hour dw 23
min  dw 59
sec  dw 50
count db 0
c10 db 10
BIT EQU 10111111B
PORT2 EQU 360H
PORT1 EQU 340H
ROW DB 01H,02H,04H,08H 
step db 0
time dw 0
stop dw 0ffh
start:mov ax,0
      mov ds,ax
      ;关中断
      cli


      ;8255初始化
      mov al,80h;A口方式0,输出;B口方式0;C口输出
      mov dx,20eh
      out dx,al
      mov dx,20dh
      out dx,al
      mov dx,20ch
      out dx,ax
      mov al,80h
      mov dx,20fh
      out dx,al
      mov dx,portb4;203h口
      mov al,0ffh
      out dx,al
     


 

     ;8253 out0产生25ms信号
      mov dx,30ch;8255CS接300h
      mov al,00110100b ;   计数器0,读写低八位,方式2,2进制
      
      out dx,al
      mov al,01110110b ;   计数器1,读写低八位,方式3,2进制
      out dx,al
      mov ax,37500;初值 
      mov dx,300h;计数器0
      out dx,al
      mov al,ah
      out dx,al 

;8253 out1产生25MS方波
      mov dx,30ch
      mov ax,47000; 
      mov dx,304h;计数器1//308
      out dx,al
      mov al,ah
      out dx,al 

 


;中断向量设置
      mov ax,offset interupt;中断程序的入口地址
      mov bx,20h
      mov [bx],ax
      mov ax,cs
      mov [bx+2],ax;/?????????????
      
      
      ;8259init
       mov dx,3a0h
       mov al,00010011b ;        ICW1
       out dx,al
       mov dx,3a8h
       mov al,00001000b;IR0的中断类型号08H        ICW2
       ;mov dx,3a8h
       out dx,al
       
       mov al,00000101b;        ICW4//00000001
       out dx,al
   

       ;写屏蔽字
       mov al,11111110b;         只有IRQ0允许
       mov dx,3a8h
       out dx,al
aga:       sti             ;         开中断
       ;输入程序
WT:
 MOV AL,00H
 MOV DX,PORT2       
 OUT DX,AL           ;使数码管全灭的同时,列线输出0判断是否有键按下
 
 MOV DX,PORT2         ;360H地址          
 IN AL,DX            ;是否有键按下
 
 NOT AL
 AND AL,0FH
 JNZ LK1               ;有,转 
 JMP WT     ;无键,继续查询等待
LK1:          
 CALL  DELY
 MOV AL,00H
 MOV DX,PORT2
 OUT DX,AL
                           ;再次确认是否有键按下
 MOV DX,PORT2
 IN AL,DX
 NOT AL
 AND AL,0FH
 JZ WT    
MOV CL,00H      ;有键,识别按键,CL为列计数器
 MOV BL,0feH               ;第0列
LK4: MOV AL,BL
 MOV DX,PORT2
 OUT DX,AL
 MOV DX,PORT2
 IN AL,DX
 NOT AL
 AND AL,0FH               ;结果为行值
 JNZ KEYDOWN     ;此列有键按下,计算键值
 
NEXT: INC CL     ;扫描下一列
 TEST BL,08H                                                                                                                                                                                                        
 JZ WT
 ROL BL,1
 JMP LK4

KEYDOWN:
 MOV BX,0 

CMPROW: CMP AL,ROW[BX]   
 JZ KEY;/stop
 INC  BX
 JMP CMPROW                                       
KEY:  IMUL  BX,3
        mov     ah,0
 ADD CL,BL 
        mov     al,cl
        cmp     al,10
        jnz     goto1
        cmp     stop,0
        jnz     p1
        mov     stop,1
        jmp     goto2
p1:     mov     stop,0
        jmp    goto2
goto1:  cmp     al,11
        jnz     goto2
        mov     stop,0
        mov     step,1
aga1:   call    input

        cmp     step,1
        ja      cmp2
        mov     ax,time
        imul    ax,10
        mov     hour,ax
        inc     step
        jmp     aga1
        
        
cmp2:   cmp     step,2
        ja      cmp3
        mov     ax,time
        add     hour,ax
        inc     step
        jmp     aga1
cmp3:   cmp     step,3
        ja      cmp4
        mov     ax,time
        imul    ax,10
        mov     min,ax
        inc     step
        jmp     aga1
        
cmp4:   cmp     step,4
        ja      cmp5
        mov     ax,time
        add     min,ax
        inc     step
        jmp     aga1
cmp5:   mov     step,0
        mov     stop,1
goto2:  jmp    aga
        
        

 


;中断程序
interupt proc far
          


           
      push ax
      push bx
      push cx
      push dx
       lea bx,tab
           ;显示秒
 
           mov cx,sec
           mov ax,cx
           div c10


      
           mov dx,porta3
           push ax
           mov ah,0
           xlat
           out dx,al
           pop ax
     


           mov dx,portb3
           mov al,0
           xchg ah,al
           xlat
           out dx,al

           ;分钟
           mov cx,min
           mov ax,cx
           div c10


      
           mov dx,porta2
           push ax
           mov ah,0
           xlat
           out dx,al
           pop ax
     


           mov dx,portb2
           mov al,0
           xchg ah,al
           xlat
           out dx,al


           ;小时
           mov cx,hour
           mov ax,cx
           div c10


      
           mov dx,porta1
           push ax
           mov ah,0
           
           xlat
           out dx,al
           pop ax
     


           mov dx,portb1
           mov al,0
           xchg ah,al
           xlat
           out dx,al
 

           
           cmp stop,0
           
           jz  exit
          cmp hour,24
           jl  aa
           mov hour,0
aa:        cmp min,60
           jl  bb
           mov min,0
bb:        
      
      inc count
      ;响铃时间为0.5秒
      cmp count,20
      jl  exit
      mov al,0ffh
      mov dx,portb4
      out dx,al
      cmp count ,40
      jl  exit
      mov count,0
      inc sec
      cmp min,59
      jl skip
      cmp sec,55
      jl exit

      
      mov al,00h
      mov dx,portb4
      out dx,al
      skip: cmp sec,60
            jl exit
            mov sec,0
            inc min
            cmp min,60
            jl exit
            mov min,0
            
            
            mov al,0ffh
            mov dx,portb4
            out dx,al
            inc hour
            cmp hour,24
            jl exit
            mov hour,0
           exit:mov al,00100000b;     中断结束EOI 
           mov dx,3a0h
           out dx,al
     pop dx
     pop cx
     pop bx
     pop ax
     iret
interupt endp

DELY  proc
   PUSH CX
  MOV CX,0ffffH
 
  
 LOOP $
 POP CX
 REt
 dely endp
;//键盘 
input  proc
      
      push ax
      push bx
      push cx
      push dx
wt1:
 MOV AL,00H
 MOV DX,PORT2       
 OUT DX,AL                 ;使数码管全灭的同时,列线输出0判断是否有键按下
 
 MOV DX,PORT2          
 IN AL,DX                 ;是否有键按下
 
 NOT AL
 AND AL,0FH
 JNZ lk11                   ;有,转 
 JMP wt1        ;无键,继续查询等待
lk11:          
 CALL  DELY
 MOV AL,00H
 MOV DX,PORT2
 OUT DX,AL
                             ;再次确认是否有键按下
 MOV DX,PORT2
 IN AL,DX
 NOT AL
 AND AL,0FH
 JZ wt1                   
 
 MOV CL,00H   ;有键,识别按键,CL为列计数器
 MOV BL,0feH                 ;第0列
lk44: MOV AL,BL
 MOV DX,PORT2
 OUT DX,AL
 MOV DX,PORT2
 IN AL,DX
 NOT AL
 AND AL,0FH                  ;结果为行值
 JNZ KEYDOWN1   ;此列有键按下,计算键值
 
next1: INC CL   ;扫描下一列
 TEST BL,08H
 JZ wt1
 ROL BL,1
 JMP lk44

KEYDOWN1:
 MOV BX,0   ;BX为行计数器,判断哪一行有按键
CMPROW1:CMP AL,ROW[BX]   
 JZ KEY1
 INC  BX
 JMP CMPROW1
KEY1:  IMUL  BX,3
        mov     ah,0
 ADD CL,BL 
        mov     al,cl
        mov     time,ax
        pop dx
        pop cx
        pop bx
        pop ax
        ret
input  endp
 
CODE ENDS
 END beg
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值