加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

微机原理 跑马灯

(2013-01-11 23:53:28)
标签:

杂谈

分类: 汇编
微机原理课程设计:
 用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             ;段控制口

OUTBIT  equ  0ffddh             ;位控制口/键扫口

IN_KEY  equ  0ffdeh             ;键盘读入口

LedBuf   db   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:         ;选择四个灯L9 L10 L11 L12每个灯亮3s

   call Run_light_b

   jmp Light_b

 

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

   call Run_light_c

   jmp Light_c

 

Light_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;如果输入则跳转主界面

        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;如果输入则跳转主界面

         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;如果输入则跳转主界面

        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;如果输入则跳转主界面

         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


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有