效果展示:
16×16LED滚动显示
主要器件:
AT89C51 | *1 |
74HC595 | *2 |
74LS138 | *2 |
功能及原理简介:
主要功能是实现LED点阵的滚动显示,包括暂停功能。
LED点阵采用列扫描方式,所以每次只能点亮LED屏的一列以此类推,行数据通过595并行输出,配合列扫描每次点亮一列所需要亮起的点,接下来行数据更新点亮下一列对应的点,由于人眼延迟,在人眼观察下,LED屏就会显示出对应的图形,只需要不断地更新对应列所需要亮起的行数据,就可以实现屏幕的显示及滚动显示了。
电路结构采用两片HC595级联,串行输入并行输出,输出口与LED点阵行相连接,两片LS138级联作为列选择,十六个引脚与LED点阵列相连,用来进行列扫描。暂停功能通过C51的外部中断INT0来响应。595与138工作原理以及C51外部中断原理请参考如下连接:
74LS138讲解:https://www.bilibili.com/video/BV1Hr4y1w7TJ/?spm_id_from=333.337.search-card.all.click&vd_source=81b8a97085ada13a1b7738e1ae5cd010
74HC595讲解:https://www.bilibili.com/video/BV1UE411d7jV/?spm_id_from=333.337.search-card.all.click&vd_source=81b8a97085ada13a1b7738e1ae5cd010
C51外部中断:https://www.bilibili.com/video/BV1LD4y1g781/?spm_id_from=333.337.search-card.all.click&vd_source=81b8a97085ada13a1b7738e1ae5cd010
代码解析:
$NOMOD51
$INCLUDE (8051.MCU)
ORG 0000H
JMP START
ORG 000BH
JMP SER0 ;中断服务程序
ORG 0100H
START:
MOV DPTR ,#TABLE
CLR EA ;关中断
SETB IT0 ;设置外部中断INT0
SETB EX0
SETB EA ;开中断
MOV R2, #00H ;用来改变显示的起始指针
MOV R3,#21H ;同一幅图循环显示的次数
MOV R4,#00H ;R4的值为0或1,只在中断程序里修改,用来判断是否滚动
LABLE:
MOV B,R2
MOV R0,B ;起始地址R2赋给R0
MOV A, #10H ;用于列扫描
LABLE0:
CLR P1.2
PUSH ACC
MOV R1,#08H
MOV A,R0
MOVC A,@A+DPTR
MOV B,A
ACALL LABLE1 ;高8位推入595
INC R0
MOV R1,#08H
MOV A,R0
MOVC A,@A+DPTR
MOV B,A
ACALL LABLE1 ;低8位推入595
INC R0
POP ACC
DEC A ;点亮A对应列
MOV P0,A ;用列扫描,对应列输出0
NOP
NOP
NOP
SETB P1.2 ;行输出,点亮LED点阵的一列
NOP
NOP
NOP
JNZ LABLE0 ;一次列扫描未结束,循环
DEC R3; ;同一幅图循环次数自减
MOV A,R3
JNZ LABLE ;同一幅图循环显示
MOV A,R4 ;判断是否滚动
JNZ LABLE ;不滚动则不改变R2的值
MOV A,R2
INC A
INC A
MOV B,#42H ;滚动则R2加2
DIV AB
MOV R2,B
MOV R3,#21H ;重新设置同一幅图循环显示次数
AJMP LABLE
LABLE1: ;用来移入行的8位
CLR P1.1
MOV A,B
ANL A,#80H
JNZ OUT1 ;非0跳转
CLR P1.3 ;最高位是0,移入0
AJMP PUT
OUT1:
SETB P1.3 ;最高位是1,移入1
PUT:
MOV A,B
RL A ;左移
MOV B,A
SETB P1.1 ;移入一位数字
DEC R1
MOV A,R1
JNZ LABLE1
CLR P1.1
RET
SER0: ; 中断子程序
PUSH ACC
PUSH PSW
INC R4
MOV A,R4
MOV B,#02 ;改变R4的值,从而改变是否滚动
DIV AB
MOV R4,B
POP PSW
POP ACC
RETI
TABLE:
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
;DB 00H,00H,00H,00H,0FFH,0FFH,0FFH,0FFH,00H,00H,00H,00H,0FFH,0FFH,0FFH,0FFH,00H,00H,00H,00H,0FFH,0FFH,0FFH,0FFH,00H,00H,00H,00H,0FFH,0FFH,0FFH,0FFH
DB 00H,00H,40H,20H,20H,0A0H,11H,24H,0BH,28H,07H,38H,0DH,0E0H,38H,20H,20H,30H,00H,20H,2FH,0F0H,40H,10H,40H,00H,7FH,0FCH,00H,00H,00H,00H
DB 00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H,00H
END
( 该代码只循环显示汉字“刘” , 如需循环显示其他内容只需添加对应的TABLE表 , 另外 , 由于不同的接线方式 , 代码移植时滚动方向可能会改变 , 这时需要调整代码中的列扫描方向使其从低位到高位扫描 , 或将TABLE中数据按对应方向调换顺序 )
电路连接:
实验工程下载连接(Proteus):
https://pan.baidu.com/s/1gm0QNtq8-WRRqdFEUTZnCQ?pwd=2617