📄 read_key.c
字号:
#include <iom8v.h>
#include <macros.h>
/////////////////////////////////////read_key
#define sampling_times 2 //定义取样的次数,连续次数的取样值相同,视为有效取样。
#define sampling_interval 10 //定义每次取样的时间间隔,单位 us.
#define sapleing_way 8 //定义多少路采样。最大值为8。PB为输入.
typedef struct
{ unsigned int v_last; //上一次sampling_times个取样值的结果
unsigned int v_current; //当前sampling_times个取样值的结果
unsigned int v[sampling_times]; //存放连续sampling_times次的取样值
unsigned int v_temp; //存放比较的临时值,为1时有效,0时无效
} inputStruct;
void delay_nus(unsigned int n); //延时函数,单位 us.
char READ_KEY(void) //主函数
{
unsigned int i;
unsigned int j;
inputStruct pb_input[sapleing_way];
//以下的for循环,将连续sampling_times次的取样结果存放在相应的数组里
for (i=0;i<sampling_times;i++)
{
delay_nus(sampling_interval); //每隔sampling_interval取样一次
for(j=0;j<sapleing_way;j++)
{
pb_input[j].v[i]=PINB&BIT(j);
}
}
//以下的for循环,判断连续sampling_times次的取样结果是否有效
for(j=0;j<sapleing_way;j++)
{
for (i=1;i<sampling_times;i++)
{
if (pb_input[j].v[i-1]==pb_input[j].v[i]) //如果sampling_times次取样结果均相同,视为有效
pb_input[j].v_temp=1; //sampling_times次取样有效的标志
else //否则舍弃,不作处理。
{
pb_input[j].v_temp=0; //sampling_times次取样无效,不作处理
break;
}
}
}
return(PINB);
} // end main()
void delay_nus(unsigned int n)//n微秒延时函数
{
unsigned int i;
for (i=0;i<n;i++)
{
asm("nop");
}
}
/////////////////////////////////////////////////////////////////////////////
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -