8路LED的二进制加法器(对堆栈的优化)
此文是对2012-06-11的“8路LED的二进制加法器”的堆栈优化。由于刚学习51汇编,如有不妥地方,请大虾们指正!!
下面是“8路LED的二进制加法器”的链接地址:http://blog.csdn.net/fly928sky/article/details/7645591
1.上述方案的缺点是:对堆栈的处理很容易漏掉PUSH或POP,可能造成堆栈溢出问题,造成程序不稳定。
2.对上述优化方案是:用direct代替堆栈
优化代码如下:
ORG 0000H
LJMP START
;程序开始
START: ACALL INIT
;主程序
Main: ACALL DisplayAdd
LJMP Main
DisplayAdd:
ADD1: MOV R0,#16
MOV R1,#16
MOV R2,#10H ;H位DP低位暂存
MOV R3,#10H ;H位DP高位暂存
MOV DPTR,#1000H ;L位DP
MOV 1020H,#00H ;;//H位置零,存H位数值
MOV 1030H,#0FFH ;;//1030H暂存H位显示值
ADDHL: CLR A //L位不为零操作(包含起步L位为零操作)
SETB P1.2
MOVC A,@A+DPTR
MOV R4,A ;;// R4暂存L位显示值
MOV A,1020H
JZ ADDH ;H位为零跳转;H位不为零,继续执行
MOV A,1030H //H位不为零操作,取1030H值(H位显示值)和L位显示值相与
ANL A,R4
MOV P0,A
LJMP Next
ADDH: MOV P0,R4 //H位为零操作
Next: CLR P1.2
ACALL DELAY
INC DPTR
DEC R0
MOV A,R0
JNZ ADDHL ;不为零跳转
;还原H位DP
MOV DPL,R2
MOV DPH,R3
ADDHZ: CLR A //L位为零操作,并保存H位到1030H
SETB P1.2
MOVC A,@A+DPTR
MOV P0,A
MOV 1030H,A
INC 1020H
CLR P1.2
ACALL DELAY
INC DPTR
;保存H位DP到寄存器R2、R3
MOV R2,DPL
MOV R3,DPH
DEC R1
MOV A,R1
MOV R0,#16
MOV DPTR,#1000H
JNZ ADDHL
LJMP Add1
RET
;初始化函数
INIT: SETB P1.3 ;关闭点阵
MOV P0,#00H
CLR P1.3
SETB P1.1 ;关闭数码管
MOV P0,#0FFH
CLR P1.1
RET
;延时函数
DELAY: MOV R5,#20
D2: MOV R6,#20
D1: MOV R7,#248
DJNZ R7,$
DJNZ R6,D1
DJNZ R5,D2
RET
;数据表
ORG 1000H
Table1: DB 0FFH,07FH,0BFH,03FH,0DFH,05FH,09FH,01FH,0EFH,06FH,0AFH,02FH,0CFH,04FH,08FH,00FH ;L位,即开发板上面右边4个LED灯的0~15
Table2: DB 0F7H,0FBH,0F3H,0FDH,0F5H,0F9H,0F1H,0FEH,0F6H,0FAH,0F2H,0FCH,0F4H,0F8H,0F0H,0FFH ;H位,即开发板上面左边4个LED灯的1~15 0
END ;程序结束