51单片机用汇编语言实现独立按键检测,每个按键有不同功能,包含按键消抖程序

实验内容:

        某单片机控制系统,P1口接有8发光二极管,P3.0P3.1P3.2P3.3接有4个开关K1K2K3K4,试画出接口电路,并编程使得当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

猜你喜欢

转载自blog.csdn.net/yvge669/article/details/125636225