欢迎光临散文网 会员登陆 & 注册

单片机学习——独立按键基础(自用)

2023-03-14 18:56 作者:huabi_fxz  | 我要投稿

原理:

轻触按键,相当于一种电子开关,按下使开关接通,松开时开关断开,K1、K2、K3、K4公共端接GND,另一端分别接单片机I/O口的P3^0到P3^3,因为单片机4组I/O口P0—P3都是高电平有效,当按键按下时,将I/O口拉到低电平使按键有效。

按键抖动:

一个开关在闭合时不会马上稳定地接通,在断开时也不会一下子断开,所以在开关闭合及断开的瞬间会伴随一连串的抖动,单片机会检测出来。

按键消抖:

(1)硬件消抖: 加一个电路,将总电路经过触发器之类的操作进行电路过滤。

(2)软件消抖: 检测按键按下时,延时时间,再继续操作,松手也同样道理。

软件部分:

#include "reg52.h"

sbit S7=P3^0;

sbit S6=P3^1;

sbit S5=P3^2;

sbit S4=P3^3; //定义按键IO端口


sbit L1=P0^0;

sbit L2=P0^1;

sbit L3=P0^2;

sbit L4=P0^3;

sbit L5=P0^4;

sbit L6=P0^5; //定义LED灯IO端口

void selectHC573(unsigned char n)

{

switch(n)

 {

 case 4:

 P2=(P2 & 0x1f) | 0x80;  

 break;       

 case 5:      

 P2=(P2 & 0x1f) | 0xa0;

 break;

 case 6:

 P2=(P2 & 0x1f) | 0xc0;

 break;

 case 7:

 P2=(P2 & 0x1f) | 0xe0;

 break;

}

}


void delayk(unsigned char t)

{

while(t--);

}



void Scankeys_alone() //扫描独立按键

{

if(S7==0)  //判断是否按下S7

{

  delayk(100);

  if(S7==0)   //延时消抖后S7依然处于低电平,则确定按下

  {

  L1=0;

  while(S7==0); //判断S7是否依然工作(神来之笔!)

  L1=1; //关灯,完成检测

  }

}

if(S6==0)

{

  delayk(100);

  if(S6==0)

  {

  L2=0;

  while(S7==0);

  L2=1;

  }

}

if(S5==0)

{

  delayk(100);

  if(S5==0)

  {

  L3=0;

  while(S5==0);

  L3=1;

  }

}

if(S4==0)

{

  delayk(100);

  if(S4==0)

  {

  L4=0;

  while(S4==0);

  L4=1;

  }

}

}



void main()

{

 selectHC573(4);//选择锁存器处于打开状态

 while(1)

 {

 Scankeys_alone();//不断扫描是否有按键按下

 }

}





单片机学习——独立按键基础(自用)的评论 (共 条)

分享到微博请遵守国家法律