
汇编语言程序如下:
假设1:D1~D8八个彩灯接在P1口,输出低电平发光
假设2:系统晶振为12MHz
假设3:N = 5
程序如下:
ORG 0000H
MOV R3, #5 N=5
LOOP0:
MOV A, #0FFH
MOV P1, #0FFH 开始时全灭
-------------------------------逐个点亮
MOV R2, #8
LOOP1: CLR C
RLC A
MOV P1, A
CALL DL500MS
DJNZ R2, LOOP1
-------------------------------逐个熄灭
MOV R2, #8
LOOP2: SETB C
RLC A
MOV P1, A
CALL DL500MS
DJNZ R2, LOOP2
-------------------------------全亮、全灭交替
MOV R2, #4
LOOP3: MOV P1, #0 全亮
CALL DL500MS
CALL DL500MS 共1s
MOV P1, #255 全灭
CALL DL500MS 0.5s
DJNZ R2, LOOP3
-------------------------------
DJNZ R3, LOOP0
MOV P1, #01001001B 5、显示为0100 1001
CALL DL500MS
CALL DL500MS 共1s
SJMP 0000H 重新开始N遍
-------------------------------延时子程序
DL500MS:
MOV R5, #9 1T
DL1: MOV R6, #128 1T
DL2: MOV R7, #215 1T
NOP 1T
DL3: DJNZ R7, DL3 2T 2 * 215 = 430 T
DJNZ R6, DL2 2T [1+1+430+2] * 128 = 55552 T
DJNZ R5, DL1 2T [1+55552+2] * 9 = 499995 T
RET 2T 1 + 499995 + 2 = 499998 T
-------------------------------------
END
扩展资料:
实现8路流水灯的原理:
下图为主控芯片和流水灯模块的原理图。
流水灯模块接在单片机的P1口,由原理图可以知道,在P1口给一个低电平即可点亮LED灯。相反,如果要LED灯熄灭,就要把P1口的电平变为高电平即可。
要实现流水灯功能,只要将LED1~LED8依次点亮、熄灭,依始类推,8只LED变会一亮一暗的做流水灯了。
实现8个LED流水灯程序用中文表示为:
P1.0低、延时、P1.0高、P1.1低、延时、P1.1高、P1.2低、延时、P1.2高、P1.3低、延时、P1.3高。
P1.4低、延时、P1.4高、P1.5低、延时、P1.5高、P1.6低、延时、P1.6高、P1.7低、延时、P1.7高、返回到开始、程序结束。
开关控制指示灯显示MY8255_AEQU 0A860H;8255A口地址
MY8255_BEQU 0A861H;8255B口地址
MY8255_CEQU 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_AEQU 0b860H;8255A口地址
MY8255_BEQU 0b861H;8255B口地址
MY8255_CEQU 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
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)