[audio06]
下面是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;P
JNB P1.7,START1;如清零键按下跳至清零确认程序
ACALL DISPLAY;
AJMP START
START0: MOV R4,#0EH;P 清零时显示"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;P
END