8路LED的二进制加法器的实现
1.8路LED的二进制加法器对应的电路图为:
开发板样图
8052芯片图
LED流水灯模块图
8*8点阵模块图
8位数码管模块图
2. 8路LED的二进制加法器的中心思想:利用DB字节库取值显示加法过程
3.8路LED的二进制加法器的实现伪过程:
a.8路LED分成高4路和低4路,只取四路的0-15的值,令四路为关闭状态。
(这样取值后就只需做两个16字节的DB,不必做16X16这么大规模的数据,但是也提出了一个低4位向高4位进位的问题。下面就讨论这个问题)
两个16字节DB如下:
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
b.大致思路:高4位为0,低4位从0自加到15(取之于Table1);再加1,低4位清零,高四位加1。低4位再从0自加到15,然后加1同前面。
上述四路中存在一个问题,高低不能同时显示,需要处理同时显示问题。
详细思路:高4位为0——低4位从0自加到15取Table1中对应显示值送入P0;再加1,高4位加1,低4位清零,此时跳到“低4位为0”;
再在此基础上继续加,跳到“低4位不为0”然后对高4位判断是否为零;
如此循环进行。
低4位为0——直接取高4位数字对应Table2中显示值送入P0
低4位不为0——高4位为0——直接取低4位数字对应Table1中显示值送入P0
低4位不为0——高4位不为0——取低4位数字对应Table1中显示值 和 高4位数字对应Table2中显示值 后,相与然后送入P0
4.8路LED的二进制加法器的实现代码:
ORG 0000H
LJMP START
;程序开始
START: ACALL INIT
;主程序
Main: MOV R0,#16
MOV R1,#16
MOV R2,#10H
MOV R3,#10H
MOV DPTR,#1000H
MOV 1020H,#00H ;H位置零,存H位数值
MOV A,#0F7H ;H位LED值
PUSH ACC
ADDHL: CLR A ;L位不为零操作
SETB P1.2
MOVC A,@A+DPTR
MOV R4,A ;R4暂存L位的DB值
MOV A,1020H
JZ ADDH ;H位为零跳转;H位不为零,继续执行
POP ACC ;H位不为零操作
MOV 1030H,A
ANL A,R4
MOV P0,A
MOV A,1030H
PUSH ACC
LJMP Next
ADDH: MOV P0,R4 ;H位为零操作
Next: CLR P1.2
ACALL DELAY
INC DPTR
DEC R0
MOV A,R0
JNZ ADDHL ;不为零跳转
MOV DPL,R2
MOV DPH,R3
ADDHZ: POP ACC ;L位为零操作,并保存H位到累加器A
CLR A
SETB P1.2
MOVC A,@A+DPTR
MOV P0,A
PUSH ACC
INC 1020H
CLR P1.2
ACALL DELAY
INC DPTR
MOV R2,DPL
MOV R3,DPH
DEC R1
MOV A,R1
MOV R0,#16
MOV DPTR,#1000H
JNZ ADDHL
LJMP Main
;初始化函数
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 ;程序结束
5.编写程序阶段需要注意的问题
注意事项:
(1)寄存器不够用的情况下,可以把dir做暂时寄存器
(2)关于堆栈的问题:a.先PUSH(压栈),后POP(出栈)【对称原则】
b.先进后出