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