完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
GPIO引脚图及相关配置
图1 由原理图,可以看出各按键的GPIO接口如下表。 | WK_UP | KEY0 | KEY1 | |:-----------:|:-----------:|:-----------:| | PA0| PC5 | PA15 | 而GPIO电平的读取代码为;GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) 使用如下代码,将按键名与读取电平函数绑定。由于,当按键按下时,与之相连的GPIO电平会发生变化,因此,使用该函数可以检测按键是否按下。 #define KEY0 GPIO_ReadInputDataBit(GPIOC,GPIO_Pin_5) 按键初始化函数 图2 图3 由图1,我们看到KEY0和KEY1按键外接地,再看图2,由于设置上拉输入,及上拉电阻以上的开关打开:在按键未按下时,使得输入电压为高电平;当按键按下时,有电流流过上拉电阻,由于I/O口外接地,因此,输入低电平。而且,由于硬件设计,只能这样设置,不可改变设置。 那么同理,如图1,WK_UP按键外接3.3V的稳压电源,因此只能设置为下拉输入,内置下拉电路如图3。 void KEY_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC,ENABLE);//使能PORTA,PORTC端口时钟 GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_15;//PA15 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //上拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_5;//PC5 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //同样设置上拉输入(由于,结构体中的值已经在初始化GPIOA15时,定义过了,因此,此处可以省略) GPIO_Init(GPIOC, &GPIO_InitStructure);//初始化GPIOC5 GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0;//PA0 GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置输入模式为下拉输入 GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA0 } 按键扫描函数 在key.h的头文件中,使用如下代码,将KEY0_PRES等与数字绑定。以简单区分按下了哪一个按键。 #define KEY0_PRES 1 //KEY0 #define KEY1_PRES 2 //KEY1 #define WKUP_PRES 3 //WK_UP // 不支持连按的模式下,一直按住按键,只有一次响应 // 支持连按的模式下,一直按着按键将一直响应按键 u8 KEY_Scan(u8 mode)//mode为是否支持连按的标志 { static u8 key_up=1; if(mode)key_up=1; //按键未按下的标志 if(key_up&&(KEY0==0||KEY1==0||WK_UP==1)) { delay_ms(10);//延时10毫秒以防按键抖动而按下按键 key_up=0; if(KEY0==0)return KEY0_PRES;//确认按下的按键为KEY0 else if(KEY1==0)return KEY1_PRES;//确认按下的按键为KEY1 else if(WK_UP==1)return WKUP_PRES;//确认按下的按键为WKUP_PRES } else if(KEY0==1&&KEY1==1&&WK_UP==0)//若检测按键一直按着,则不置位特征位。 key_up=1; return 0;// 无按键按下 } 按下按键给出对应响应 t=KEY_Scan(0); //得到按键扫描所按下的按键 switch(t) { case KEY0_PRES: LED0=!LED0; break; case KEY1_PRES: LED1=!LED1; break; case WKUP_PRES: LED0=!LED0; LED1=!LED1; break; default: delay_ms(10); } |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2955 浏览 16 评论
3455 浏览 1 评论
8987 浏览 16 评论
4050 浏览 18 评论
1102浏览 3评论
570浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
568浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2301浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1857浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-22 01:13 , Processed in 1.122039 second(s), Total 79, Slave 59 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号