1、目标
实现8个LED灯呈现流水灯效果。
2、原理图
51单片机P0口接八个共阴极LED灯,即IO口输出高电平,LED点亮。
3、51的GPIO特点
(1)51单片机IO口为双向口,所以不用配置为输入或输出,
(2)IO口配有锁存器,不修改IO口值不会改变。
4、延时详解
(1)下面延时用到的指令DJNZ ...为12时钟/机器周期时钟为24时钟周期。
(2)24个时钟周期即需要2个机器周期。
(3)晶振为12MHz举例:
晶振周期 = 时钟周期:1/12MHz = 1/12000000 S
机器周期:12/12000000S = 1uS
5、示例程序
;P0口接8个共阴极LED灯
;-------------------------------------
ORG 0000H ;ORG为程序段说明伪指令,它向汇编程序说明该程序段的起始地址,所以可以当中断向量地址用
LJMP L_Main ;跳转到L_Main标号处
L_Main:
;your code
MOV A,#0x01 ;把立即数0x01赋值给累加器A
L_loop:
MOV P0,A
LCALL F_Delay1S ;调用子程序,函数延时1秒
RL A ;累加器循环左移
LJMP L_loop ;跳转到标号L_loop处
SJMP $ ;在当前位置死循环
;---------------------------------------
F_Delay1S: ;1S = 2us*500000 (50*100*100)
MOV R7,#50 ;立即数50赋值给寄存器R7
L_loop2:
MOV R6,#100 ;立即数100赋值给寄存器R6
L_loop1:
MOV R5,#100 ;立即数100赋值给R5寄存器
DJNZ R5,$ ;R5寄存器值减1,不是零就跳转到当前位置,即减到零才跳出循环
DJNZ R6,L_loop1 ;相当于了100*100了
DJNZ R7,L_loop2 ;相当于50*100*100了
RET
;---------------------------------------
END