按键控制led灯的程序

按键控制led灯的程序,第1张

流程中的问题!!

#include<reg52h>

#define uchar unsigned char

sbit led=P1^0;

sbit key=P0^0;

void delay(uchar x)

{

uchar a,b;

for(a=x;a>0;a--)

for(b=110;b>0;b--);

}

void main()

{

while(1)

{

if(key==0) //例如:现在按钮被按下

{

delay(5);

if(key==0) //延时消抖后按钮被按下状态,

{

while(key==0); //此行删除,进行下行指令

led=~led; //led灯翻转

}

}

}

}

ORG 0000H

MAIN:MOV A,#0FEH

LOOP:MOV P1,A

RR A

ACALL DELAY

LJMP LOOP

DELAY:MOV R7,#200

D1: MOV R6,#250

DJNZ R6,$

DJNZ R7,D1

RET

END

一、点亮一个LED灯

程序:MOV A,#00FEH MOV P1,A JMP $ END

图:

二、点亮1、3、5、7LED灯

程序:MOV A,#00AAH MOV P1,A JMP $ END

图:

三、尝试让一个LED灯闪烁

程序:

STRAT:MOV A,#00FEH MOV P1,A LCALL DEL MOV A,#00FFH MOV P1,A LCALL DEL JMP STRAT

DEL:MOV R1,#127

DEL1:MOV R2,#200

DEL2:DJNZ R2,DEL2 DJNZ R1,DEL1 RET END

图:

实验三 延时程序

实验目的:

1、学会程序的嵌套以及熟练对指令的 *** 作

实验内容:

1、延时子程序的设计

2、I/O口的应用 *** 作

实验 *** 作:

1、设计8个循环点亮的LED灯,1、2、3、4、5、6、7、8顺序点亮。

程序: ORG 0000H LJMP START ORG 0100H START: MOV A,#007FH LOOP: RL A MOV P1,A LCALL DELAY1 JMP LOOP DELAY2: MOV R1,#127 DEL1: MOV R2,#200 DEL2: DJNZ R2,DEL2 DJNZ R1,DEL1 RET END

开关控制指示灯显示

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

这个流水灯是很普通的一种花样,假设LED接P1口,程序如下:

ORG 0000H

LJMP MAIN

0RG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-50000) ;50毫秒定时

MOV TL0,#LOW(65536-50000)

SETB TR0

SETB ET0

SETB EA

MOV A,#0FEH

MOV P1,A

MOV R2,#20

SJMP $

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

DJNZ R2,T0E ;1秒未到直接退出

MOV R2,#20

RL A

MOV P1,A ;1秒一变的花样流水灯。

T0E:

RETI

END

ORG 0000H

LJMP MAIN

ORG 000BH

LJMP T0ISR

ORG 0030H

MAIN:

MOV TMOD,#01H

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

SETB ET0

SETB EA

CLR P10

MOV R2,#10

SJMP $

T0ISR:

CLR TR0

MOV TH0,#HIGH(65536-50000)

MOV TL0,#LOW(65536-50000)

SETB TR0

DJNZ R2,T0E

CPL P10

MOV R2,#10

T0E:

RETI

END

以上就是关于按键控制led灯的程序全部的内容,包括:按键控制led灯的程序、led流水灯单片机程序、大学单片机七彩流水灯(急急急)等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10634416.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-10
下一篇 2023-05-10

发表评论

登录后才能评论

评论列表(0条)

保存