`
Marshal_R
  • 浏览: 132876 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

汇编走马灯花样设计

阅读更多

汇编走马灯花样设计

一、实验器材

    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.8 KB
  • 大小: 14.9 KB
  • 大小: 23.9 KB
  • 大小: 53.2 KB
  • 大小: 114.8 KB
分享到:
评论

相关推荐

    (完整word)单片机C语言程序设计实训100例.doc

    这个例子实现了8个LED灯连接在P0口上,它们依次从左到右点亮,形似走马灯。使用了内联汇编函数 `_crol_` 将P0口的值向左循环移动,配合延时函数`DelayMS`,实现LED的循环点亮。 3. **LED来回点亮 - 左右滚动** 此...

    单片机C语言程序的设计代码和仿真图.doc

    这个程序实现了8个LED灯在P0口上从左到右依次点亮的走马灯效果。通过使用_crol_函数,P0口的值向左循环移动,每次循环点亮一个LED,然后调用DelayMS函数延迟150毫秒,形成连续流动的视觉效果。 3. **8只LED左右...

    单片机C语言程序设计实例

    在这个例子中,8个LED连接到P0口,程序使用了内联汇编指令`_crol_()`,使P0口的值向左循环移动,每次移动后延时150毫秒,从而实现LED逐个点亮的走马灯效果。 实例03是8只LED左右来回点亮,这个程序结合了`_crol_()`...

    单片机C语言程序设计实训100例—基于8051+Proteus仿真

    此案例展示了如何控制8个LED依次点亮,产生类似走马灯的效果。这里使用了8051的P0口,并利用内联汇编指令`_crol_`对P0口的值进行左移操作。在主程序中,P0口初始化为0xFE,然后在一个无限循环中,不断地将P0口的值...

    基于51单片机的C语言程序设计.doc

    2. **从左到右的流水灯**:这个例子展示了如何使用循环移位函数实现走马灯效果。程序首先将所有LED关闭(除了最后一个),然后通过内联汇编函数 `_crol_` 将P0口的值向左循环移动,每次移动后延时一段时间,从而实现...

    8051程序设计100例

    程序通过_crol_函数使P0口的值向左循环移动,每次只改变一个位的状态,从而实现LED从左到右依次点亮的走马灯效果。同样,这里也用到了DelayMS函数来控制每个LED点亮的时间。 案例03展示了8个LED在P2口上的左右来回...

    单片机C语言程序设计实训100例—基于8051Proteus仿真.pdf

    流水灯效果是通过P0口控制8个LED,依次点亮形成走马灯效果。程序首先将P0口设置为全1,然后在一个无限循环中,使用内联汇编函数_crol_将P0口的值向左循环移动一位,每次移动后调用DelayMS函数延迟150ms,从而实现...

    PROTEUS仿真100实例.pdf

    通过循环移位函数`_crol_`,LED的值在P0口上逐位左移,配合延时函数,实现了走马灯效果。 3. **8只LED左右来回点亮** 此实例进一步扩展了流水灯效果,让LED在左右两个方向来回滚动。程序使用了`_crol_`(左移)和`...

    51单片机仿真100实例.doc

    此实例中,8个LED连接到P0口,依次从左到右点亮,形成走马灯效果。P0=_crol_(P0,1);语句实现了P0口值的左循环移位,每次循环移位后,LED的状态就会改变,配合DelayMS()函数,形成了连续流动的灯光效果。 3. 实例03...

Global site tag (gtag.js) - Google Analytics