汇编走马灯花样设计
一、实验器材
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点阵的效果,通过循环次数控制点阵中字的滚动速度。
四、实验分析与设计
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