汇编走马灯花样设计
一、实验器材
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
相关推荐
这个例子实现了8个LED灯连接在P0口上,它们依次从左到右点亮,形似走马灯。使用了内联汇编函数 `_crol_` 将P0口的值向左循环移动,配合延时函数`DelayMS`,实现LED的循环点亮。 3. **LED来回点亮 - 左右滚动** 此...
这个程序实现了8个LED灯在P0口上从左到右依次点亮的走马灯效果。通过使用_crol_函数,P0口的值向左循环移动,每次循环点亮一个LED,然后调用DelayMS函数延迟150毫秒,形成连续流动的视觉效果。 3. **8只LED左右...
在这个例子中,8个LED连接到P0口,程序使用了内联汇编指令`_crol_()`,使P0口的值向左循环移动,每次移动后延时150毫秒,从而实现LED逐个点亮的走马灯效果。 实例03是8只LED左右来回点亮,这个程序结合了`_crol_()`...
此案例展示了如何控制8个LED依次点亮,产生类似走马灯的效果。这里使用了8051的P0口,并利用内联汇编指令`_crol_`对P0口的值进行左移操作。在主程序中,P0口初始化为0xFE,然后在一个无限循环中,不断地将P0口的值...
2. **从左到右的流水灯**:这个例子展示了如何使用循环移位函数实现走马灯效果。程序首先将所有LED关闭(除了最后一个),然后通过内联汇编函数 `_crol_` 将P0口的值向左循环移动,每次移动后延时一段时间,从而实现...
程序通过_crol_函数使P0口的值向左循环移动,每次只改变一个位的状态,从而实现LED从左到右依次点亮的走马灯效果。同样,这里也用到了DelayMS函数来控制每个LED点亮的时间。 案例03展示了8个LED在P2口上的左右来回...
流水灯效果是通过P0口控制8个LED,依次点亮形成走马灯效果。程序首先将P0口设置为全1,然后在一个无限循环中,使用内联汇编函数_crol_将P0口的值向左循环移动一位,每次移动后调用DelayMS函数延迟150ms,从而实现...
通过循环移位函数`_crol_`,LED的值在P0口上逐位左移,配合延时函数,实现了走马灯效果。 3. **8只LED左右来回点亮** 此实例进一步扩展了流水灯效果,让LED在左右两个方向来回滚动。程序使用了`_crol_`(左移)和`...
此实例中,8个LED连接到P0口,依次从左到右点亮,形成走马灯效果。P0=_crol_(P0,1);语句实现了P0口值的左循环移位,每次循环移位后,LED的状态就会改变,配合DelayMS()函数,形成了连续流动的灯光效果。 3. 实例03...