c语言按键怎么用中断防抖,按键外部中断的时候如何防抖?
本帖最后由 275891381 于 2018-3-1 21:36 编辑
volatile u64 xitong_haomiao; //2^64/1000/3600/24/365=584942417年会复位
static u8 fac_us=0; //us延时倍乘数
//SYSTICK的时钟固定为HCLK时钟的1/8
//中断时间time = ( SysTick->LOAD + 1 ) / f f = AHB或AHB/8 (9000-1+1)/9M=1ms
void delay_init(void)
{
SysTick_CLKSourceConfig(SysTick_CLKSource_HCLK_Div8); //选择外部时钟 HCLK/8 9M 计数器减1为1/9000000秒
fac_us=SystemCoreClock/8000000; //9
SysTick->CTRL|=SysTick_CTRL_TICKINT_Msk; //开启SYSTICK中断
SysTick->LOAD=fac_us*1000-1; //每1/1000s中断一次
SysTick->CTRL|=SysTick_CTRL_ENABLE_Msk; //开启SYSTICK
while(xitong_haomiao==0);
}
//nus:0~2^32=4294967296(最大值即2^32/fac_us@fac_us=1)
void delay_us(u32 nus)
{
u32 ticks;
u32 told,tnow,tcnt=0;
u32 reload=SysTick->LOAD; //LOAD的值
ticks=nus*fac_us; //需要的节拍数
tcnt=0;
told=SysTick->VAL; //刚进入时的计数器值
while(1)
{
tnow=SysTick->VAL;
if(tnow!=told)
{
if(tnow
else tcnt+=reload-tnow+told;
told=tnow;
if(tcnt>=ticks)break; //时间超过/等于要延迟的时间,则退出.
}
}
}
//nms:0---2^32/1000=4294967.296
void delay_ms(u32 nms)
{
delay_us((u32)(nms*1000)); //普通方式延时
}
void SysTick_Handler(void)
{
xitong_haomiao++;
if(xitong_haomiao%20==0)//20ms扫描一下按键
Key=KEY_Scan(0);
}
//注意此函数有响应优先级,WK_UP>KEY1>KEY2>KEY3
//按键处理函数
//返回按键值
//mode:0,不支持连续按;1,支持连续按;
//-1,没有任何按键按下
//0,WK_UP按下 WK_UP
//1,KEY1按下
//2,KEY2按下
//3,KEY3按下
u8 KEY_Scan(u8 mode)
{
static u8 flag=0;
static s8 key_up=1;//按键按松开标志
if(Key==KEY_NO_PRES)
{
if(mode)key_up=1; //支持连按
if(flag==0)
{
if(key_up&&(KEY_UP==0||KEY_DOWN==0))
flag=1;
else if(KEY_UP==1&&KEY_DOWN==1)
key_up=1;
}
else if(flag==1)
{
key_up=0;
flag=0;
if (KEY_UP==0) return KEY_UP_PRES;
else if(KEY_DOWN==0) return KEY_DOWN_PRES;
}
return KEY_NO_PRES;// 无按键按下
}
return Key;
}
这样用滴答定时器的好处是main里面可以实现简单调度,也减少delay的使用
if(xitong_haomiao-haomiao_old>=500)//delay_ms(500);
{
haomiao_old=xitong_haomiao;
LED13=~LED13;
}
c语言按键怎么用中断防抖,按键外部中断的时候如何防抖?相关推荐
- 51单片机——中断系统、外部中断、定时器中断、串口通信C语言入门编程
目录 中断系统: 外部中断: 1.外部中断0.1:当触发时,LED状态取反 定时器中断: 1.定时器0.1:LED以1S为周期闪烁 串口通信: 1.串口中断:通过串口发送什么数据给单片机,单片机再通过 ...
- DSP28335笔记 ———— 中断系统 之 外部中断
DSP28335笔记 ---- 中断系统 之 外部中断 我用的开发板是"硬汉DSP28335开发板",文中对于硬件的描述可以说是没有,而且我还没有附上电路图希望在看的朋友不要喷我. ...
- 蓝桥杯单片机比赛学习:5、中断系统之外部中断的基本原理
中断的基本概念 百度百科上是这样说的,当中央处理机CPU正在处理某件事的时候外界发生了紧急事件请求,要求CPU暂停当前的工作,转而去处理这个紧急事件,处理完以后,再回到原来被中断的地方,继续原来的工作 ...
- STM32 中断原理及外部中断的实现
STM32 中断原理及外部中断的实现 NVIC 中断优先级管理 中断寄存器 库函数配置 小结 STM32 外部中断 基础知识 库函数配置 外部中断配置示例 小结 内容较充实,作为个人的学习记录 NVI ...
- 51单片机学习笔记(郭天祥版)(3)——引脚讲解、数码管静态显示、中断系统(外部中断,定时器中断)...
学习引脚的功能 9引脚 复位管脚,当给2个机器周期(24个时钟振荡周期)的高电平时会复位,单片机正常工作时会给0.5v的低电平 VPD备用电源的输入端,当主电源VCC发生故障降低到某一规定的低电平时, ...
- 51单片机外部中断实验 设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管
设置中断优先级寄存器,当有外部中断0请求中断时,中断程序执行发光二极管程序,在此过程中,外部中断1也有中断请求,外部中断0的中断程序将被中断去执行外部中断1的中断程序(数码管加1显示程序). #inc ...
- c语言51单片机外部中断,51单片机外部中断0实例详解
今天就以51单片机的外部中断0为例,来简单讲解一下单片机中断的用法. 1 51单片机的中断源 51单片机共有5个中断源,分别为:外部中断0 定时器0中断 外部中断1 定时器1中断 串口中断 每一个中断 ...
- GD32F303课程【3】中断控制器和外部中断
目录如下,持续更新~~ [1]星空派GD32F303开发板介绍 与 文章目录 1. 中断源 GD32F303有16个内核中断和68个可屏蔽中断中断源,具体见文件"gd32f30x.h&quo ...
- 51单片机:中断系统(外部中断,定时器中断,串口通信)
目录 中断系统简介: 中断的优先级和嵌套: 8个中断请求源及其优先级: 中断的分别介绍: 1.外部中断0:INT0 2.外部中断1 3.T0和 T1:定时计数器的功能 4.串口中断(串口为什么使用定时 ...
- nmi中断配置_外部中断NMI中断.ppt
外部中断NMI中断.ppt * 1.先看其引脚结构再看功能1. 可编程的含义:通过对芯片编程,使芯片实现不同的功能. 中断比较多的情况下,使用中断控制器来管理中断. 用来管理系统的硬件中断. * 1. ...
最新文章
- 自己动手用gensim 生成句子的word2vec 向量
- ExtJs自学教程(1):一切从API開始
- day07 数据类型间的相互转化及字符编码
- join 高性能_内置的数据无法实现高性能
- 杭十四计算机教室,杭十四中学生做了个图书馆智能机器人
- 自学转行学AI人工智能怎么样?
- 微软Azure的access control - IAM
- 算法题目——Problem A 二进制(北邮机试)
- Android连接相机WiFi,安卓手机使用佳能相机机身wifi传输拍摄的操作
- php oci8 11,linux下为php开启oci8扩展(ubuntu14亲测可用)
- tomcat 之 tomcat实例配置
- SI9000阻抗计算安装教程
- 高并发高可用高性能的解决方案
- 重学React基础知识整理——组件间的另类通信“插槽”(五)
- 亚马逊Alexa即将推出基于AI的耳语模式
- 零代码组态搭建的水泥生产工艺流程
- 申报须知,2022年滁州市各区县高新技术企业奖励政策变化,明光市
- 清华山维EPS三维测图无法进行OSGB格式转换问题(实测)
- 多边形对角线交点个数
- Linux下修改EXT2/EXT3/EXT4文件系统的磁盘卷标的方法