?? extint.asm
字號(hào):
;**************************************************************
;程序說(shuō)明: 本程序是一個(gè)外部中斷的子程序,因?yàn)镠aiYun51實(shí)驗(yàn)板上
; 有一個(gè)按鍵INT0是接到外部中斷0的引腳上的,所以可以通
; 過(guò)這個(gè)按鍵來(lái)做外部中斷的實(shí)驗(yàn).本實(shí)驗(yàn)中每按下一次INTO
; 按鍵就會(huì)對(duì)中斷計(jì)數(shù)器加一,并且計(jì)數(shù)器的值會(huì)顯示到
; 數(shù)碼管上.做這個(gè)實(shí)驗(yàn)的時(shí)候要把數(shù)碼管的電源選擇開(kāi)關(guān)
; 撥到ON的位置.
;MCU: AT89S52
;XTAL: 12MHZ
;作者: chhaich
;email: chhaich@163.com
;QQ: 406721773
;**************************************************************
uiContInt equ 40h ;16位整形中斷計(jì)數(shù)器數(shù)據(jù)
uiContIntHigt equ 41h ;高8位數(shù)據(jù)
uiContIntLow equ 40h ;低8位數(shù)據(jù)
aucDisplayBuff equ 50h ;顯示緩沖區(qū)
org 0000h ;程序開(kāi)始地址
ljmp main ;跳轉(zhuǎn)到main 執(zhí)行
org 0003h ;外部中斷入口地址
ljmp ExtIntFuntion ;跳轉(zhuǎn)到中斷處理子程序
org 0030h
main:
lcall InitExtInt ;初始化外部中斷
mainloop:
mov a,uiContIntHigt ;取中斷計(jì)數(shù)器的高8位數(shù)據(jù)到R6
mov r6,a
mov a,uiContIntLow ;取中斷計(jì)數(shù)器的低8位數(shù)據(jù)到R7
mov r7,a
lcall BinToBcd ;把16位計(jì)數(shù)器的值轉(zhuǎn)換成BCD碼
lcall ReadyToDisplay ;把轉(zhuǎn)換的BCD碼送到顯示緩沖區(qū)
lcall Display ;調(diào)用顯示函數(shù),顯示緩沖區(qū)的內(nèi)容
ajmp mainloop ;跳轉(zhuǎn)到mainloop循環(huán)
InitExtInt:
mov a,#00h ;中斷次數(shù)計(jì)數(shù)器清零
mov uiContIntHigt,a
mov uiContIntLow,a
setb IT0 ;選擇下降沿觸發(fā)方式
setb ex0 ;開(kāi)外部中斷允許
setb ea ;開(kāi)總中斷允許
ret
;入口條件:待轉(zhuǎn)換的雙字節(jié)十六進(jìn)制整數(shù)在R6、R7中。
;出口信息:轉(zhuǎn)換后的三字節(jié)BCD碼整數(shù)在R3、R4、R5中。
;影響資源:PSW、A、R2~R7 堆棧需求: 2字節(jié)
BinToBcd:
CLR A ;BCD碼初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;轉(zhuǎn)換雙字節(jié)十六進(jìn)制整數(shù)
HB3: MOV A,R7 ;從高端移出待轉(zhuǎn)換數(shù)的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD碼帶進(jìn)位自身相加,相當(dāng)于乘2
ADDC A,R5
DA A ;十進(jìn)制調(diào)整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;雙字節(jié)十六進(jìn)制數(shù)的萬(wàn)位數(shù)不超過(guò)6,不用調(diào)整
DJNZ R2,HB3 ;處理完16bit
RET
ReadyToDisplay: ;把經(jīng)過(guò)BCD碼轉(zhuǎn)換的16位數(shù)分開(kāi)送到顯示緩沖區(qū)
mov a,r5
mov b,a
anl a,#0fh
mov aucDisplayBuff+7,a
mov a,b
swap a
anl a,#0fh
mov aucDisplayBuff+6,a
mov a,r4
mov b,a
anl a,#0fh
mov aucDisplayBuff+5,a
mov a,b
swap a
anl a,#0fh
mov aucDisplayBuff+4,a
mov a,r3
mov b,a
anl a,#0fh
mov aucDisplayBuff+3,a
mov a,b
swap a
anl a,#0fh
mov aucDisplayBuff+2,a
mov a,#00h
mov aucDisplayBuff+1,a
mov aucDisplayBuff+0,a
ret
Display: ;顯示函數(shù),把內(nèi)容從顯示緩沖區(qū)送到LED數(shù)碼管顯示
mov dptr,#Table
mov r4,#08h
mov r0,#00h
DispLoop:
clr P1.3 ;關(guān)顯示
mov a,#aucDisplayBuff ;取顯示的數(shù)據(jù)
add a,r0
mov r1,a
mov a,@r1
movc a,@a+dptr ;根據(jù)數(shù)據(jù)取顯示段碼
mov p0,a ;段碼送到P0口
mov a,r1
mov p1,a
setb P1.3 ;開(kāi)顯示
lcall delay
inc r0 ;顯示的位數(shù)加一
djnz r4,DispLoop ;沒(méi)有顯示完就繼續(xù)
clr P1.3 ;顯示完了就關(guān)顯示返回
ret
delay: ;延時(shí)子程序
mov r7,#010h
delayloop1:
mov r6,#040h
djnz r6,$
djnz r7,delayloop1
ret
ExtIntFuntion: ;中斷處理程序
push ACC
push psw
mov a,uiContIntLow ;把16計(jì)數(shù)器的低8位數(shù)據(jù)送到A
clr c ;清掉進(jìn)位位
add a,#01h ;低8位加一
mov uiContIntLow,a ;保存低8位數(shù)值
mov a,uiContIntHigt ;取中斷計(jì)數(shù)器的高8位
addc a,#00h ;高8位加進(jìn)位位
mov uiContIntHigt,a ;保存高8位數(shù)值
pop psw
pop ACC
reti ;中斷返回
Table:
DB 0c0h,0f9h,0a4h,0b0h,99h,92h,82h,0f8h,80h,90h
; 0, 1, 2, 3, 4, 5, 6, 7, 8, 9,
end
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -