独立按键
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(KEY10)
return KEY1_PRESS;
else if(KEY20)
return KEY2_PRESS;
else if(KEY30)
return KEY3_PRESS;
else if(KEY40)
return KEY4_PRESS;
}
else if(KEY11&&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);
//第四个流水灯
}
}
}