汇编语言 编写 程序 LED 灯显示

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了汇编语言 编写 程序 LED 灯显示相关的知识,希望对你有一定的参考价值。

用8255 连接pc机
LED闪烁显示控制
设计要求及方法:
(1) 在C口高4位设置4个按键:Set、 、 、Enter,Set选择两个计数器、 增加时间、减小时间、Enter确定。
(2)设置的时间分别存入两个缓冲单元,按“Enter”键时送两个计数器,计数器采用级连方式,由一个计数器控制LED闪烁。
(3)采用8255的B口和C口低4位驱动2个七段LED数码管,用动态扫描方式显示将发光二极管(LED)点亮的时间(单位:秒,<100秒)

开关控制指示灯显示
MY8255_A EQU 0A860H;8255A口地址
MY8255_B EQU 0A861H;8255B口地址
MY8255_C EQU 0A862H;8255C口地址
MY8255_MODE EQU 0A863H;8255控制口地址

CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,MY8255_MODE
MOV AL,82H
OUT DX,AL ;将控制字82H写入8255控制口,A口方式0输出,B口方式0输入, C口未用到。

A1: MOV DX,MY8255_B
IN AL,DX ;读8255 B口内容
MOV DX,MY8255_A
OUT DX,AL ; 将前面读到的B口内容送到A口,即A口内容=B口内容
CALL BREAK ;调用子程序BREAK
JMP A1        ;跳转到A1

BREAK PROC NEAR ;BREAK子程序
MOV AH,1
INT 16H
JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符
MOV AX,4C00H
INT 21H       ;返回DOS 
RETURN:RET

BREAK ENDP

CODE ENDS         
END START  

;流水灯显示
MY8255_A EQU 0b860H;8255A口地址
MY8255_B EQU 0b861H;8255B口地址
MY8255_C EQU 0b862H;8255C口地址
MY8255_MODE EQU 0b863H;8255控制口地址

DATA SEGMENT
LA DB ?;留出1个字节
LB DB ?;留出1个字节
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE
MOV AL,80H
OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0输出,C口未用到。
MOV DX,MY8255_A
MOV AL,7FH
OUT DX,AL ;将7FH送入A口
MOV LA,AL ;将7FH送入LA存储单元
MOV DX,MY8255_B
MOV AL,0FEH
OUT DX,AL ;将FEH送入B口
MOV LB,AL ;将FEH送入LB存储单元
CALL DALLY
A1: MOV AL,LA
ROR AL,1 ;LA内容循环右移1次
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL ;将循环右移后的LA内容送A口,其目的是让A口连接的LED灯依次向右循环点亮
MOV AL,LB
ROL AL,1 ;LB内容循环左移1次
MOV LB,AL
MOV DX,MY8255_B
OUT DX,AL ;将循环左移后的LB内容送B口,其目的是让B口连接的LED灯依次向左循环点亮
CALL DALLY ;延时,让一个LED灯发光稳定之后再点亮另一个
CALL BREAK ;调用BREAK子程序,看是否有键按下
JMP A1 ;跳转到A1

DALLY: MOV CX,3FFH ;延时子程序
D1: MOV AX,0FFFFH
D2: DEC AX
JNZ D2
LOOP D1
RET

BREAK PROC NEAR ;是否有键按下
MOV AH,06H
MOV DL,0FFH
INT 21H
JE RETURN ;若无,则转RETURN
MOV AX,4C00H
INT 21H ;返回DOS
RETURN:RET
BREAK ENDP

CODE ENDS
END START
参考技术A 开关控制指示灯显示
MY8255_A EQU 0A860H;8255A口地址
MY8255_B EQU 0A861H;8255B口地址
MY8255_C EQU 0A862H;8255C口地址
MY8255_MODE EQU 0A863H;8255控制口地址

CODE SEGMENT
ASSUME CS:CODE
START: MOV DX,MY8255_MODE
MOV AL,82H
OUT DX,AL ;将控制字82H写入8255控制口,A口方式0输出,B口方式0输入, C口未用到。

A1: MOV DX,MY8255_B
IN AL,DX ;读8255 B口内容
MOV DX,MY8255_A
OUT DX,AL ; 将前面读到的B口内容送到A口,即A口内容=B口内容
CALL BREAK ;调用子程序BREAK
JMP A1        ;跳转到A1

BREAK PROC NEAR ;BREAK子程序
MOV AH,1
INT 16H
JZ RETURN ;读按键字符,ZF=1,则返回;ZF=0,则AL=字符
MOV AX,4C00H
INT 21H       ;返回DOS 
RETURN:RET

BREAK ENDP

CODE ENDS         
END START  

;流水灯显示
MY8255_A EQU 0b860H;8255A口地址
MY8255_B EQU 0b861H;8255B口地址
MY8255_C EQU 0b862H;8255C口地址
MY8255_MODE EQU 0b863H;8255控制口地址

DATA SEGMENT
LA DB ?;留出1个字节
LB DB ?;留出1个字节
DATA ENDS
CODE SEGMENT
ASSUME CS:CODE,DS:DATA

START: MOV AX,DATA
MOV DS,AX
MOV DX,MY8255_MODE
MOV AL,80H
OUT DX,AL ;控制字80H送入8255控制口,A口、B口都是方式0输出,C口未用到。
MOV DX,MY8255_A
MOV AL,7FH
OUT DX,AL ;将7FH送入A口
MOV LA,AL ;将7FH送入LA存储单元
MOV DX,MY8255_B
MOV AL,0FEH
OUT DX,AL ;将FEH送入B口
MOV LB,AL ;将FEH送入LB存储单元
CALL DALLY
A1: MOV AL,LA
ROR AL,1 ;LA内容循环右移1次
MOV LA,AL
MOV DX,MY8255_A
OUT DX,AL ;将循环右移后的LA内容送A口,其目的是让A口连接的LED灯依次向右循环点亮
MOV AL,LB
ROL AL,1 ;LB内容循环左移1次
MOV LB,AL
MOV DX,MY8255_B
OUT DX,AL ;将循环左移后的LB内容送B口,其目的是让B口连接的LED灯依次向左循环点亮
CALL DALLY ;延时,让一个LED灯发光稳定之后再点亮另一个
CALL BREAK ;调用BREAK子程序,看是否有键按下
JMP A1 ;跳转到A1

DALLY: MOV CX,3FFH ;延时子程序
D1: MOV AX,0FFFFH
D2: DEC AX
JNZ D2
LOOP D1
RET

BREAK PROC NEAR ;是否有键按下
MOV AH,06H
MOV DL,0FFH
INT 21H
JE RETURN ;若无,则转RETURN
MOV AX,4C00H
INT 21H ;返回DOS
RETURN:RET
BREAK ENDP

CODE ENDS
END START
参考技术B 300块,可写。

编制一个循环闪烁灯的程序,每次其中某个灯闪烁10次后,转到下一个闪烁10次,循环不止(用汇编语言编制)

其程序如下:
MOV A,#01H ;灯亮初值
SHIFT: LCAIL FLASH ;调闪亮10次子程序
RR A ;右移一位
SJMP SHIFT ;循环
FLASH: MOV R2,#0AH 闪烁10次计数
FLASH1; MOV P1,A ;点亮
LCALL DELAY ;延时
MOV P1,#00H ;熄灭
LCALL DELAY ;延时
DJNZ R2,FLASH1 ;循环
RET
参考技术A

    汇编首先要做初始化,如stack,I/O,timer,关闭无用的中断.....

    然后才开始写你自己的程序!

参考技术B 不知道你有几个LED灯,假设有8个吧。
ORG 0000H
LJMP MAIN
ORG 0030H
MAIN:
MOV R2,#10
MOV A,#0FEH
LOOP:
MOV P0,A
LCALL DELAY
MOV P0,#0FFH
LCALL DELAY
DJNZ R2,LOOP
MOV R2,#10
RL A
SJMP LOOP
DELAY:
MOV R3,#100
DELAY1:
MOV R4,#250
DJNZ R4,$
DJNZ R3,DELAY1
RET
END追问

怎么每个灯闪一次就换了,我想的是一个灯闪10次后再换下一个灯闪10次

追答

没问题呀,就是10次。

本回答被提问者采纳
参考技术C 把 8 个 LED 接在 P1,低电平发光。
;---------------------
ORG 0000H
MOV A, #1
LP1:MOV R2, #20
LP2:XRL P1, A
CALL DL
DJNZ R2, LP2
RL A
SJMP LP1
;---------------------
DL: DJNZ R7, $
DJNZ R7, $
DJNZ R6, $ - 4
RET
;---------------------
END

以上是关于汇编语言 编写 程序 LED 灯显示的主要内容,如果未能解决你的问题,请参考以下文章

微机原理汇编语言课程设计 中的LED 灯显示控制代码怎么写?

编制一个循环闪烁灯的程序,每次其中某个灯闪烁10次后,转到下一个闪烁10次,循环不止(用汇编语言编制)

编制一个循环闪烁灯的程序,每次其中某个灯闪烁10次后,转到下一个闪烁10次,循环不止(用汇编语言编制)

帮忙用汇编语言写个程序,控制两个LED交替闪烁。

使用C语言按照GPIO操作流程点亮LED灯

用C语言编写,单片机控制LED灯并用定时器延时,每隔一秒使LED依次点亮,8 个灯