|
发表于 2019-9-17 13:53:08
|
显示全部楼层
我在楼主方法上,做的矩阵键扫描,去抖程序,请各位指教.
#include "KeyBoard.h"
#include "DataType.h"
#include "MR_macro.h"
#include "Delay.h"
#include "UART_AVR_HW.h"
uint TrgDown;//Down跳变
uint TrgUp;//Up跳变
uint Prev;//前次值(持续值)
#define TIMES 1 //采样数设定
void KeyBoard_init(void)
{
DDRC = 0xf0;//PC0-PC3输入上拉,PC4-PC7输出高电位
PORTC = 0xff;
}
uint ReadKey(void)//读矩阵键盘值(4*4键)
{
uchar i;
uint temp=0;
for (i = 0; i < 4; i++)//4行扫描
{
PORTC |= 0xf0;//所有行置高电平
PORTC &= ~(1 << (i + 4));//PC4-PC7依次输出低电平
delay_nus(10);
temp |= (((uint)(PINC & 0x0f)) << (4 * i));//依次读每行的4列,并依次打包到temp中,共16键位
}
return ~temp;//返回所有键位状态,按下为高,未按为低
}
void KeyScan(void)
{
static uchar ii;//去抖次数计数
static uint Curr = 0, Last;//当前及上次键值暂存
if (ii == 0) Last = Curr;//存上次键值
Curr = ReadKey();//取当前键值
if (Curr^Last) { ii = 0; return; }//前后两次键值不一致,返回重新去抖判断
else //前后两次键值相同
{
if ((++ii) < TIMES) return;//去抖次数累加未到设定值,返回再次去抖判断
}
ii = 0;//设定的去抖次数内,键值稳定,则累加清零,并更新状态参数
TrgDown = Curr & (Curr^Prev);
TrgUp = Prev & (Curr^Prev);
Prev = Curr;
} |
|