8路LED的二进制加法器(续)
本文是对“8路LED的二进制加法器”的延续,采用全新算法。
请参看http://blog.csdn.net/fly928sky/article/details/7645591和http://blog.csdn.net/fly928sky/article/details/7665905
代码如下:
ORG 0000H LJMP START ;程序开始 START: ACALL INIT ;主程序 Main: ACALL DisplayAdd1 LJMP Main //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //*************************************************************** //方法1 //*************************start********************************* DisplayAdd1: ACALL NumInit ADD1: MOV R0,#10H ;H/L位DP高位暂存 MOV R1,#00H ;L位DP低位暂存 MOV R2,#10H ;H位DP低位暂存 ADD1LOOP: ACALL NumDiv MOV A,1021H CJNE A,#10H,Next ACALL NumInit Next: MOV A,1023H JNZ AddHNZ //;H位为零操作 AddHZ: CLR A SETB P1.2 ACALL GetL MOV P0,A CLR P1.2 ACALL DELAY INC 1020H ACALL NumDiv MOV A,1021H JZ AddHZ MOV 1023H,#01H ;置标志位 MOV 1024H,#00H //;H位不为零操作 AddHNZ: ACALL NumDiv MOV A,1024H JNZ AddLNZ //;L位为零操作 AddLZ: CLR A SETB P1.2 ACALL GetH MOV P0,A CLR P1.2 ACALL DELAY INC 1020H ACALL NumDiv MOV 1024H,#01H ;置标志位 //;L位不为零操作 AddLNZ: CLR A SETB P1.2 ACALL SetP0 CLR P1.2 ACALL DELAY INC 1020H ACALL NumDiv MOV A,1022H JNZ AddLNZ MOV 1024H,#00H LJMP ADD1LOOP RET //**************************end********************************** //方法1 //*************************************************************** //$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$$ //*************************************************************** //方法2 //*************************start********************************* DisplayAdd2: ACALL NumInit Add2: MOV R0,#10H ;H/L位DP高位暂存 MOV R1,#00H ;L位DP低位暂存 MOV R2,#10H ;H位DP低位暂存 AddInit: ACALL NumDIV AddMain: MOV A,1021H ;高位暂存累加器A CJNE A,#10H,Add2Loop ;A<16转移到AddLoop,且CY=1;A=0继续向下执行 ACALL NumInit Add2Loop: JNC AddInit ;CY!=0继续向下执行 SETB P1.2 ACALL SetP0 CLR P1.2 ACALL DELAY INC 1020H LJMP AddInit RET //**************************end********************************** //方法2 //*************************************************************** ;初始化函数 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 NumInit: ;初始化函数 MOV 1020H,#00H ;显示数 MOV 1021H,#00H ;显示数H位 MOV 1022H,#00H ;显示数L位 MOV 1023H,#00H ;H位为零标志 MOV 1024H,#00H ;L位为零标志 RET NumDiv: ;显示数初始化 MOV A,1020H MOV B,#10H DIV AB MOV 1021H,A ;商数存H位 MOV 1022H,B ;余数存L位 RET SetP0: ;设置P0端口值 ACALL GetL MOV R3,A ACALL GetH ANL A,R3 ;H位和L位相与送入P0口 MOV P0,A RET GetH: MOV DPH,R0 ;取H位值 MOV A,R2 ADD A,1021H MOV DPL,A CLR A MOVC A,@A+DPTR RET GetL: MOV DPH,R0 ;取L位值 MOV A,R1 ADD A,1022H MOV DPL,A CLR A MOVC A,@A+DPTR 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 0FFH,0F7H,0FBH,0F3H,0FDH,0F5H,0F9H,0F1H,0FEH,0F6H,0FAH,0F2H,0FCH,0F4H,0F8H,0F0H ;H位,即开发板上面左边4个LED灯的1~15 0 END ;程序结束