4位数码管中断计数器程序(汇编) 2019-12-17

/***********************************************/
/*名称:4位数码管中断计数器程序(INT_0负触发)                
/*功能:10000进制计数器,P0口为数码管数据线;P2.7-P2.4为位选线
/*编写:JiangX.net                                                                         
/***********************************************/

        FIRST EQU 21H    ;定义个位
        SECOND EQU 22H    ;定义十位
        THIRD EQU 23H    ;定义百位
        FOURTH EQU 24H    ;定义千位

        ORG 0000H      ;程序从0地址开始
        LJMP START      ;跳到STRAT处执行
        ORG 0003H      ;INT0中断向量
        LJMP INT_0      ;跳至INT_0处执行
START:
        SETB EA         ;开中断
        SETB IT0        ;中断0允许P3.2口
        SETB EX0        ;负跳变触发
CLEAR:                     ;初始化显示0000
        MOV     FIRST,#0
 MOV     SECOND,#0
 MOV     THIRD,#0
 MOV     FOURTH,#0  ;将0复制到以R0为地址的寄存器
SHOW:                      ;显示子程序
        MOV DPTR,#TAB;DPTR指向编码表位置
        MOV A,FIRST    ;将FIRST的内容复制到ACC
        MOVC A,@A+DPTR  ;根据ACC的值取出编码表中的编码
        MOV P0,A       ;由P0口输出ACC的内容
 CLR P2.7       ;置位P2.7  
        LCALL DELAY      ;调用延时子程序
        SETB    P2.7       ;清零P2.7  
/*显示个位*/
        MOV DPTR,#TAB  ;DPTR指向编码表位置
        MOV A,SECOND   ;将SECOND的内容复制到ACC
        MOVC A,@A+DPTR  ;根据ACC的值取出编码表中的编码
        MOV P0,A       ;由P0口输出ACC的内容
 CLR P2.6       ;置位P2.6
        LCALL DELAY      ;调用延时子程序
 SETB    P2.6       ;清零P2.6
/*显示十位*/
        MOV DPTR,#TAB  ;DPTR指向编码表位置
        MOV A,THIRD    ;将THIRD的内容复制到ACC
        MOVC A,@A+DPTR  ;根据ACC的值取出编码表中的编码
        MOV P0,A       ;由P0口输出ACC的内容
 CLR P2.5       ;置位P2.5
        LCALL DELAY      ;调用延时子程序
 SETB    P2.5       ;清零P2.5
/*显示百位*/;
        MOV DPTR,#TAB  ;DPTR指向编码表位置
        MOV A,FOURTH   ;将FOURTH的内容复制到ACC
        MOVC A,@A+DPTR  ;根据ACC的值取出编码表中的编码
        MOV P0,A       ;由P0口输出ACC的内容
 CLR P2.4       ;置位P2.4
        LCALL DELAY      ;调用延时子程序
 SETB    P2.4       ;清零P2.4
/*显示千位*/
        LJMP SHOW       ;调用显示子程序


INT_0:                     ;中断子程序
        CLR EA
 INC FIRST      ;FIRST的内容加1
        MOV A,FIRST    ;将FIRST的内容复制到ACC
        CJNE A,#10,EXIT ;如果A不等于10,则跳至L1处执行
        MOV FIRST,#00H ;将0复制到FIRST
        INC SECOND     ;将SECOND的内容加1

        MOV A,SECOND   ;将SECOND的内容复制到ACC
        CJNE A,#10,EXIT ;如果A不等于10,则跳至L2处执行
        MOV SECOND,#00H;将0复制到SECOND
        INC THIRD      ;将THIRD的内容加1

        MOV A,THIRD    ;将THIRD的内容复制到ACC
        CJNE A,#10,EXIT ;如果A不等于10,则跳至L3处执行
        MOV THIRD,#00H ;将0复制到THIRD
        INC FOURTH     ;将FOURTH的内容加1

        MOV A,FOURTH   ;将FOURTH的内容复制到ACC
        CJNE A,#10,EXIT ;如果A不等于10,则跳至L4处执行
        MOV FOURTH,#00H;将0复制到FOURTH
EXIT:                      ;跳出中断子程序
        SETB    EA
        RETI               ;返回主程序


DELAY:                     ;延时子程序
        MOV R7,#1      ;R1加载1次数
D1:     MOV R6,#250    ;R6加载250次数
        DJNZ R6,$       ;本行执行R6次
        DJNZ R7,D1      ;D1执行R7次
        RET                ;返回主程序

TAB:                       ;编码表
        DB 0C0H,0F9H,0A4H,0B0H,99H,92H,82H,0F8H,80H,90H ;编码 
        END                ;程序结束