新浪博客

微机原理 跑马灯

2013-01-11 23:53阅读:
微机原理课程设计:
用8255控制发光二极管按一定规律轮流点亮(跑马灯)
(一)设计要求
每隔4秒使两个发光二极管循环依次点亮;每隔3秒使四个发光二极管循环依次点亮;每隔2秒使六个发光二极管循环依次点亮;每隔1秒使八个发光二极管循环依次点亮,共计四种点亮功能。可设置键盘命令键:
按下‘A’~‘D’,分别进入四种点亮功能。
按下‘E’键,从各功能返回,停止显示,等待输入命令。
(二)提示
1.主程序为键盘输入,按‘A’~‘D’命令键,分支到各点亮功能程序段,按‘E’返回键盘输入命令程序段。
2.键盘的管理,定时的时间,可参考软件实验九、十。
3.通过8255A的端口来控制发光二极管,循环到的发光二极管点亮,其他的不亮。循环方向可从左到右,也可以从右到左。
4.8255A控制点亮发光二极管,可参考硬件实验二,8255A并行口实验(二)。
(三)要完成的工作
1.设计出完整的汇编语言程序。
2.上机调试,在实验系统中通过验收。
3.写出课程设计报告,内容包括:设计思想、功能流程图、结果讨论和完整的源程序
;***************************
;跑马灯
;***************************

CODE SEGMENT
ASSUME CS:CODE,DS:CODE,ES:CODE

OUTSEG equ 0ffdch
br>;段控制口
OUTBIT equ 0ffddh ;位控制口/键扫口
IN_KEY equ 0ffdeh ;键盘读入口
LedBuf db 6 dup(?) ;显示缓冲
PA EQU 0FFD8H ;8255A四个控制端口地址
PB EQU 0FFD9H
PC EQU 0FFDAH
PCTL EQU 0FFDBH
org 32F0h;


Start:

MOV AL,80H; 控制字 A端口输出
MOV DX,PCTL
OUT DX,AL
MLoop:
mov dx,pa
mov al,0ffh ;初始化时8个灯全部灭掉
out dx,al
call GetKey ;扫描键盘并读取键值
cmp al,0ah ;判断是否输入ABCD 其他输入无效 如果输入ABCD 则进入相应的功能模块
jz Light_a ;jz 结果为0则跳转(ZF=1 跳转)
cmp al,0bh
jz Light_b
cmp al,0ch
jz Light_c
cmp al,0dh
jz Light_d ;如果不是ABCD 顺序执行下面的
jmp MLoop
;以上是主程序


Light_a: ;选择两个灯(L11 L12) 每个灯亮4s
call Run_light_a
jmp Light_a

Light_b: ;选择四个灯B L9 L10 L11 L12每个灯亮3s
call Run_light_b
jmp Light_b

Light_c: ;选择六个灯C L7 L8 L9 L10 L11 L12 每个灯亮2s
call Run_light_c
jmp Light_c

Light_d: ;选择八个灯D L5 L6 L7 L8 L9 L10 L11 L12 每个灯亮1s
call Run_light_d
jmp Light_d


Run_light_a: ;选择最右边两个灯L11L12

PUSH CX;保存
PUSH DX
mov cx,1000;约定5000loop1s
MOV DX,PA
MOV AL,0FEH ;其他灯全灭 L12
OUT DX,AL
call delay1;延迟4s
mov cx,1000
MOV DX,PA
MOV AL,0FDH;只有L11
OUT DX,AL
call delay1;延迟4s
POP DX
POP CX;
RET

DELAY1:
push cx
mov cx,2
ddd: loop ddd
call GetKey
cmp al,0eh;看有无E输入
jz MLoop;如果输入E 则跳转主界面
pop cx
LOOP DELAY1
RET

mm: jmp MLoop

Run_light_b:;选择最右边四个 L9 L10 L11 L12 3s
PUSH CX
PUSH DX
MOV CX,5000;3 MINUTS
MOV DX,PA
MOV AL,0FEH ;其他灯全灭 L12
OUT DX,AL
call delay2;延迟3s
MOV CX,5000;3 MINUTS
MOV DX,PA
MOV AL,0FDH;只让L11
OUT DX,AL
call delay2;延迟3s
MOV CX,5000;3 MINUTS
MOV DX,PA
MOV AL,0FBH;L10
OUT DX,AL
call delay2
MOV CX,5000;3 MINUTS
MOV DX,PA
MOV AL,0F7H;L9
OUT DX,AL
CALL DELAY2
POP DX
POP CX
RET

DELAY2:
push cx
mov cx,3
ddd1: loop ddd1
call GetKey
cmp al,0eh;看有无E输入
jz mm;如果输入E 则跳转主界面
pop cx
LOOP DELAY2
RET

mm0: jmp MLoop


Run_light_c:;选择最右边六个 L7 L8 L9 L10 L11 L12 2s
PUSH CX
PUSH DX
MOV CX,5000
MOV DX,PA
MOV AL,0FEH ;其他灯全灭 L12
OUT DX,AL
call delay3;延迟2s
MOV CX,5000
MOV DX,PA
MOV AL,0FDH;只让L11
OUT DX,AL
call delay3;
MOV CX,5000
MOV DX,PA
MOV AL,0FBH ;只有L10
OUT DX,AL
call delay3
MOV CX,5000
MOV DX,PA
MOV AL,0F7H;只有L9
OUT DX,AL
call delay3
MOV CX,5000
MOV DX,PA
MOV AL,0EFH;只有L8
OUT DX,AL
call delay3
MOV CX,5000
MOV DX,PA
MOV AL,0DFH;只有L7
OUT DX,AL
call delay3
POP DX
POP CX
RET

DELAY3: push cx
mov cx,2
ddd2: loop ddd2
call GetKey
cmp al,0eh;看有无E输入
jz mm0;如果输入E 则跳转主界面
pop cx
LOOP DELAY3
RET


mm1: jmp mm ;
Run_light_d:;选择最右边八个 L5 L6 L7 L8 L9 L10 L11 L12 1s
PUSH CX
PUSH DX
MOV CX,2500;1s
MOV DX,PA
MOV AL,07FH ;其他灯全灭 L12
OUT DX,AL
call delay4;延迟1s
MOV CX,2500;1s
MOV DX,PA
MOV AL,0bFH;只让L11
OUT DX,AL
call delay4;延迟4s
MOV CX,2500;1s
MOV DX,PA
MOV AL,0dfH ;只有L10
OUT DX,AL
call delay4
MOV CX,2500;1s
MOV DX,PA
MOV AL,0efH;只有L9
OUT DX,AL
call delay4
MOV CX,2500;1s
MOV DX,PA
MOV AL,0f7H;只有L8
OUT DX,AL
call delay4
MOV CX,2500;1s
MOV DX,PA
MOV AL,0fbh;只有L7
OUT DX,AL
call delay4
MOV CX,2500;1s
MOV DX,PA
MOV AL,0fdH;只有L6
OUT DX,AL
call delay4
MOV CX,2500;1s
MOV DX,PA
MOV AL,0feH;只有L5
OUT DX,AL
call delay4
POP DX
POP CX
RET



DELAY4: push cx
mov cx,2
ddd3: loop ddd3
call GetKey
cmp al,0eh;看有无E输入
jz mm1;如果输入E 则跳转主界面
pop cx
LOOP DELAY4
RET


GetKey:
;键扫子程序
mov al,0ffh ;关显示口
mov dx,OUTSEG
out dx,al
mov bl,0
mov ah,0feh
mov cx,8
key1: mov al,ah
mov dx,OUTBIT
out dx,al
shl al,1
mov ah,al
nop
nop
nop
nop
nop
nop
mov dx,IN_KEY
in al,dx
not al
nop
nop
and al,0fh
jnz key2
inc bl
loop key1
nkey: mov al,20h
ret
key2: test al,1
je key3
mov al,0
jmp key6
key3: test al,2
je key4
mov al,8
jmp key6
key4: test al,4
je key5
mov al,10h
jmp key6
key5: test al,8
je nkey
mov al,18h
key6: add al,bl
cmp al,10h
jnc fkey
mov bx,offset KeyTable
xlat
fkey: ret


KeyTable: ;键码定义
db 07h,04h,08h,05h,09h,06h,0ah,0bh
db 01h,00h,02h,0fh,03h,0eh,0ch,0dh


code ends
end Start

我的更多文章

下载客户端阅读体验更佳

APP专享