📄 电子钟标准版_微机原理课程设计.txt
字号:
电子钟标准版
.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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -