汇编走马灯花样设计
一、实验器材
TPC-USB实验机(芯片:8255、74LS273、ADC0809、数码管、8*8点阵)、TPC-USB软件
二、实验要求
1、LED走马灯花样(点亮花样)实验:利用TPC-USB的K7-K0 8位开关,控制LED产生8种走马灯花样。
2、在走马灯花样实验设计的基础上,增加在七段数码显示器上滚动显示自己的学号、8X8点阵上滚动显示自己的名字并控制滚动速度。
三、实验原理
1、设置8255为工作方式0,A口输出C口输入,C口接八个手动开关,A口接8颗灯,通过读取输入数据控制8颗灯的花样显示。

2、通过ADC0809模数转换器,电压旋钮调整电压大小控制转为16进制数据的大小,此数值作为循环控制的初值,以达到控制数码管、点阵滚动显示的效果。
3、74LS273输出端Q1-Q7接数码管a-g,Q8接数码管S1,Q8取反接数码管S0,通过Q8的变化达到循环显示十位和个位的目的。
4、每个时刻点阵中只有一列被显示(此实验中下图CS3的部分未用),不停高速轮转以达到显示整个8*8点阵的效果,通过循环次数控制点阵中字的滚动速度。
四、实验分析与设计
1、程序流程图
2、汇编代码
;************************
;* 走马灯花样设计实验 *
;************************
io0809a equ 280h
io8255a equ 288h
io8255c equ 28ah
io8255d equ 28bh
proth equ 290h
prothr equ 298h
ls273 equ 2a0h
data segment
;彩灯样式
pattern1 db 01H,02H,04H,08H,10H,20H,40H,80H ;彩灯从L0到L7依次点亮
pattern2 db 80H,40H,20H,10H,08H,04H,02H,01H ;彩灯从L7到L0依次点亮
pattern3 db 18H,24H,42H,81H,81H,42H,24H,18H ;彩灯先从中间到两端依次点亮再从两端到中间依次点亮
pattern4 db 81H,42H,24H,18H,18H,24H,42H,81H ;彩灯先从两端到中间依次点亮再从中间到两端依次点亮
pattern5 db 0FEH,0FDH,0FBH,0F7H,0EFH,0DFH,0BFH,7FH ;彩灯从L0到L7依次熄灭
pattern6 db 7FH,0BFH,0DFH,0EFH,0F7H,0FBH,0FDH,0FEH ;彩灯从L7到L0依次熄灭
pattern7 db 0E7H,0DBH,0BDH,7EH,7EH,0BDH,0DBH,0E7H ;彩灯先从中间到两端依次熄灭再从两端到中间依次熄灭
pattern8 db 7EH,0BDH,0DBH,0E7H,0E7H,0DBH,0BDH,7EH ;彩灯先从两端到中间依次熄灭再从中间到两端依次熄灭
count dw ?
;学号(12330272)
led db 86h,5bh,0dbh,4fh,0cfh,4fh,0cfh,3fh,0bfh,5bh,0dbh,07h,87h,5bh
;名字(RSH)
myname db 00h,00h,00h,00h,00h,00h,00h,00h
db 00h,00h,7fh,58h,54h,72h,01h,00h
db 00h,00h,79h,49h,49h,4fh,00h,00h
db 00h,00h,7fh,08h,08h,7fh,00h,00h
db 00h,00h,00h,00h,00h,00h,00h,00h
data ends
stseg segment
dw 256 dup(?)
stseg ends
code segment
assume cs:code, ds:data, ss:stseg
start: mov dx,data
mov ds,dx
mov di,0
mov bh,0
mov byte ptr count,bh
;设置8255 A口输出C口输入,使全部灯熄灭
mov dx,io8255d
mov al,8bh
out dx,al
mov al,0
mov dx,io8255a
out dx,al
;选择为哪一轮灯样式
select: mov dx,io8255c
in al,dx
lamp1: cmp al,01h ;比较al是否为01h,不是则跳转到lamp2继续比较
jnz lamp2
lea si,pattern1 ;si指向pattern1
jmp show
lamp2: cmp al,02h
jnz lamp3
lea si,pattern2
jmp show
lamp3: cmp al,04h
jnz lamp4
lea si,pattern3
jmp show
lamp4: cmp al,08h
jnz lamp5
lea si,pattern4
jmp show
lamp5: cmp al,10h
jnz lamp6
lea si,pattern5
jmp show
lamp6: cmp al,20h
jnz lamp7
lea si,pattern6
jmp show
lamp7: cmp al,40h
jnz lamp8
lea si,pattern7
jmp show
lamp8: cmp al,80h
jnz default
lea si,pattern8
jmp show
default: jmp select ;若都不匹配(更改或关掉灯花样对应的开关),跳转回select重新进行选择判断
;展示一轮灯样式
show: mov bl,8 ;每轮重复8次
next: mov al,[si]
mov dx,io8255a
out dx,al ;显示一个灯花样
;从A/D转换器读数控制滚动速度
mov dx,io0809a ;启动A/D转换器
out dx,al
in al,dx ;从A/D转换器输入数据
add al,1
;数码管显示学号
goon: push si ;压栈保护数据
call id ;数码管中显示学号
pop si ;恢复
;点阵顺序显示8列一遍
push di ;压栈保护数据
call displayname ;点阵显示名字
pop di ;恢复
dec al
jnz goon ;分时循环显示学号和名字
;一个灯花样之后的判断跳转
add count,2 ;学号向左滚动
cmp count,14 ;判断学号是否滚动显示到最后
jnz skip1
mov count,0 ;从头显示学号
skip1: inc di ;名字向左滚动一列
cmp di,32 ;判断名字是否滚动显示到最后
jnz skip2
mov di,0 ;从头显示名字
skip2: inc si ;下一个灯花样
dec bl
cmp bl,0 ;判断一轮灯花样是否结束
jnz next ;跳转到下一个灯花样
jmp select ;跳转到下一轮灯花样
;七段数码管显示学号子程序
id proc
push ax ;压栈
push bx
push cx
push dx
lea si,led ;si指向学号首地址
add si,count ;si指向当前要显示的学号(十位)
mov cx,2 ;十位、个位循环显示次数
;循环显示十位、个位
again: mov al,[si]
mov dx,ls273
out dx,al ;学号十位显示
mov al,[si+1]
mov dx,ls273
out dx,al ;学号个位显示
loop again
mov al,0
out dx,al ;灭灯
pop dx ;恢复
pop cx
pop bx
pop ax
ret ;子程序结束返回
id endp
;8*8点阵显示名字子程序
displayname proc
push ax ;压栈
push bx
push cx
push dx
mov ah,80h
mov cx,8 ;循环次数
each: mov al,myname[di]
mov dx,proth
out dx,al ;输出行码
mov al,ah
mov dx,prothr
out dx,al ;输出列码
mov al,0
out dx,al ;关闭点阵显示
shr ah,1 ;右移显示下一列
inc di ;指向下一个行码
loop each
pop dx ;恢复
pop cx
pop bx
pop ax
ret ;子程序结束返回
displayname endp
code ends
end start
LED走马灯花样设计实验
1562

被折叠的 条评论
为什么被折叠?



