首页 > 其他分享 >独立按键检测

独立按键检测

时间:2024-04-18 22:35:40浏览次数:14  
标签:delayms 检测 void 独立 按下 num 延时 按键

按键检测

1 独立按键检测

按键检测的核心是消抖,这里用一个10ms的延时来处理按键抖动,按键按下为0,先判断一次按键值是否为0,若是,延时10ms,再判断一次,如果两次检测的键值都是0,按键就是按下的状态。

普中51开发板上,独立按键的电路图如下:

 

 

 

下面给出一个案例,结合之前的定时器应用,四个按键,实现60进制计数器的计数结果的显示,K1做加计数的输入时钟,K2做减计数的时钟,K3复位,K4按一次是自动隔1秒加计数,再按一次,暂停计数。代码如下

//用数码管的前两位显示一个十进制数,变化

//范围是00~59,开始时显示00,每按一次K1键

//数值加1;每按一次K2键,数值减1;每按一次K3

//键,数值归零;按一次K4键,利用定时器,使

//数值每秒加1,再按一次K4键,数值停止加1,保

//持不变。

#include<reg52.h>

#define uchar unsigned char

#define uint unsigned int

sbit k1=P3^1;     //按键端口

sbit k2=P3^0;

sbit k3=P3^2;

sbit k4=P3^3;

 

sbit A2=P2^4; //位选控制,74138的输入信号

sbit A1=P2^3;

sbit A0=P2^2;

 

uchar code table[]={0x3f,0x06,0x5b,0x4f,

                    0x66,0x6d,0x7d,0x07,

0x7f,0x6f,0x77,0x7c,

0x39,0x5e,0x79,0x71

};

 

void delayms(uint);

uchar numt0,num; //定时器的计数值和60的计数值

 

void display(uchar numdis) //显示子函数

{

  uchar shi,ge; //数码管要显示的数字

shi=numdis/10;

ge=numdis%10;

A2=1;  //显示十位

A1=1;

A0=1;

P0=table[shi];

delayms(5);

P0=0x00;  //消隐

A2=1;   //显示个位

A1=1;

A0=0;

P0=table[ge];

delayms(5);

P0=0x00;

}

 

void delayms(uint xms)

{

uint i,j;

for(i=xms;i>0;i--)

for(j=110;j>0;j--);

}

 

void init() //初始化函数

{

TMOD=0x01; //T0,方式1

TH0=(65536-45872)/256; //装入初值50ms一次中断

TL0=(65536-45872)%256;

EA=1;   //开总中断

ET0=1;   //开定时器0中断

}

 

void keyscan()

{

if(k1==0) //判断K1键是否按下

{

delayms(10); //延时消抖

if(k1==0)  //再确认K1按下

{

num++; //加计数

if(num==60) //计满60归0

num=0;

while(!k1); //等待按键释放

}

}

if(k2==0) //判断K2键是否按下

{

delayms(10); //延时消抖

if(k2==0)  //再确认K2按下

{

if(num==0) //计满0归60

num=60;

num--;

while(!k2); //等待按键释放

}

}

if(k3==0) //判断K3键是否按下

{

delayms(10); //延时消抖

if(k3==0)  //再确认K3按下

{

num=0;

while(!k3); //等待按键释放

}

}

if(k4==0) //判断K4键是否按下

{

delayms(10); //延时消抖

if(k4==0)  //再确认K4按下

{

while(!k4); //等待按键释放

TR0=~TR0; //启动或停止T0

}

}

}

 

void main()

{

init();   //定时器初始化

while(1)

{

keyscan();

display(num);

}

}

 

void T0_time() interrupt 1

{

TH0=(65536-45872)/256; //装入初值50ms一次中断

TL0=(65536-45872)%256;

numt0++;

if(numt0==20) //计到1秒

{

numt0=0;    //请0,重计20次

num++;

if(num==60)

num=0;

}

}

 

代码分析,用子函数实现定时器初始化,数码管动态显示,延时,按键扫描。延时函数还是用的两个for语句嵌套。初始化就是把参数列出来即可,动态扫描,就是位选和段选的控制。这里用74138位选,给段选编码,延时5ms,消隐,换下一位。难点主要是按键扫描,除了前述的先后检测两次是否键值为0,还需要处理按下后的不同操作。这里K4的处理最需要技巧,利用定时器的开或关,来实现每次按下后不同的操作。

 

标签:delayms,检测,void,独立,按下,num,延时,按键
From: https://www.cnblogs.com/halflife/p/18144667

相关文章

  • 【VMware ESXi】新版VMware Host Client独立客户端Beta版现已发布。
    VMwarebyBroadcom推出了新的VMwareHostClient独立版客户端(Beta),用于代替VMwareHostClient(Html5)来管理ESXi。同时,当前VMwareHostClient不再进行功能更新,只解决与GUI的安全性或可用性相关的关键问题。新版客户端是一个Web桌面应用程序(大概有好几百兆),可以安装在MacOS......
  • 边缘计算智能分析网关V4地面垃圾AI检测算法介绍及场景应用
    在传统的卫生监管场景中,无法及时发现地面遗留的垃圾,通过人工巡逻的方式需要大量的人力、物力和时间,而且效率不高,并存在一定的滞后性,而采用地面垃圾AI检测算法则可以大大提高监管效率。TSINGSEE青犀AI智能分析网关V4的地面垃圾AI检测算法可以自动识别划定区域内遗留的垃圾,若达到设......
  • TSINGSEE青犀算法中台消防通道堵塞/占压AI检测算法的介绍及应用
    消防通道是建筑物内用于紧急疏散的通道,其畅通无阻对于保障人员生命安全至关重要。然而,由于各种原因,消防通道经常会被杂物、车辆等堵塞,一旦发生火灾等紧急情况,后果不堪设想。为了有效解决这一问题,我们提出了一种基于人工智能技术的消防通道堵塞占用检测算法。该算法利用深度学习技......
  • VK3602K SOP8抗干扰2键/2路/2按键/2通道触摸感应芯片,应用于加湿器触摸IC等大小家电产
    产品品牌:永嘉微电/VINKA产品型号:VK3602K封装形式:SOP8概述VK3602K具有2个触摸按键,可用来检测外部触摸按键上人手的触摸动作。该芯片具有较高的集成度,仅需极少的外部组件便可实现触摸按键的检测。提供了2路直接输出功能,可通过IO脚选择输出电平。芯片内部采用特殊的集成电路,具......
  • 对大量ip:port进行批量telnet检测的python脚本
    对大量ip:port进行批量telnet检测的python脚本telnet_test.py#导入socket模块,用于网络通信importsocket#定义一个函数,用于测试Telnet连接是否成功deftest_telnet(ip,port):try:#尝试创建到指定IP和端口的连接socket.create_connection((ip,po......
  • 基于深度学习的停车场车辆检测算法matlab仿真
    1.算法运行效果图预览   上图测试结果如下图所示:   2.算法运行软件版本matlab2022a 3.算法理论概述     随着城市交通管理和智慧停车系统的快速发展,停车场车辆检测已成为实现高效车位管理、智能计费的关键技术之一。深度学习,尤其是基于卷积神经网络(CN......
  • 在Linux中,如何使用Suricata进行实时网络威胁检测?
    Suricata是一个开源的威胁检测系统,主要用于实时网络威胁检测。它结合了IDS(入侵检测系统)、IPS(入侵防护系统)和网络安全监控的功能,可以高效地检测网络流量中的恶意行为。以下是在Linux中使用Suricata进行实时网络威胁检测的详细步骤:1.安装Suricata首先,你需要从Suricata的官方网站......
  • 对大量ip进行批量ping检测的python脚本
    对大量ip进行批量ping检测的python脚本importsubprocessdefping_host(host,is_windows):"""发送一个ping请求到指定的主机,并返回ping的结果。"""#根据操作系统类型选择ping命令和参数ifis_windows:params=['ping','-n',&......
  • SpreadsheetControl组件修改,拖拽、新建、打开文件在独立浮窗打开
    一、修改文件拖拽功能,使其能够在另外一个独立窗体打开,需要配合documentManager控件实现。实现后效果:将11.xlsx文件拖拽到工作区 1.创建XExceluserControl用户窗体,代码如下:publicpartialclassXExcelUserControl:DevExpress.XtraEditors.XtraUserControl{publi......
  • 记一次 .NET某炉膛锅炉检测系统 崩溃分析
    一:背景1.讲故事上个月有个朋友在微信上找到我,说他们的软件在客户那边隔几天就要崩溃一次,一直都没有找到原因,让我帮忙看下怎么回事,确实工控类的软件环境复杂难搞,朋友手上有一个崩溃的dump,刚好丢给我来分析一下。二:WinDbg分析1.程序为什么会崩溃windbg有一个厉害之处在于双......