先查看原理图
发现板载4个 独立按键,分别连接P34,P35,P36,P37
众所周知 ,机械按键在按下时有抖动,需要做消抖处理,一般抖动时间为10到20ms,这里取20ms
软件延时消抖
使用delay函数进行延时消抖
#include <STC12C5A60S2.H>
#include "digital.h"
sbit S1=P3^4;
int cnt;
void main()
{
while(1)
{
if(S1==0)
{
delay(20);
if(S1==0)
cnt++;
while(!S1)
displayNum(cnt,10);
}
displayNum(cnt,10);
}
}
效果还不错
定时器消抖
考虑按键按下有以下几个状态
1、按键未按下,引脚 为高电平
2、按键按下,产生一个下降沿和一系列抖动
3、按键稳定
4、松手,发生一系列抖动,引脚又回到高电平
需要在按下那一刻开启定时器进行计时,至20ms,检测引脚电平,若为低电平,可视为按键按下,然后等待按键释放,在等待中,我们可以继续display数据。
#include <STC12C5A60S2.H>
#include "digital.h"
sbit S1=P3^4;
int count,cnt;
void Timer0_Init(void) //20微秒@11.0592MHz
{
AUXR |= 0x80; //定时器时钟1T模式
TMOD &= 0xF0; //设置定时器模式
TL0 = 0x18; //设置定时初始值
TH0 = 0xF9; //设置定时初始值
TF0 = 0; //清除TF0标志
ET0 = 1; //使能定时器0中断
}
void main()
{
Timer0_Init();
EA=1;
while(1)
{
if(S1==0)
{
TR0 = 1; //定时器0开始计时
}
displayNum(cnt,10);
}
}
void Timer0_Isr(void) interrupt 1
{
TL0 = 0x18; //设置定时初始值
TH0 = 0xF9; //设置定时初始值
TR0=0;
if(count%1000==0) //由于定时器是20us,这里将其扩大至20ms
{
if(S1==0)
{
cnt++;
count=0;
while(!S1) //松手检测
displayNum(cnt,10);
}
}
}
计数器按键检测
查看手册知P34接单片机T0脚
可配置寄存器TMOD来使T0作为计数器使用
这里需要将T0的C/~T设置为1,其余均为0,即TMOD或上0x04。
将其初值分别设置为30与255,这样只要有一次按下,就会发生计数器溢出,进入计数器中断服务函数。
#include <STC12C5A60S2.H>
#include "digital.h"
sbit S1=P3^4;
int cnt;
void main()
{
TMOD &= 0xF0;
TMOD |= 0x04;
TL0=30;
TH0=255;
TF0=0; //清除溢出标志位
TR0=1; //开启计数器
ET0=1; //开启计数器中断
EA=1; //开启总中断
while(1)
{
displayNum(cnt,10);
}
}
void Timer0_Isr(void) interrupt 1
{
TL0=30;
TH0=255;
cnt++;
}
在按动时偶尔有双击现象,是引脚不够稳定,没有消抖处理所致
配套资源
https://download.csdn.net/download/weixin_56719449/87637175?spm=1001.2014.3001.5501