1 /******************************************************************************2 * 文件 Key.c3 * 作者 Belye4 * 版本 ST V3.5.05 * 日期 04-February-20166 * 提要 基于德飞莱开发板的四个按键的底层驱动程序7 * 使用方式 函数调用示例8 * 注意 记得修改对应的按键初始化管脚9 ******************************************************************************/
10
11 /*************************************** 函数调用示例 ************************************12 KEY_Init();13 while(1)14 {15 i=KEY_Scan(0);16 switch (i)17 {18 case S4_PRES:19 break;20 case S1_PRES:21 break;22 case S2_PRES:23 break;24 case S3_PRES:25 break;26 default:27 break;28 }29 }30 **********************************************************************************************/
31 #include
32 #include
33
34 voidKEY_Init()35 {36 S4_Init();37 S1_Init();38 S2_Init();39 S3_Init();40 }41
42
43 void S4_Init(void)//PA0
44 {45
46 GPIO_InitTypeDef GPIO_InitStructure;47
48 RCC_APB2PeriphClockCmd(S4_CLK,ENABLE);//使能PORTA时钟49
50 //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
51
52 GPIO_InitStructure.GPIO_Pin = S4_PIN;//PA8
53 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置成下拉输入
54 GPIO_Init(S4_PORT, &GPIO_InitStructure);//初始化GPIOA8
55
56 }57
58 void S1_Init(void)59 {60
61 GPIO_InitTypeDef GPIO_InitStructure;62
63 RCC_APB2PeriphClockCmd(S1_CLK,ENABLE);//使能PORTA时钟64
65 //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
66
67 GPIO_InitStructure.GPIO_Pin = S1_PIN;//PA8
68 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
69 GPIO_Init(S1_PORT, &GPIO_InitStructure);//初始化GPIOA8
70
71 }72
73 void S2_Init(void)74 {75
76 GPIO_InitTypeDef GPIO_InitStructure;77
78 RCC_APB2PeriphClockCmd(S2_CLK,ENABLE);//使能PORTD时钟79
80 //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
81
82 GPIO_InitStructure.GPIO_Pin = S2_PIN;//PD3
83 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
84 GPIO_Init(S2_PORT, &GPIO_InitStructure);//初始化GPIOD3
85
86 }87
88
89
90 void S3_Init(void)91 {92
93 GPIO_InitTypeDef GPIO_InitStructure;94
95 RCC_APB2PeriphClockCmd(S3_CLK,ENABLE);//使能PORTD时钟96
97 //GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
98
99 GPIO_InitStructure.GPIO_Pin = S3_PIN;//PD3
100 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
101 GPIO_Init(S3_PORT, &GPIO_InitStructure);//初始化GPIOD3
102
103 }104
105
106
107
108 //按键处理函数109 //返回按键值110 //mode:0,不支持连续按;1,支持连续按;111 //返回值:112 //0,没有任何按键按下113 //KEY0_PRES,KEY0按下114 //KEY1_PRES,KEY1按下115 //WKUP_PRES,WK_UP按下116 //注意此函数有响应优先级,KEY0>KEY1>WK_UP!!
117 u8 KEY_Scan(u8 mode)118 {119 static u8 key_up=1;//按键按松开标志
120 if(mode)key_up=1; //支持连按
121 if(key_up&&(S4==1||S1==0||S2==0||S3==0))122 {123 delay_ms(10);//去抖动
124 key_up=0;125 if(S4==1) returnS4_PRES;126 else if(S1==0) returnS1_PRES;127 else if(S2==0) returnS2_PRES;128 else if(S3==0) returnS3_PRES;129 }else if(S4==0&&S1==1&&S2==1&&S3==1)key_up=1;130 return 0;//无按键按下
131 }