C51独立按键

独立按键

1.按键

按键没有按下默认高电平1,按键按下低电平0。
按键抖动的时间:5-10MS
若IO=0
软件消除抖动:delay_10us(2000)
硬件消除抖动:加电阻加电容
在这里插入图片描述
2.原理图
在这里插入图片描述3.软件设计
通过开发板实现一个按键控制一个led点亮

#include “reg52.h”

typedef unsigned int u16; //对系统默认数据类型进行重定义
typedef unsigned char u8;

//定义独立按键控制脚
sbit KEY1=P3^1;
sbit KEY2=P3^0;
sbit KEY3=P3^2;
sbit KEY4=P3^3;

//定义LED1控制脚
sbit LED1=P2^0;

//使用宏定义独立按键按下的键值
#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0

/*******************************************************************************

  • 函 数 名 : delay_10us
  • 函数功能 : 延时函数,ten_us=1时,大约延时10us
  • 输 入 : ten_us
  • 输 出 : 无
    *******************************************************************************/
    void delay_10us(u16 ten_us)
    {
    while(ten_us–);
    }

/*******************************************************************************

  • 函 数 名 : key_scan

  • 函数功能 : 检测独立按键是否按下,按下则返回对应键值

  • 输 入 : mode=0:单次扫描按键
    mode=1:连续扫描按键

  • 输 出 : KEY1_PRESS:K1按下
    KEY2_PRESS:K2按下
    KEY3_PRESS:K3按下
    KEY4_PRESS:K4按下
    KEY_UNPRESS:未有按键按下
    *******************************************************************************/
    u8 key_scan(u8 mode)//mode:扫描的模式,
    {
    static u8 key=1;//static :静态变量

    if(mode)key=1;//连续扫描按键
    if(key1&&(KEY10||KEY20||KEY30||KEY40))//任意按键按下
    {
    delay_10us(1000);//消抖
    key=0;//key清零 ,static会保存上一次的值
    if(KEY1
    0)
    return KEY1_PRESS;
    else if(KEY20)
    return KEY2_PRESS;
    else if(KEY3
    0)
    return KEY3_PRESS;
    else if(KEY40)
    return KEY4_PRESS;
    }
    else if(KEY1
    1&&KEY21&&KEY31&&KEY4==1) //无按键按下
    {
    key=1;
    }
    return KEY_UNPRESS;
    }
    /*******************************************************************************

  • 函 数 名 : main

  • 函数功能 : 主函数

  • 输 入 : 无

  • 输 出 : 无
    *******************************************************************************/
    void main()
    {
    u8 key=0;// key=key_scan(1)按键具有返回值,定义变量,来保存键值

    while(1)
    {
    key=key_scan(1);//连续扫描
    if(key==KEY1_PRESS)//检测按键K1是否按下
    LED1=!LED1;//LED1状态翻转
    }
    }

4.改编代码
实现一个按键控制一个流水灯
#include “reg52.h”
#include “intrins.h”

typedef unsigned char u8;
typedef unsigned int u16;

sbit KEY1=P3^0;
sbit KEY2=P3^1;
sbit KEY3=P3^2;
sbit KEY4=P3^3;

sbit LED1=P2^0;
sbit LED2=P2^1;
sbit LED3=P2^2;
sbit LED4=P2^3;
sbit LED5=P2^4;
sbit LED6=P2^5;
sbit LED7=P2^6;
sbit LED8=P2^7;

#define KEY1_PRESS 1
#define KEY2_PRESS 2
#define KEY3_PRESS 3
#define KEY4_PRESS 4
#define KEY_UNPRESS 0

#define LED_PORT P2

void delay_10us(u16 ten_us)
{
while(ten_us–);

}
u8 key_scan(u8 mode)
{
static u8 key=1;

if(mode)key=1;//key=1,连续扫描  key=0,单次扫描
if(key==1&&(KEY1==0||KEY2==0||KEY3==0||KEY4==0))
{
	delay_10us(1000);// xiao dou 
	key=0;
	
	if(KEY1==0)
		return KEY1_PRESS;
	else if(KEY2==0)
		return KEY2_PRESS;
	else if(KEY3==0)
		return KEY3_PRESS;
	else if(KEY4==0)
		return KEY4_PRESS;
}
else if(KEY1==1&&KEY2==1&&KEY3==1&&KEY4==1)
{
	key=1;
}
return KEY_UNPRESS;

}
int main()
{
u8 key=0;

while(1)
{
	
	key=key_scan(1);
	
	if(key==KEY1_PRESS)
	{
		u8 i=0;
		LED_PORT=~0x03;//取反 0000 0011
		delay_10us(50000);
	
		for(i=0;i<3;i++)
			{
			LED_PORT= _crol_(LED_PORT,2);//_crol_:LED向左移位2位
			delay_10us(50000);
			}	
		for(i=1;i<4;i++)
			{
			LED_PORT= _cror_(LED_PORT,2);//_cror_:LED向右移位2位
			delay_10us(50000);
			}
		}//第一个流水灯
	else if(key==KEY2_PRESS)
		{
			u8 i=0;
			LED_PORT=~0x01;//qu fan 0000 0001
			delay_10us(50000);
			
		for(i=0;i<7;i++)
			{
			LED_PORT= _crol_(LED_PORT,1);
			delay_10us(50000);
			}	
		for(i=1;i<8;i++)
			{
			LED_PORT= _cror_(LED_PORT,1);
			delay_10us(50000);
			}
		}//第二个流水灯
	else if(key==KEY3_PRESS)
		{
			u8 i=0;
			LED_PORT=0x01;// 0000 0001
			delay_10us(50000);
			
		for(i=0;i<7;i++)
			{
			LED_PORT= _crol_(LED_PORT,1);
			delay_10us(50000);
			}	
		for(i=1;i<8;i++)
			{
			LED_PORT= _cror_(LED_PORT,1);
			delay_10us(50000);
			}
	}//第三个流水灯
	else if(key==KEY4_PRESS)
		{
			/*u8 i=0;
			LED_PORT=0x03;// 0000 0011
			delay_10us(50000);
			
		for(i=0;i<3;i++)
			{
			LED_PORT= _crol_(LED_PORT,2);
			delay_10us(50000);
			}	
		for(i=1;i<4;i++)
			{
			LED_PORT= _cror_(LED_PORT,2);
			delay_10us(50000);
			}*/
			
			
			LED3=1;
			LED4=0;
			delay_10us(50000);
			LED5=0;
			LED6=1;
			delay_10us(50000);
			LED7=0;
			LED8=1
			delay_10us(50000);
			LED1=0;
			LED8=0;
			delay_10us(50000);
			LED3=0;
			LED6=0;
			delay_10us(50000);
			LED1=1;
			LED2=0;
			delay_10us(50000);
			//第四个流水灯
	}
}

}

  • 5
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值