?? clock.txt
字號(hào):
;****************************************************************************************
; 微機(jī)接口課程設(shè)計(jì)程序
; 電子鐘
;
;
;8255用作讀鍵盤信息,cs為220h
;8253提供時(shí)鐘信號(hào),cs為230h
;led采用動(dòng)態(tài)顯示,cs為210h
;
;文件名 :clock.asm
;作者 :吳光文
;版本 : 0.6
;2006年12月27日
;
;相對(duì)與版本0.5有以下改進(jìn):
;將壓縮BCD碼表示的時(shí)、分、秒十進(jìn)制數(shù)分解到六個(gè)字節(jié)中,用了更加簡潔的算法。
;****************************************************************************************
csledslc equ 210h ;數(shù)碼管選擇位
csledword equ 211h ;數(shù)碼管筆形碼輸出地址
cs8255a equ 220h ;8255的a口地址
cs8255b equ 221h ;8255的b口地址
cs8255ctr equ 223h ;8255的控制字地址
cs8253t0 equ 230h ;8253的t0地址
cs8253t1 equ 231h ;8253的t1地址
cs8253ctr equ 233h ;8253的控制字地址
.model small
.stack 50
;****************************************************************************************
;數(shù)據(jù)段
;****************************************************************************************
.data
buf db 0,0,0,0,0,0 ;顯示緩沖區(qū)
;數(shù)碼管筆形碼
led db 3fh,06h,5bh,4fh,66h,6dh,7dh,07h,7fh,6fh,80h
hour db 08h ;時(shí)緩沖單元
min db 30h ;分緩沖單元
sec db 30h ;秒緩沖單元
msec db 0 ;毫秒緩沖單元
dex db 0 ;筆形碼索引值
;鍵盤編碼表
keytab dw 57fh,5bfh,5dfh,5efh,5feh,5fdh,5fbh,5f7h
dw 67fh,6bfh,6dfh,6efh,6feh,6fdh,6fbh,6f7h
keyend dw 7ffh
agekey db 12 ;鍵齡
oldkey dw 0 ;鍵碼字保存
keynum db 0 ;鍵號(hào)
keyok db 0 ;按鍵響應(yīng)標(biāo)記
state db 0 ;系統(tǒng)狀態(tài),0-運(yùn)行態(tài);1-修改態(tài)
keymd db 0 ;修改鍵標(biāo)記,A-修改時(shí);B-修改分;C-修改秒
stime db 0 ;時(shí)間設(shè)定單元,保存鍵盤輸入的時(shí)間
;****************************************************************************************
;代碼段
;****************************************************************************************
.code
;****************************************************************************************
;主程序:
;
;實(shí)現(xiàn)8253的設(shè)置,中斷向量的設(shè)置,檢測系統(tǒng)大鍵盤信號(hào),有按鍵就結(jié)束程序返回系統(tǒng)。
;****************************************************************************************
main proc far
start: mov ax,@data ;設(shè)置數(shù)據(jù)段和附加段
mov ds,ax
mov es,ax
cli ;關(guān)中斷
;設(shè)置8253,t1,方式2,輸入250kHz,輸出200Hz
mov dx,cs8253ctr
mov al,74h
out dx,al
mov dx,cs8253t1
mov ax,1250
out dx,al
mov al,ah
out dx,al
;保存原中斷向量
mov al,0bh
mov ah,35h
int 21h
push es
push bx
push ds
;設(shè)置新中斷向量
mov dx, offset intpro
mov ax,seg intpro
mov ds,ax
mov al,0bh
mov ah,25h
int 21h
;打開中斷屏蔽
pop ds
in al,21h
and al,0f7h
out 21h,al
sti ;開中斷
;等待按鍵,返回系統(tǒng)
wat: mov ah,1
int 16h
jz wat
;回復(fù)中斷向量
pop dx
pop ds
mov al,0bh
mov ah,25h
int 21h
;退出程序,返回系統(tǒng)
mov ax,4c00h
int 21h
;****************************************************************************************
;中斷子程序:
;
;完成時(shí)鐘處理、鍵盤監(jiān)控和顯示功能
;****************************************************************************************
intpro proc near
push ds ;保存寄存器
push ax
push cx
push dx
mov ax,@data ;設(shè)置數(shù)據(jù)段和代碼段寄存器
mov ds,ax
mov es,ax
cmp state,1 ;不是修改狀態(tài)才走時(shí)鐘
jne clk
jmp next
;****************************************************************************************
;時(shí)鐘處理模塊,以5毫秒為單位調(diào)整時(shí)、分、秒。
;****************************************************************************************
clk: inc msec
cmp msec,200
jne next
mov msec,0
mov al,sec
add al,1
daa
mov sec,al
cmp sec,60h
jne next
mov sec,0
mov al,min
add al,1
daa
mov min,al
cmp min,60h
jne next
mov min,0
mov al,hour
add al,1
daa
mov hour,al
cmp hour,24h
jne next
mov hour,0
;****************************************************************************************
;鍵盤監(jiān)控模塊
;****************************************************************************************
next: dec agekey
jz next1
jmp dsp
next1: mov agekey,12
mov dx,cs8255ctr ;設(shè)置PA輸出,PB輸入
mov al,82h
out dx,al
mov al,0 ;A口輸出低電平,讀B口
mov dx,cs8255a
out dx,al
mov dx,cs8255b
in al,dx
mov bh,al
mov dx,cs8255ctr ;設(shè)置PB輸出,PA輸入
mov al,90h
out dx,al
mov al,0 ;b口輸出低電平,讀a口
mov dx,cs8255b
out dx,al
mov dx,cs8255a
in al,dx
mov bl,al ;讀鍵結(jié)束,BX中保存為鍵碼
and bx,7ffh ;去除鍵碼中無用位數(shù)
cmp bx,7ffh
jne keyon ;有按鍵則進(jìn)入按鍵處理
mov keyok,0 ;無按鍵則清除響應(yīng)標(biāo)志退出按鍵處理
jmp dsp
keyon: cmp bx,oldkey
je keyon1 ;已經(jīng)去抖動(dòng)則直接處理按鍵
mov agekey,4 ;有新按鍵則設(shè)置鍵齡退出中斷
mov keyok,0
mov oldkey,bx
jmp dsp
keyon1: cmp keyok,1
jne l1 ;按鍵已響應(yīng)則退出鍵盤處理
jmp dsp
l1: mov keyok,1 ;設(shè)立按鍵響應(yīng)標(biāo)記
std
lea di,keyend ;指向鍵碼表
mov ax,bx ;讀取鍵號(hào),地址遞減,cx的值為鍵號(hào)
mov cx,17
repne scasw
je keyon2
jmp dsp
keyon2: mov keynum,cl ;保存鍵號(hào)
cmp state,0 ;系統(tǒng)在修改態(tài)否?
jne keyon3 ;跳到修改態(tài)的處理
cmp keynum,0ah ;為A鍵否
jne keyb
mov keymd,1 ;作a鍵修改標(biāo)志
mov hour,0aah ;小時(shí)顯示為..
mov state,1 ;進(jìn)入修改態(tài)
jmp dsp
keyb: cmp keynum,0bh ;為B鍵否
jne keyc
mov keymd,2 ;作b鍵修改標(biāo)志
mov min,0aah ;分鐘顯示為..
mov state,1 ;進(jìn)入修改態(tài)
jmp dsp
keyc: cmp keynum,0ch ;為c鍵否
je keyc1
jmp dsp
keyc1: mov keymd,3 ;作c鍵修改標(biāo)志
mov sec,0aah
mov state,1 ;秒顯示為..
jmp dsp
keyon3: cmp keynum,9 ;在修改態(tài),判斷是否為數(shù)字鍵
jbe keyn ;<=9則認(rèn)為是數(shù)字鍵
jmp keyen ;否則判斷是否為確定鍵
keyn: mov al,stime ;讀取輸入時(shí)間,十進(jìn)制格式
mov cl,4
shl al,cl ;在確定以前最后輸入的兩個(gè)十進(jìn)制數(shù)有效
or al,keynum
mov stime,al
jmp dsp
keyen: cmp keynum,0fh ;處理f鍵
je keyen1
jmp dsp
keyen1: mov state,0 ;恢復(fù)到運(yùn)行態(tài)
cmp keymd,1 ;將修改內(nèi)容送小時(shí)單元
jne keyen2
mov keymd,0 ;清除修改小時(shí)標(biāo)志
cmp stime,24h ;判斷輸入時(shí)間是否>=24
jb keyen3
mov hour,0 ;大于24時(shí),輸入為0
mov stime,0 ;清除時(shí)間單元
jmp dsp
keyen3: mov al,stime
mov hour,al ;小于24時(shí),輸入設(shè)定時(shí)間
mov stime,0 ;清除時(shí)間單元
jmp dsp
keyen2: cmp keymd,2 ;將修改分鐘標(biāo)志
jne keyen4
mov keymd,0 ;清除修改分鐘標(biāo)志
cmp stime,60h
jb keyen5
mov min,0
mov stime,0
jmp dsp
keyen5: mov al,stime
mov min,al
mov stime,0
jmp dsp
keyen4: cmp keymd,3 ;將修改秒
jne dsp
mov keymd,0
cmp stime,60h
jb keyen6
mov sec,0
mov stime,0
jmp dsp
keyen6: mov al,stime
mov sec,al
mov stime,0
;****************************************************************************************
;顯示模塊
;****************************************************************************************
;將時(shí)、分、秒信號(hào)拷貝到顯示緩沖區(qū)
dsp: mov si,0
mov di,0
mov cl,4
lp1: mov al,byte ptr hour[si]
mov ah,0
ror al,cl
shr ah,cl
mov word ptr buf[di],ax
inc si
inc di
inc di
cmp si,3
jne lp1
mov cl,dex ;顯示數(shù)碼管的某一位
mov al,1
rol al,cl
mov dx,csledslc
out dx,al
mov al,dex
mov ah,0 ;0擴(kuò)展到ax
mov si,ax
mov bl,buf[si]
mov bh,0
mov al,led[bx]
mov dx,csledword
out dx,al
inc dex
cmp dex,6
jne exit
mov dex,0
exit: mov al,20h
out 20h,al
pop dx
pop cx
pop ax
pop ds
iret
intpro endp
end start
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -