📄 extint.asm
字号:
;**************************************************************
;程序说明: 本程序是一个外部中断的子程序,因为HaiYun51实验板上
; 有一个按键INT0是接到外部中断0的引脚上的,所以可以通
; 过这个按键来做外部中断的实验.本实验中每按下一次INTO
; 按键就会对中断计数器加一,并且计数器的值会显示到
; 数码管上.做这个实验的时候要把数码管的电源选择开关
; 拨到ON的位置.
;MCU: AT89S52
;XTAL: 12MHZ
;作者: chhaich
;email: chhaich@163.com
;QQ: 406721773
;**************************************************************
uiContInt equ 40h ;16位整形中断计数器数据
uiContIntHigt equ 41h ;高8位数据
uiContIntLow equ 40h ;低8位数据
aucDisplayBuff equ 50h ;显示缓冲区
org 0000h ;程序开始地址
ljmp main ;跳转到main 执行
org 0003h ;外部中断入口地址
ljmp ExtIntFuntion ;跳转到中断处理子程序
org 0030h
main:
lcall InitExtInt ;初始化外部中断
mainloop:
mov a,uiContIntHigt ;取中断计数器的高8位数据到R6
mov r6,a
mov a,uiContIntLow ;取中断计数器的低8位数据到R7
mov r7,a
lcall BinToBcd ;把16位计数器的值转换成BCD码
lcall ReadyToDisplay ;把转换的BCD码送到显示缓冲区
lcall Display ;调用显示函数,显示缓冲区的内容
ajmp mainloop ;跳转到mainloop循环
InitExtInt:
mov a,#00h ;中断次数计数器清零
mov uiContIntHigt,a
mov uiContIntLow,a
setb IT0 ;选择下降沿触发方式
setb ex0 ;开外部中断允许
setb ea ;开总中断允许
ret
;入口条件:待转换的双字节十六进制整数在R6、R7中。
;出口信息:转换后的三字节BCD码整数在R3、R4、R5中。
;影响资源:PSW、A、R2~R7 堆栈需求: 2字节
BinToBcd:
CLR A ;BCD码初始化
MOV R3,A
MOV R4,A
MOV R5,A
MOV R2,#10H ;转换双字节十六进制整数
HB3: MOV A,R7 ;从高端移出待转换数的一位到CY中
RLC A
MOV R7,A
MOV A,R6
RLC A
MOV R6,A
MOV A,R5 ;BCD码带进位自身相加,相当于乘2
ADDC A,R5
DA A ;十进制调整
MOV R5,A
MOV A,R4
ADDC A,R4
DA A
MOV R4,A
MOV A,R3
ADDC A,R3
MOV R3,A ;双字节十六进制数的万位数不超过6,不用调整
DJNZ R2,HB3 ;处理完16bit
RET
ReadyToDisplay: ;把经过BCD码转换的16位数分开送到显示缓冲区
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: ;显示函数,把内容从显示缓冲区送到LED数码管显示
mov dptr,#Table
mov r4,#08h
mov r0,#00h
DispLoop:
clr P1.3 ;关显示
mov a,#aucDisplayBuff ;取显示的数据
add a,r0
mov r1,a
mov a,@r1
movc a,@a+dptr ;根据数据取显示段码
mov p0,a ;段码送到P0口
mov a,r1
mov p1,a
setb P1.3 ;开显示
lcall delay
inc r0 ;显示的位数加一
djnz r4,DispLoop ;没有显示完就继续
clr P1.3 ;显示完了就关显示返回
ret
delay: ;延时子程序
mov r7,#010h
delayloop1:
mov r6,#040h
djnz r6,$
djnz r7,delayloop1
ret
ExtIntFuntion: ;中断处理程序
push ACC
push psw
mov a,uiContIntLow ;把16计数器的低8位数据送到A
clr c ;清掉进位位
add a,#01h ;低8位加一
mov uiContIntLow,a ;保存低8位数值
mov a,uiContIntHigt ;取中断计数器的高8位
addc a,#00h ;高8位加进位位
mov uiContIntHigt,a ;保存高8位数值
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
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -