基于51单片机的汇编程序:拨码开关控制八位LED实现流水灯
2022-03-08,51单片机学习笔记
功能
打开K1循环左移,打开K2循环右移,打开K3两侧到中心来回点亮,打开K4单双数位置交替点亮。拨码开关优先级:K1>K2>K3>K4。
视频展示
【用汇编写流水灯:基于51单片机的拨码开关控制八位LED流水灯实验】
开发环境
Keil C51
硬件连接方式
STC89C52RC | 外设 | 描述 |
---|---|---|
P1.0 ~ P1.7 | LED1 ~ LED8 | 八位共阳极发光二极管 |
P3.4 ~ P3.7 | KEY1 ~ KEY4 | 独立拨码开关 |
汇编代码1
; LED点亮方式:低电平点亮
;打开K1循环左移,打开K2循环右移,打开K3两侧到中心来回点亮,打开K4单双数位置交替点亮
KEY1 BIT P3.4
KEY2 BIT P3.5
KEY3 BIT P3.6
KEY4 BIT P3.7
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV A,#0FEH
K1: JB KEY1,K2
MOV P1,A
ACALL DELAY_1S
RL A
SJMP K1
K2: JB KEY2,K3
MOV P1,A
ACALL DELAY_1S
RR A
SJMP K2
K3: JB KEY3,K4
MOV A,#07EH
MOV P1,A
ACALL DELAY_1S
JB KEY3,K4
MOV A,#0BDH
MOV P1,A
ACALL DELAY_1S
JB KEY3,K4
MOV A,#0DBH
MOV P1,A
ACALL DELAY_1S
JB KEY3,K4
MOV A,#0E7H
MOV P1,A
ACALL DELAY_1S
JB KEY3,K4
MOV A,#0DBH
MOV P1,A
ACALL DELAY_1S
JB KEY3,K4
MOV A,#0BDH
MOV P1,A
ACALL DELAY_1S
JB KEY3,K4
SJMP K3
K4: JB KEY4,OVER
MOV A,#55H
MOV P1,A
ACALL DELAY_1S
JB KEY4,OVER
MOV A,#0AAH
MOV P1,A
ACALL DELAY_1S
JB KEY4,OVER
SJMP K4
OVER:MOV A,#0FEH
AJMP K1
DELAY_1S:
MOV R5,#20
DL1:MOV R6,#100
DL0:MOV R7,#248
DJNZ R7,$ ;寄存器R7减1,不为零转移到当前地址
DJNZ R6,DL0 ;寄存器R6减1,不为零转移到DL0
DJNZ R5,DL1 ;寄存器R5减1,不为零转移到DL1
RET ;R7从250减到0时,R6减1,R6从100减到0时,R5减1,R5从20减到0时,子程序返回
END
汇编代码2
; LED点亮方式:低电平点亮
;按下K1循环左移,按下K2循环右移,按下K3两侧到中心来回点亮,按下K4单双数位置交替点亮
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN:
MOV R0,#0FEH
MOV R1,#7FH
MOV R2,#7FH
MOV R4,#0FEH
MOV R3,#55h
LP:
MOV P3,#0FFH
MOV A,P3
JNB ACC.4,K1
JNB ACC.5,K2
JNB ACC.6,K3
JNB ACC.7,K4
SJMP LP
K1: MOV A,R0
MOV P1,A
ACALL DELAY_1S
RL A
MOV R0,A
SJMP LP
K2: MOV A,R1
MOV P1,A
ACALL DELAY_1S
RR A
MOV R1,A
SJMP LP
K3: MOV A,R2
ANL A,R4
MOV P1,A
ACALL DELAY_1S
MOV A,R2
RR A
MOV R2,A
MOV A,R4
RL A
MOV R4,A
SJMP LP
K4: MOV A,R3
MOV P1,A
ACALL DELAY_1S
CPL A
MOV R3,A
SJMP LP
DELAY_1S:
MOV R5,#20
DL1:MOV R6,#100
DL0:MOV R7,#100
DJNZ R7,$ ;寄存器R7减1,不为零转移到当前地址
DJNZ R6,DL0 ;寄存器R6减1,不为零转移到DL0
DJNZ R5,DL1 ;寄存器R5减1,不为零转移到DL1
RET ;R7从250减到0时,R6减1,R6从100减到0时,R5减1,R5从20减到0时,子程序返回
END
C代码实现
#include <reg52.h>
#include <intrins.h>
#define uint unsigned int
#define uchar unsigned char
sbit K1 = P3^4;
sbit K2 = P3^5;
sbit K3 = P3^6;
sbit K4 = P3^7;
uchar L_leftmove[]={0xFE,0xFD,0xFB,0xF7,0xEF,0xDF,0xBF,0x7F};
uchar L_center2side[]={0x7E,0xBD,0xDB,0xE7,0xDB,0xBD};
uchar L_odd2even[]={0x55,0xAA};
/*1MS为单位的延时程序*/
void delay_1ms(uchar x)
{
uchar j;
while(x--){
for(j=0;j<125;j++)
{;}
}
}
uchar i=0;
void ROL_LED()
{
if(i>7){i=0;}
P1=L_leftmove[i];
i++;
}
void ROR_LED()
{
if(i>7){i=0;}
P1=L_leftmove[7-i];
i++;
}
void Center2Side_LED()
{
if(i>5){i=0;}
P1=L_center2side[i];
i++;
}
void Odd2Even_LED()
{
if(i>1){i=0;}
P1=L_odd2even[i];
i++;
}
void KEY_Ctrl()
{
if(K1==0)
{
ROL_LED();
}
else if(K2==0)
{
ROR_LED();
}
else if(K3==0)
{
Center2Side_LED();
}
else if(K4==0)
{
Odd2Even_LED();
}
}
void main()
{
P3|=0xF0;//按键初始化置1
while(1)
{
KEY_Ctrl();
delay_1ms(200);
}
}
写在最后:
本文仅为个人学习笔记,纰漏之处,欢迎斧正!