下面为使用教程,本函数使用了一个Key_Event为全局按键事件变量,需要在其他函数中读取这个Key_Event。
你需要在定时器中断中调用采样函数,结果保存在Key_Event中。
void TIMER_ISR onTimer() {
Key_Sampling(Button);
}
如果你想通过串口测试按键结果?
void loop() {
delay(500);
Serial.print("Key Event is");
Serial.println(Key_Event);
Key_Event = NOKEY;
}
另外,这是Arduino平台的测试方法,如果你想移植,也非常简单,只需要修改下这一行。
Read_Temp = digitalRead(IO_Set);//采样一次
如果你是51单片机,那你可以写
Read_Temp = P32;//采样一次
如果你是32单片机,你可以写
Read_Temp = GPIO_ReadInputDataBit(GPIOA, GPIO_Pin_0);//采样一次
实际上这种不涉及外设的功能代码都是通用的,可以随意移植的,不同平台,也只不过是初始化的时候不同,51用寄存器初始化,32单片机用hal库或者标准库初始化,arduino同理。
另外,如果你想用在多个按键上,怎么处理?
这个比较复杂,需要用到结构体:
- typedef struct{//多个按键存储不同结构体
- unsigned char Key_IO;
- unsigned char Sampling_Counter;//采样次数计数器
- unsigned long Result_Temp;//采样结果缓存
- bool Previous_Key;//之前的按键采样记录
- bool Now_Key;//当前的按键采样记录
- bool Is_Sampling;//正在采样标志
- bool Start_Sampling;//开始采样标志,由下降沿触发
- bool Key_Temp;//按键状态缓存,每次进入函数时读取
- unsigned char Rise_Edge_Result;
- } Key_Sampling_Group;
- Key_Sampling_Group IO_15{15,0,0,0,0,0,0,0};//IO15所接按键
- Key_Sampling_Group IO_7{7,0,0,0,0,0,0,0};//IO7所接按键
复制代码 通过这个结构体,我们可以用同一个函数,实现多个IO并行检测,函数的变量分别保存,不会互相干扰,节省flash,虽然其实这么短的代码根本不会超过500字节代码吧,但是如果按键比较多,占用还是很可观的。
使用结构体,传入时需要传入指针(地址),否则会导致直接将结构体中的数值复制一份到函数中,你在定时器中断中这么写:
Key_Sampling(Key_Sampling_Group *IO_Set)
这样就可以传入结构体的地址,函数会使用结构体中的变量,也会自动保存在结构体中。
然后你需要在函数中每个用到对应变量的地方修改,比如:
原本是digitalRead(Key_IO);
现在你需要改为digitalRead(IO_Set -> Key_IO);
这样才能让函数读取到你结构体中的数据。
|