/***********************************************/
/*名称: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 ;程序结束