微机原理 跑马灯
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: ;选择最右边两个灯L11、L12
PUSH CX;保存
PUSH DX
mov
cx,1000;约定5000次loop是1s
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