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

最新更新时间:2022-01-12来源: eefocus关键字:中断  矩阵按键  消抖 手机看文章 扫描二维码
随时随地手机看文章

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


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


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


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


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


#include

 

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                                //其他情况则按键状态还未稳定

{}

}

关键字:中断  矩阵按键  消抖 编辑:什么鱼 引用地址:http://news.eeworld.com.cn/mcu/ic555853.html

上一篇:手把手教你学51单片机:函数进阶与按键
下一篇:KST-51:8*8点阵横向移动显示IG!

推荐阅读

利用定时器产生方波并通过中断调节方波频率
要求:从P1^0口输出50Hz的方波,并通过S1,S2调整方波的频率。按下S1 频率以1Hz为单位增大,按下S2 频率以1Hz为单位减小。(代码仅进行过初步验证,可能存在一定的BUG,谨慎使用)#include<reg52.h>#define uchar unsigned char#define uint unsigned int sbit Iput = P1^0; //------------------------变量区------------------------float Temp = 50;//初始频率 Hzuint F ;//周期float a=0;//中间变量//---------------------
发表于 2022-08-11
利用定时器产生方波并通过<font color='red'>中断</font>调节方波频率
MSP432笔记——按键中断
GPIO按键外部中断所用板卡 MSP432P401R LaunchPad按键电路图按键连接GPIO P1.1 P1.4按键按下时,对应IO变化为低电平,按键必须使用上拉电阻程序编写使用库函数 driverLibmain中需要的步骤{设置IO输入/输出方向,带上拉电阻的输入模式清除中断标识位,在配置时就需要清除标志位设置中断触发边沿,上升沿/下降沿使能GPIO中断使能总中断(3个中断函数)}main源码int main(void){ /* Stop Watchdog */ MAP_WDT_A_holdTimer(); //GPIO Interrupt test GPIO_setAsInputPinWithPullUpResis
发表于 2022-08-10
MSP432笔记——按键<font color='red'>中断</font>
MSP432笔记——TIM定时器中断
使用driverlib库函数以TA3为例前期配置时钟源信号源电压等级flash //Flash FlashCtl_setWaitState(FLASH_BANK0,1); FlashCtl_setWaitState(FLASH_BANK1,1); //PCM state PCM_setPowerState(PCM_AM_LDO_VCORE1); //CS configure CS_setDCOCenteredFrequency(CS_DCO_FREQUENCY_48);配置定时器 Config参数配置结构体 config开始定时器 start使能定时器中断 (清空标志位、打开定时器的中断) Timer_A_UpMod
发表于 2022-08-10
基于MSP432的中断练习
/*MSP432:基于寄存器编程:利用P1.1和P1.4引脚外部中断,实现对LED灯亮灭的控制。P1.1和P1.4引脚连接S1和S2按键,该按键按下将触发引脚中断,P2.1和P2.2引脚分别连接连个LED灯,当按键P1.1被按下后,P2.1引脚LED灯的亮灭状态将会发生翻转,当按键P1.4按下后,P2.2引脚的电平将发生翻转。*///中断服务程序extern void PORT1_IRQHandler(void){ if(P1IFG & BIT1) { P2OUT ^= BIT1; P1IFG &= ~BIT1; } if(P1IFG & BIT4) { P2OUT ^= BIT2; P1IFG &
发表于 2022-08-10
基于MSP432的<font color='red'>中断</font>练习
51单片机——定时计数器中断
先写IE寄存器中断允许寄存器,再写中断处理函数就行定时模式下触发一次中断后TH和TL的值会默认复位为0,需要在中断服务函数里重新设定初值。例void timer0() interrupt 1{ TH0 = 0x4b; TL0 = 0xfd;}应用数码管动态扫描,按键按下也能继续执行扫描
发表于 2022-08-09
<font color='red'>51单片机</font>——定时计数器<font color='red'>中断</font>
STM32HAL库串口处理---中断收发
利用STM32串口中断收发和buffer机制(循环队列的原理)实现数据的准确接收和发送。为后续添加上层通信协议建立基础。为了方便使用,为函数接口统一标准Arduino串口机制的接口函数void begin(unsigned long baud);//初始化接口void end(void);//关闭串口int available(void);//获取缓存中可以读取的字节数int peek(void);//从缓存中读取字节数据,但不删除该数据int read(void);//从缓存中读取字节数据,并删除该数据int availableWrite(void);//获取发送缓存还可以写入的字节数void flush(void); //将发送
发表于 2022-08-09

推荐帖子

求个编程实例
有一按钮和+10V电源及PLC,让输出电压随着按钮的持续接通时间而递增,直到10V为止,要如何编程?望给予解答!求个编程实例
eeleader 工控电子
IO控制使能OE在制版时需要将其使能不??
如题,请教IO控制使能OE在制版时需要将其使能不??
cart FPGA/CPLD
【智能车资料共享转帖】 资料下载、交流——金属探测器
本帖最后由paulhyde于2014-9-1508:54编辑专为今年9月全国电子电路设计大赛,为大家能够更充足的备战本次大赛,也为解决有些朋友因找不到资料而痛苦的情况。 所以希望大家: 都晒晒自己的作品,分享出自己整理的资料,在分享的同时,也可以互相交流,提升自我。 同时也可将买到器件的淘宝店铺分享给大家。 下载的朋
kevinrobot 电子竞赛
一道面试题,供大家讨论
求理想运算放大电路的放大倍数。 一道面试题,供大家讨论
banana 模拟电子
外包项目:pci设备驱动开发
使用TI的DSPpci接口,需要个pci驱动 能接的哥们请回个话 留个期望价格,TEL,或者QQ 谢谢外包项目:pci设备驱动开发
jhpotter 嵌入式系统
二极管的非线性导致会产生一些新的波形,它的底层形成原理是什么,哪位能给讲解
二极管的非线性导致会产生一些新的波形,它的底层形成原理是什么,哪位能给讲解 二极管的非线性导致会产生一些新的波形,它的底层形成原理是什么,哪位能给讲解
一沙一世 stm32/stm8
小广播
实战 培训 开发板 精华推荐

何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2022 EEWORLD.com.cn, Inc. All rights reserved