.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
clock
最新推荐文章于 2024-05-22 16:25:14 发布