📄 file18.asm
字号:
; 这个程序采用8x8点阵数码显示一些汉字和图形符号
; 以后我们会陆续推出更多的这方面的程序
; 本程序实现循环现实"欢迎使用HJ51/AVR"。
; 当然您可以根据自己的想法进行设计
; 比如,可以设计一个逐渐扩大的方块,一个左右移动的霓虹效果等
;下载以后,需要进行跳线关闭数码显示,切换到点阵显示,只要把
; 点阵[屏左方(三极管上方)的短路帽拔出来,短路在右边两个端子即可
; 默认在左边,同样,如果您需要数码管显示,需要把他放回去
beep equ p3.7
segdata equ p0 ;数据 输出
sege equ p2.7 ;显示 选中
segb equ p2.6 ;位 选
segd equ p2.5 ;段 选
org 00h
jmp main
org 30h
main:mov sp,#30h
clr beep ;关闭蜂鸣器
mov r0,#0
mov r1,#0
mov r2,#0
kk: mov dptr,#num ;获得需要显示的表头
mov a,r1
mov b,#8 ; 一个字符占用8位数据
mul ab
add a,dpl
mov dpl,a ; 重定位数据表
lop:mov a,r0
movc a,@a+dptr ;查表找到数据
mov b,r0
acall led8 ;进行刷新显示
inc r0
cjne r0,#8,lop ;循环输出8个点
mov r0,#0
inc r2
cjne r2,#60,lop ;为了保证亮度,每个字进行60次循环显示
mov r2,#0
mov r0,#0
inc r1
cjne r1,#11,kk ;一共需要显示11个字符
jmp main
num:
db 90h,0ffh,99h,25h,22h,55h,88h,00h ;欢
db 22h,0f0h,0abh,0aah,0aah,0eah,22h,0ffh ;迎
db 24h,0fch,0fah,0abh,0fah,32h,4ah,80h ;使
db 82h,0feh,92h,0bah,92h,0bah,92h,51h ;用
db 66h,66h,66h,7eh,7eh,66h,66h,66h ;H
db 7eh,18h,18h,18h,18h,18h,0eh,00h ;J
db 41h,5fh,41h,47h,48h,51h,4ah,44h ;51
db 80h,40h,20h,10h,08h,04h,02h,01h ;/
db 10h,18h,28h,24h,24h,3eh,42h,41h ;a
db 01h,21h,12h,12h,0ah,0ah,04h,04h ;v
db 03h,7eh,86h,86h,7eh,16h,26h,0c6h ;r
;表是怎么做出来的
;+++++++++++++++++++++++++++++++++++++
; 列
; 行 1l1,1l2,1l3,1l4,1l5,1l6,1l7,1l8 ;用这一行作个范例
; 我们假设每一行从 l1->l8依次对应一个自己的低->高8位数
; 每一个点要亮我们设为1,否则,0就灭,那么,我们就可以看到
; 如果第一行第一个要亮起来,它对应的数就是 1000 0000
; 依次类推,第2。。8行
; 我们用一个字来看 ,H,用*表示显示
;
; 列 1 2 3 4 5 6 7 8
; 行 1 * * * * => 66H
; 2 * * * * => 66H
; 3 * * * * => 66H
; 4 * * * * * * => 7EH
; 5 * * * * * * => 7EH
; 6 * * * * => 66H
; 7 * * * * => 66H
; 8 * * * * => 66H
; 上面的那个表就是根据这里作出来的
;********* 8x8LED显示刷新 *************
; A 列,B 行
led8:clr sege
cpl a
mov segdata,a ;列
setb segd
nop
clr segd
mov a,#1
lep: rl a
djnz b,lep
mov segdata,a ;行
setb segb
nop
clr segb
acall delayds
mov segdata,#0 ;行消
setb segb
nop
clr segb
ret
;*** 显示参数说明 *********************
; A里面存放需要显示的数字
; B里面存放需要显示的数码管位数
; 如果B大于8,那么消隐所有数码显示内容
; 另外使用了一个临时存储单元,segtmp
;
display:
clr sege
mov dptr,#tab_nu
movc a,@a+dptr
mov segdata,a
setb segd
nop
clr segd
mov a,#1
lp: rl a
djnz b,lp
mov segdata,a
setb segb
nop
clr segb
acall delayds
mov segdata,#0
setb segb
nop
clr segb
ret
;************* 和显示配套的延时子程序 *********************************************
;*********** 延时 5ms ****************
delayds:
push psw
clr psw.3
setb psw.4
mov r0,#250
d5: djnz r0,d5
pop psw
ret
;************************************************************************************
;这是数字显示表格,其中 带小数点的数字比不带小数点的数字大16
; 比如 0 的显示代码为 0;那么 0.的显示代码为 16;如此类推
tab_nu:
db 0c0h, 0f9h, 0a4h, 0b0h, 99h , 92h , 82h, 0f8h ; 数字0-7 不带小数点代码
db 80h , 90h, 88h , 83h , 0c6h, 0a1h, 86h, 8eh ; 数字8-f 不带小数点代码
db 40h , 79h, 24h , 30h , 19h , 12h , 02h, 78h ; 数字0-7 带小数点代码
db 00h , 10h, 08h , 03h , 46h , 21h , 06h, 0eh ; 数字8-f 带小数点代码
end
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -