⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 extint.asm

📁 外部中断实验并显示中断次数
💻 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 + -