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 ;程序结束