下面是5位数可逆记数程序: ;**************************; ; 绕线机计数器程序 ; ; CPU : AT89C2051 ; ; 作者:137 ; 2005-02-01 ; ;*************************; ORG 0000H ;程序执行开始地址 LJMP START ;跳至START执行 ORG 0003H ;外中断0中断入口地址 LJMP INTEXT0 ; ORG 000BH ;定时器T0中断入口地址 RETI ;中断返回 ORG 0013H ;外中断1中断入口地址 LJMP INTEXT1 ; ORG 001BH ;定时器T1中断入口地址 RETI ;中断返回 ORG 0023H ;串行口中断入口地址 RETI ;中断返回 ORG 002BH ;定时器T2中断入口地址 RETI ;中断返回 ;************; ; 初始化程序 ; ;************; CLEAR: MOV A,#00H; MOV R0,A MOV R1,A MOV R2,A MOV R3,A MOV R4,A MOV P3,#0FFH MOV P1,#0FFH LJMP MAIN; 跳到主程序开始计数 START: MOV P1,#0FFH; 开机显示LIN.P MOV P3,#0FFH MOV R4,#0AH;L MOV R3,#0BH;I MOV R2,#0CH;N MOV R1,#0DH; MOV R0,#0EH JNB P1.7,START1;如清零键按下跳至清零确认程序 ACALL DISPLAY; AJMP START START0: MOV R4,#0EH 清零时显示"P L" MOV R3,#0DH; MOV R2,#0DH; MOV R1,#0AH;L MOV R0,#0DH; START1: ACALL DISPLAY; 等待键释放 JNB P1.7, START1 AJMP CLEAR ;************; ; 主 程 序 ; ;************; MAIN: ACALL DISPLAY; 调用显示程序 MOV P1,#0FFH; 置P1口为输入状态 MOV P3,#0FFH; 置P3口为输入状态 JNB P1.7,START0; 如清零键按下跳至清零程序 SETB IT0 SETB EX0 SETB IT1 SETB EX1 SETB EA; 开总中断 AJMP MAIN ;************; ; 加1程序 ; ;************;
INTEXT0: PUSH ACC; 进栈 PUSH PSW; INC R0; 寄存单元R0加1 CJNE R0,#0AH,INT0OUT; R0数是否在10内0-9 MOV R0,#00H; 如到了则将R0置0 INC R1; R1加1 CJNE R1,#0AH,INT0OUT; . MOV R1,#00H; . INC R2; . CJNE R2,#0AH,INT0OUT MOV R2,#00H INC R3 CJNE R3,#0AH,INT0OUT MOV R3,#00H INC R4 CJNE R4,#0AH,INT0OUT MOV R4,#00H INT0OUT: POP PSW; 出栈 POP ACC RETI; 中断返回 ;************; ; 减1程序 ; ;************; INTEXT1: PUSH ACC; 进栈 PUSH PSW DEC R0; R0减1 CLR C; 清进位标致 CJNE R0,#0FFH,INT1OUT; 判断R0是不在0-9中 MOV R0,#09H; 不是将R0置9 DEC R1; R1减1 CLR C; . CJNE R1,#0FFH,INT1OUT; . MOV R1,#09H; . DEC R2; CLR C CJNE R2,#0FFH,INT1OUT MOV R2,#09H DEC R3 CLR C CJNE R3,#0FFH,INT1OUT MOV R3,#09H DEC R4 CLR C CJNE R4,#0FFH,INT1OUT MOV R4,#09H INT1OUT: POP PSW POP ACC RETI ;************; ; 显示程序 ; ;************; DISPLAY: MOV DPTR,#NUMTAB MOV A,R0 MOVC A,@A+DPTR MOV P1,A CLR P3.0; 选中小数位显示 ACALL D1MS SETB P3.0 MOV A,R1 MOVC A,@A+DPTR MOV P1,A CLR P3.1; 选中个位数显示 ACALL D1MS SETB P3.1 MOV A,R2 MOVC A,@A+DPTR MOV P1,A CLR P3.4; 选中十位数显示 ACALL D1MS SETB P3.4
MOV A,R3 MOVC A,@A+DPTR MOV P1,A CLR P3.7; 选中百位数显示 ACALL D1MS SETB P3.7 MOV A,R4 MOVC A,@A+DPTR MOV P1,A CLR P3.5; 选中千位数显示 ACALL D1MS SETB P3.5 RET ;*******; ;延时程序; ;*******; D1MS: MOV R7,#2 DJNZ R7,$ RET ;*********; ; 查表程序 ; ;*********; NUMTAB: DB 03FH;0 DB 006H;1 DB 05BH;2 DB 04FH;3 DB 066H;4 DB 06DH;5 DB 07DH;6 DB 007H;7 DB 07FH;8 DB 06FH;9 DB 038H;L DB 030H;I DB 037H;N DB 000H; DB 073H END |