该代码是基于mini板的key0、key1的一端分别接PC5和PC15另一端接地,key2(WK_UP)一端接PA0另一端接V3.3
矩阵原理相同,流程图可见附件
#include "sys.h"
/////////////////////////////////
u8 lastkey,key;
#define ekey0 lastkey&0x01 //电平有效标志位即一直按下就一直有效
#define ekey1 lastkey&0x02
#define ekey2 lastkey&0x04
#define key0 key&0x01 //沿有效标志位即只有效一次
#define key1 key&0x02
#define key2 key&0x04
void KEY_Scan()
{u8 kbuf0,kbuf1,keycnt;
kbuf0=PCin(5)+2*PAin(15)+4*PAin(0);
kbuf0=(kbuf0&0x07)^0x03;
if(kbuf0!=0)
{if(keycnt--!=0) key=kbuf0;
else key=lastkey;}
else {keycnt=4;key=0;} //我是用计数器5ms循环一次主函数体,所以消抖用计数4次来做
kbuf1=key;
key=key&(lastkey^key);
lastkey=kbuf1;
}
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOA, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;
GPIO_Init(GPIOC, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;
GPIO_Init(GPIOA, &GPIO_InitStructure);
}
另,请问有谁知道原子现在的qq群号吗,要能加进去的,万谢!
|