【单片机】实验2:按键实验

#include <REGX51.H>
#include <intrins.h>

//实验目标@萌狼蓝天

/**
1、SW1开关控制LED发光二极管左移流水
2、SW2开关控制发光二极管右移流水
3、由按键开关k1控制LED发光二极管奇偶交替闪烁
4、由按键开关k2控制LED发光二极管亮灭闪烁

备注:k1、k2接法——低电平有效
*/

// 接口与设备对应关系

/*
	P1	:	LED
	P2.0:	SW1
	P2.1:	SW2
	P2.2:	K1
	P2.3:	K2
*/
// LED灯的状态
unsigned char LED;

//延时函数
void delay(int ms){
	int i,j;
	ms = ms * 5;
	for(i=0;i<ms;i++) for(j=0;j<1000;j++);
}

//左移函数
char move_left(char val,int mov){
	return  _crol_(val,mov);
}

//右移函数
char move_right(char val,int mov){
	return  _cror_(val,mov);
}
//控制小灯闪烁
void light(char val1,char val2){
		P1 = val1;
		delay(1000);
		P1 = val2;
	  delay(1000);
		P1 = val1;
		delay(1000);
		P1 = val2;
	  delay(1000);
		P1 = val1;
		delay(1000);
		P1 = val2;
	  delay(1000);
}
void main(){
		//初始化
		LED = 0x01;
		while(1){
			//k1 和 k2 是按下式开关,先判断k1 k2的状态
			if(P2_2==0 || P2_3==0){//按下开关 状态为0
				
				delay(300); // 消除按下时的抖动
				//再次判断按下状态
				if(P2_2==0){
					light(0x55,0xaa);//奇偶交替闪烁	
					P2_2=1;//恢复状态 调试的时候不像按键一样会自动弹起 所以手动设置假装弹起,但是由于手动设置的没有抖动的,实际操作或者仿真的时候将此代码注释掉
					while(!P2_2);//消除回弹抖动
				}
				if(P2_3==0){
					light(0xff,0x00);//全亮或者全灭
					P2_3=1;//恢复状态,调试专用。实际实验或者仿真时请将这一行注释掉
					while(!P2_3);//消除回弹抖动
				}
			}else{
				P1=LED;// 避免按下K键后对左移或者右移造成影响
			//不存在K1或者K2按下的情况时,判断SW1和SW2的情况	
				if(P2_0==1 & P2_1==0){
				  //SW1打开  SW2关闭,左移
					LED = move_left(LED,1);
				}else if(P2_1==1 & P2_0==0){
					//SW2打开  SW1关闭,右移
					LED = move_right(LED,1);
				}else{
					//SW1和SW2 同时打开或者关闭
					LED = LED;//LED灯状态不变  此部分代码可省略
				}
				P1=LED;//将值交给P1实现对灯的控制
				delay(1000);//延时		
			}

		}
}

posted @ 2023-11-09 18:45  萌狼蓝天  阅读(35)  评论(0编辑  收藏  举报