【单片机】实验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);//延时		
			}

		}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

萌狼蓝天

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值