实验内容:
某单片机控制系统,P1口接有8发光二极管,P3.0、P3.1、P3.2、P3.3接有4个开关K1、K2、K3、K4,试画出接口电路,并编程使得当K1按下时8个发光二极管全亮;当K2按下时8个发光二极管全灭;当K3按下时8个发光二极管由左向右点亮;当K4按下时8个发光二极管由右向左点亮。通过汇编语言实现。
实验环境:
Keil软件、 51单片机开发板
实验电路:
独立按键电路连接:
LED模块电路连接(共阳极连接方式):
实验效果图:
k1:(LED全部点亮)
k2:(LED全部熄灭)
k3:(LED向右点亮)
k4:(LED向左点亮)
实现代码:
MOV B,#0FEH ;用于等下流水灯的左移、右移
MOV P0,#00H ;熄灭开发板上的数码管
UP2: MOV A,P3
ANL A,#0FH
CJNE A,#0FH,NEXT1 ;比较立即数与寄存器,不相等则转移
SJMP UP2
NEXT1:
LCALL D10ms ;延时消抖
MOV A,P3
ANL A,#0FH
CJNE A,#0FH,NEXT2 ;消抖后的重新检测 (一次检测4个按键)
SJMP UP2
NEXT2: ;接下来具体检测是哪一按键被按下
JB P3.0,NEXT3 ;不是P3.0按下 转移检测下一个按键
LCALL K1 ;是P3.0按下,转移到K1按键功能子函数
NEXT3:
JB P3.1,NEXT4 ;JB是判断位变量的转移指令,如果P3.1是1 那么就转移到NEXT4(说明没有被按下)
LCALL K2 ;上面不转移,则说明按键P3.1被按下,那么就转移到K2的按键功能子函数
NEXT4:
JB P3.2,NEXT5
LCALL K3
NEXT5:
JB P3.3,UP2
LCALL K4
LJMP UP2
K1: MOV P2,#0FFH ;LED全亮
RET
K2: MOV P2,#00H ;LED全灭
RET
K3: MOV P2,B ;按一次LED灯向右移动一位
LCALL DELAY ;按住不松手就是流水灯
MOV A,B
RL A ;循环左移
MOV B,A
RET
K4: MOV P2,B ;按一次LED灯向左移动一位
LCALL DELAY ;按住不松手就是流水灯
MOV A,B
RR A ;循环右移移
MOV B,A
RET
D10ms: ;延时函数 用于按键消抖@11.0592MHz
PUSH 30H
PUSH 31H
MOV 30H,#18
MOV 31H,#230
NEXT6:
DJNZ 31H,NEXT6
DJNZ 30H,NEXT6
POP 31H
POP 30H
RET
DELAY: ;将上面的延时函数进行改造
MOV R7,#50 ;修改立即数,就可以调节流水灯的快慢,当前为50,延时时间为500ms
D1:
PUSH 30H
PUSH 31H
MOV 30H,#18
MOV 31H,#230
NEXT:
DJNZ 31H,NEXT
DJNZ 30H,NEXT
POP 31H
POP 30H
DJNZ R7,D1
RET
END