【单片机】实验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);//延时
}
}
}
版 权 声 明
作者:萌狼蓝天
QQ:3447902411(仅限技术交流,添加请说明方向)
转载请注明原文链接:https://www.cnblogs.com/mllt/p/0xWSE5G8BVLGG58OP.html