KST51单片机:通过中断实现矩阵按键的次数检测与消抖

2023-05-16

以Key4为例,使用定时中断2ms进行消抖,对连续8次(16ms)的按键状态进行判断.

如果全部为1则弹起,将按键当前状态(Keysta)为1;

全部为0则按下,将按键当前状态(Keysta)置0;

其余状态都为抖动,按键当前状态不变

在主程序里对按键状态进行判断,如果按键当前状态(Keysta)与按键历史状态(backup)不同,则说明按键状态发生变化。程序中是弹起时,按键次数改变,将最新的按键次数送给数码管显示,将按键历史状态更新为当前状态并进行下一次判断。源代码如下:

#include<reg52.h>

sbit ADDR0 = P1^0;
sbit ADDR1 = P1^1;
sbit ADDR2 = P1^2;
sbit ADDR3 = P1^3;
sbit ENLED = P1^4;
sbit KEY1 = P2^4;
sbit KEY2 = P2^5;
sbit KEY3 = P2^6;
sbit KEY4 = P2^7;

unsigned char code LedChar[] ={
0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,
0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e
};

bit KeySta = 1;           //位定义

void main()
{
	bit backup = 1;       //定义一个位变量,保存前一次扫描的按键值。
	unsigned char cnt = 0;

	EA = 1;
	ENLED = 0;            //使能U3 选中数码管DS1
	ADDR3 = 1;			
	ADDR2 = 0;
	ADDR1 = 0;
	ADDR0 = 0;
	TMOD = 0x01;          //T0为模式1
	TH0 = 0xf8;           //定时2ms
	TL0 = 0xcd;
	ET0 = 1;
	TR0 = 1;              //启动T0
	P2 = 0xf7;            //P2.3置0,即输出低电平
	P0 = LedChar[cnt];    //显示按键次数
	
	while(1)
	{
		if(KeySta != backup)         //当前值与前次值不相等说明此时有动作
		{
			if(backup == 0)          //如果前次值为0,则说明是弹起动作
			{
				cnt++;               //按键次数加1
				if(cnt >= 10)
				{
					cnt = 0;         //10次清0
				}
 				P0 = LedChar[cnt];
			}
			backup = KeySta;         //更新备份为当前值
		}

	}
}
/*T0中断服务函数,用于按键状态的扫描并消抖*/
void InterruptTimer0() interrupt 1
{
	static unsigned char keybuf =0xff;  //扫描缓冲区,保存一段时间内的扫描值
	TH0 = 0xf8;                         //重新加载初值
	TL0 = 0xcd;
	keybuf= (keybuf<<1) |KEY4;          //缓冲区左移一位,并将当前扫描值移入最低位
	if(keybuf == 0x00)                  //连续8次扫描值都为0,16ms内状态不变,即按键已按下
	{
		KeySta = 0;
	}
	else if(keybuf == 0xff)             //连续8次扫描值都为1,16ms内状态不变,即按键已弹起
	{
		KeySta = 1;
	}
	else                                //其他情况则按键状态还未稳定
	{}	
}

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

KST51单片机:通过中断实现矩阵按键的次数检测与消抖 的相关文章

  • 【python学习】——字符串

    字符串 一 字符串的驻留机制 xff08 1 xff09 在python中它是基本数据类型 xff0c 是一个不可变的字符序列 xff08 2 xff09 字符串的驻留机制 xff1a 仅保存一份相同且不可变字符串的方法 xff0c 不用的
  • Linux安装部署SonarQube9.9 代码审查工具

    Linux安装部署SonarQube9 9 代码审查工具 1 SonarQube 简介 2 SonarQube安装与配置 2 1 官方软件包版本要求 2 2 基础环境配置 2 3 安装SonarQube 2 4 安装并配置PostgreSQ
  • 【数据库】Postgresql 与 MySQL 比较

    目录 Postgresql 与 MySQL 比较历史支持平台二者底层特性库存储引擎对数据的管理表连接算法 应用场景面向开发使用 Postgresql 与 MySQL 比较 二者都是比较强大的数据库 xff0c 选择使用哪一个数据库需要结合实
  • H5的离线缓存技术

    离线存储可以将站点的一些文件存储在本地 xff0c 它是浏览器自己的一种机制 xff0c 将需要的文件缓存下来 在没有网络的时候可以访问到缓存的对应的站点页面 xff0c 包括html xff0c js xff0c css xff0c im
  • QEMU虚拟机怎么配置网络才能主机和虚拟机都通

    当打开QEMU虚拟机配置界面的时候 xff0c 可以看到多种网络模型 而其中默认使用的是NAT xff0c 你会发现 xff0c 当你创建完虚拟机直接去配置网络之后 xff0c 网络是不通的 然后切换为其他模式之后 xff0c 你会发现 x
  • 虚拟机设置开机启动自动运行脚本

    首先设置虚拟机开机免密码自动启动 2 设置好开机免密码之后 xff0c 在配置开机自动启动脚本 编写一个bat文件作为脚本 xff0c 并将它放入到如下目录中 C ProgramData Microsoft Windows Start Me
  • QEMU虚拟机怎么配置网络

    当打开QEMU虚拟机配置界面的时候 xff0c 可以看到多种网络模型 而其中默认使用的是NAT xff0c 你会发现 xff0c 当你创建完虚拟机直接去配置网络之后 xff0c 网络是不通的 然后切换为其他模式之后 xff0c 你会发现 x
  • 关于VMware上的VAAI特性详解

    一般来说我们的存储在适配VMware的时候 xff0c 会牵涉搭配VAAI特性 xff0c 经常听到VAAI这到底是什么呢 xff1f VAAI的全称是VMware s Storage APIs for Array Integration
  • Python2.7版本安装报错

    python E S m sysconfig generate posix vars Could not find platform dependent libraries lt exec prefix gt Consider settin
  • oracle的安装(Oracle11G release2)

    一 xff1a 准备工作 1 关闭selinux 永久关闭 设置SELINUX 61 disabled xff1a vim etc selinux config 2 关闭firewalld 安装iptables systemctl stop
  • openstack kilo单击版本安装-最简单的安装方式

    由于K版本已经比较老了 xff0c 甚至连源都已经不怎么找得到了 xff0c 但是有时候为了一些特定的需求 xff0c 需要安装K版本 xff0c 这就比较麻烦 xff0c 本文找了一个较为简单的方法来安装 xff0c 并且是单机安装 准备
  • 本地显示远程服务器图形界面

    解决方案 序号方案简单区别方案一Xmanager1 VNC连接时及时突然中断 xff08 比如断网 xff09 xff0c 不影响操作进行 xff1b 2 不需要在服务器上装软件 xff0c 需要在你的电脑上装相应软件 xff0c 使用SS
  • SQL解析json(包含单层解析、多层解析)解析的数据可直接存到表中

    单层json解析 声明变量 declare 64 JsonData nvarchar max 61 39 34 BillName 34 34 12345765 34 34 SendDate 34 34 2022 11 10T00 00 00
  • MySQL查看当前使用的配置文件my.cnf的方法

    MySQL查看当前使用的配置文件my cnf的方法 MySQL实例在启动时 xff0c 会先读取配置参数文件my cnf my cnf一般会放在MySQL的安装目录中 xff0c 用户也可以放在其他目录加载 安装MySQL后 xff0c 系
  • Latex 之 微分符号d的竖立表达 {\rm d}

    微分符号d竖立表达 rm d
  • Abaqus 导出XYdata的几种方式

    目录 方法一 xff1a 通过Plu ins gt Tools gt Excel Utilities xff0c 将XY Data直接到Excel文件里 xff01 方式二 xff1a Report gt XY xff0c 导出默认 rpt
  • ABAQUS 显示应力/应变场的最大/最小值

    如下图所示 xff0c 可以显示最大最小值 具体数据导出 xff1a Report gt Field Output 导出结果 场输出 xff08 Field output xff09 同一时刻 xff0c 不同位置 xff1b 历史输出 H
  • mac下重装系统,应用程序副本已损坏 的解决办法

    首先需要确定电脑的年份和对应的系统 xff0c 简单的道理是老的电脑硬件是不适配最新系统的 xff0c 我需要安装的是10 12的系统 系统来源 xff1a 黑苹果 年份确定 xff1a 2017年9月之前生产的电脑 我用的是U盘安装的方法
  • mysql查看数据库的容量及表容量

    select table schema sum DATA LENGTH 43 sum INDEX LENGTH from information schema tables group by table schema 在需要备份数据库里面的
  • 【数据结构-栈】借助栈实现回文的判断

    数据结构 栈 借助栈实现回文的判断 最近在学习栈 xff0c 尝试用C实现了一些功能 include lt stdio h gt include lt stdlib h gt typedef struct app char date str

随机推荐

  • C语言实现冒泡排序

    冒泡排序作为学习排序最基本的算法 xff0c 具有稳定性与实用性 下面是C语言冒泡排序的源代码 include lt stdio h gt int main void int a 10 61 6 4 3 2 7 8 9 10 1 5 int
  • C语言实现快速排序算法

    快排作为公认最优秀的排序方法 xff0c 是每一个程序员都应该掌握的 xff0c 那么 xff0c 今天就由我来为大家简单讲解一下快速排序算法的代码 源代码如下 xff1a include lt stdio h gt void quicks
  • C语言实现二分查找

    相较于线性查找 xff0c 二分查找在面对大量数据时的效率更高 xff0c 但它的缺点是只能对有序数组进行查找 源代码如下 xff1a include lt stdio h gt void binarysearch int a int su
  • 约瑟夫环详解

    package newjosephu public class myfinaljosephu 你可能会说crazy 我只想说ez xff01 public static void main String args circlelinkedl
  • ECS弹性云服务器常用端口、安全组

    弹性云服务器常用端口 弹性云服务器常用端口如 表1 所示 您可以通过配置安全组规则放通弹性云服务器对应的端口 xff0c 详情请参见 添加安全组规则 表1 弹性云服务器常用端口 协议 端口 说明 FTP 21 FTP服务上传和下载文件 SS
  • 01背包问题(滚动数组实现的逻辑)

    package tttest public class mybetterbag public static void main String args int weight 61 1 3 4 int bagsize 61 4 int val
  • java递归实现辗转相除法

    public static int getres int a int b if b 61 0 return getres b a b return a
  • java 线索二叉树的构建

    public class test public static void main String args Node root 61 new Node 1 Node node2 61 new Node 2 Node node3 61 new
  • ubuntu下查看文件(夹)大小的命令

    记录下自己常用的查看文件夹和文件大小的命令 查看当前所处的文件夹的整个大小 xff08 不包括具体内容 xff0c 只看当前文件夹大小 xff09 span class token function du span sh 查看当前文件夹中各
  • git stash时出现xxx:needs merge问题

    项目需要git merge其他分支 xff0c 但由于本地也修改过 xff0c 所以希望先git stash后再merge xff0c 这时出现以下问题 xff1a xxx xxx xxx cpp xff1a needs merge 通过g
  • FFMPEG 之视频播放

    先看界面效果 xff0c 虽然有点low xff0c 但是效果实现了 一 实现原理 1 使用ffmpeg解码视频 2 然后使用libyuv播放解码的视频 二 实现 1 先看目录结构 2 ffmpeg编译以及引用 xff0c 在之前的篇章已经
  • 一步一步学CMake 之 VSCode+CMakeLists 调试 C++ 工程

    目录 1 插件推荐 2 文件准备 3 开始调试 一步一步学 CMake 系列文章 1 插件推荐 CMake CMake tools 2 文件准备 新建文件夹 xff1a TEST 新建文件 xff1a CMakeLists txt 内容如下
  • 51单片机使用8位重装定时器实现PWM输出同时实现DAC转换

    51单片机使用八位重装定时器实现PWM输出同时实现DAC转换 最近想要做一个数控电源 xff0c 打算使用51单片机实现电压和电流的闭环 xff0c 但是手头上的51单片机为STC89C51系列的单片机 xff0c 没有ADC采样功能 xf
  • 【MYSQL】分组之后获取每组最新的数据

    记录一次有点麻烦的sql 可以直接复制拿去测试 xff0c 一开始我也百度来着 xff0c 发现要么没法满足我的需求 xff0c 要么就连看下去的欲望都没有 建表测试demo xff1a span class token keyword C
  • C++ 指针中:指针数组 指向指针数组的指针 指向指针的指针

    指针数组 xff1a 存储指针的数组 pa n an array of pointers 注意这里 优先级高于 xff0c 因此pa是一个包含三个指针的数组 指向指针数组的指针 pd n pointers to an array of po
  • Flutter要被放弃了?别瞎传了!

    前言 Flutter 作为Google出品的一个新兴的跨平台移动客户端UI开发框架 xff0c 正在被越来越多的开发者和组织使用 xff0c 包括阿里的咸鱼 腾讯的微信等 今天 xff0c 我主要讲解Flutter中文本组件方面的Widge
  • (学习笔记)手把手教你学51单片机:定时器与数码管

    一 逻辑电路与逻辑运算 逻辑运算符 xff1a xff08 1 xff09 按变量整体值进行运算 xff1a 逻辑与 amp amp 逻辑或 xff08 xff09 逻辑非 xff08 xff01 xff09 xff08 2 xff09 按
  • (学习笔记)手把手教你学51单片机:中断与数码管动态显示

    一 c语言的数组 1 1数组的基本概念 数组是具有相同数据类型的有序数据的组合 xff0c 一般来讲数组定义后满足以下三个条件 xff1a xff08 1 xff09 具有相同的数据类型 xff08 2 xff09 具有相同的名字 xff0
  • KST-51:从999999开始的倒计时程序,只显示有效位

    此程序为手把手教你学51单片机的例程 例程中实现只显示有效位 xff08 高位0不显示 xff09 xff0c 实现了数码管稳定显示不抖动 for结合break 实现只显示有效位 switch结合i 实现数码管动态刷新 include lt
  • KST51单片机:通过中断实现矩阵按键的次数检测与消抖

    以Key4为例 xff0c 使用定时中断2ms进行消抖 xff0c 对连续8次 xff08 16ms xff09 的按键状态进行判断 如果全部为1则弹起 xff0c 将按键当前状态 xff08 Keysta xff09 为1 xff1b 全