实验内容:
某单片机控制系统,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