📄 26驱动8x8led点阵显示图形.asm
字号:
;本程序的任务是要让8个数管能分别显示不同的数字,以前的例子中,更改P1口听数据,8个数码管会同时变成另一数字,本程序需要观看LED显示,请将CZ2和P1口用排线连接起来
;本程序先在30-37h放入0-7,在数码管中显示出来
;根据电路原理图可知,本实验板是用一只74HC164扩展IO来控制8个数码管点亮,这种方法又经济,又方便,
org 00h
mov dptr,#ledtab
mov r1,#0
mov r5,#0
mov 30h,#0
mov 31h,#1
mov 32h,#2
mov 33h,#3
mov 34h,#4
mov 35h,#5
mov 36h,#6
mov 37h,#7 ;先将要显示的数放入寄存器内,以后做产品时,你要显示什么数就由你的程序自动计算自动放进这里
main:
;LED动态扫描程序显示开始,说明有8只LED数码管,就需要分别显示8只数码管,r7表示是轮到显示第几只
inc r7
disp0:cjne r7,#8,disp1
mov r7,#0
disp1:cjne r7,#0,disp2
mov 38h,#00000001b ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
mov 39h,30h ;将要显示的数码管的笔画数据
call ddpp ;调用显示子程序,对上面的数码管数据显示
disp2:cjne r7,#1,disp3
mov 38h,#00000010b ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
mov 39h,31h ;将要显示的数码管的笔画数据
call ddpp ;调用显示子程序,对上面的数码管数据显示
disp3:cjne r7,#2,disp4
mov 38h,#00000100b ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
mov 39h,32h ;将要显示的数码管的笔画数据
call ddpp ;调用显示子程序,对上面的数码管数据显示
disp4:cjne r7,#3,disp5
mov 38h,#00001000b ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
mov 39h,33h ;将要显示的数码管的笔画数据
call ddpp ;调用显示子程序,对上面的数码管数据显示
disp5:cjne r7,#4,disp6
mov 38h,#00010000b ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
mov 39h,34h ;将要显示的数码管的笔画数据
call ddpp ;调用显示子程序,对上面的数码管数据显示
disp6:cjne r7,#5,disp7
mov 38h,#00100000b ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
mov 39h,35h ;将要显示的数码管的笔画数据
call ddpp ;调用显示子程序,对上面的数码管数据显示
disp7:cjne r7,#6,disp8
mov 38h,#01000000b ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
mov 39h,36h ;将要显示的数码管的笔画数据
call ddpp ;调用显示子程序,对上面的数码管数据显示
disp8:cjne r7,#7,disp9
mov 38h,#10000000b ;将要显的那只数码管的共阳极数据,通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
mov 39h,37h ;将要显示的数码管的笔画数据
call ddpp ;调用显示子程序,对上面的数码管数据显示
disp9:
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r4,$
djnz r6,mend
mov r6,#20
inc r5
cjne r5,#160,mend
mov r5,#0
mend:jmp main
ddpp: mov a,38h ;通过串行口向74HC164发送数据,只让一个数码管的阳极有电,即只点亮一只数码管
mov p1,#0ffh ;向74HC164送数据前要先熄灭LED数码管显示,否则,会出"鬼影",因为要确保每一位管对应每一位管的数据
;mov sbuf,a
call fssj
nop
nop
nop
nop
mov a,39h ;累加器读入要显示的第一个数
mov dptr,#ledtab
movc a,@a+dptr ;这是唯一的查表指令,作用就是读出DPTR中的表名中的第几个数的数据.
cpl a ;可以显示阴文或者阳文,ledtab是顺序存放的0123456789abcdef的LED笔画关系,根据数码管的共阴或者共阳,有时高电平是点亮,有时低电平是点亮.
mov p1,a ;放到P1口,显示出字符
mov p2,#000h
mov a,r5 ;累加器读入要显示的第一个数
add a,r7
;cjne a,#8,$+3
;jc $+4
;subb a,#8
nop
nop
;mov dptr,#tab1
;mov dptr,#tab2
;mov dptr,#tab3
mov dptr,#tab
;mov dptr,#tab5
;mov dptr,#tab6
movc a,@a+dptr ;这是唯一的查表指令,作用就是读出DPTR中的表名中的第几个数的数据.
cpl a ;可以显示阴文或者阳文,ledtab是顺序存放的0123456789abcdef的LED笔画关系,根据数码管的共阴或者共阳,有时高电平是点亮,有时低电平是点亮.
mov p2,a ;放到P1口,显示出字符
ret
ledtab: db 11101101b,00000101b,11100011b,01100111b,00001111b,01101110b,11101110b,00100101b,11101111b,01101111b,10101111b,11001110b,11101000b,11000111b,11101010b,10101010b
tab:
DB 70h,88h,88h,88h,88h,88h,70h,00h
DB 20h,60h,20h,20h,20h,20h,70h,00h
DB 70h,88h,08h,70h,80h,80h,0F8h,00h
DB 70h,88h,08h,70h,08h,88h,70h,00h
DB 30h,50h,90h,90h,0F8h,10h,10h,00h
DB 0F8h,80h,0F0h,08h,08h,88h,70h,00h
DB 70h,88h,80h,0F0h,88h,88h,70h,00h
DB 0F8h,08h,10h,20h,20h,20h,20h,00h
DB 70h,88h,88h,70h,88h,88h,70h,00h
DB 70h,88h,88h,78h,08h,88h,70h,00h
DB 00H,00H,27H,45H,45H,45H,39H,00H
DB 00H,00H,22H,49H,49H,49H,36H,00H
DB 00H,00H,0CH,14H,24H,7FH,04H,00H
DB 00H,00H,72H,51H,51H,51H,4EH,00H
DB 00H,00H,3EH,49H,49H,49H,26H,00H
DB 00H,00H,40H,40H,40H,4FH,70H,00H
DB 00H,00H,36H,49H,49H,49H,36H,00H
DB 00H,00H,32H,49H,49H,49H,3EH,00H
tab1:;四边形加中心四点
db 00011000b
db 00100100b
db 01000010b
db 10011001b
db 10011001b
db 01000010b
db 00100100b
db 00011000b
tab2:;叉叉
db 10000001b
db 01000010b
db 00100100b
db 00011000b
db 00011000b
db 00100100b
db 01000010b
db 10000001b
tab3:;箭头1
db 00011000b
db 00111100b
db 01011010b
db 10011001b
db 00011000b
db 00011000b
db 00011000b
db 00011000b
tab4:;箭头2
db 00010000b
db 00111000b
db 01010100b
db 10010010b
db 00010000b
db 00010000b
db 00010000b
db 00000000b
tab5:;四边形加中心四点
db 00011000b
db 00100100b
db 01000010b
db 10011001b
db 10011001b
db 01000010b
db 00100100b
db 00011000b
tab6:;四边形加中心四点
db 00011000b
db 00100100b
db 01000010b
db 10011001b
db 10011001b
db 01000010b
db 00100100b
db 00011000b
fssj: clr p3.6
mov 5fh,#8
fs00: rlc a
mov p3.7 ,c
setb p3.6
nop
clr p3.6
djnz 5fh,fs00
ret
end
;最后告诉大家:这个程序功能是非常正确的,这个程序比起上一个程序来说,短多了,又好读又好理解,又好维护
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -