完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
扫一扫,分享给好友
本人用STM32F030F4P6写了个按键程序,想要的功能是按键按一次亮再按一次灭,但自己写的程序跟想要的功能差距太大,求指正!(这个程序能实现的功能是:按键按一次就亮,但再按一次就没反应了,如果按了一次那第二次无论按哪个按键都是没反应的;如果第一次按J5那D2亮,按第二次没反应,同时按下J5和J6后在放开D6亮,D2灭,然后同时按J6和J7,D7亮,D6灭;如果第一次按J6那D6亮,同时按J6和J7,D7亮,D6灭,同时按J7和J5,D2亮,D7灭,然后同时按两个都D2都是亮的,(同时按下时都是灭的,松开才亮),还有一个也是这样)之前用过定时器来写也失败了!!这个是用外部中断写的,代码如下:
#include "led.h" #include "delay.h" void Gpio_init(void) { GPIO_InitTypeDef GPIO_InitStructure; EXti_InitTypeDef EXTI_InitTypeStu; NVIC_InitTypeDef NVIC_InitTypeStu; /* GPIOC Periph clock enable */ RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); /* Configure PC8 and PC9 in output pushpull mode */ GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_1|GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IN; // GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_3; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_NOPULL; GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_ResetBits(GPIOA,GPIO_Pin_3); EXTI_InitTypeStu.EXTI_Line=EXTI_Line0; EXTI_InitTypeStu.EXTI_LineCmd=ENABLE; EXTI_InitTypeStu.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitTypeStu.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitTypeStu); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource0); EXTI_InitTypeStu.EXTI_Line=EXTI_Line1; EXTI_InitTypeStu.EXTI_LineCmd=ENABLE; EXTI_InitTypeStu.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitTypeStu.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitTypeStu); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource1); EXTI_InitTypeStu.EXTI_Line=EXTI_Line2; EXTI_InitTypeStu.EXTI_LineCmd=ENABLE; EXTI_InitTypeStu.EXTI_Mode=EXTI_Mode_Interrupt; EXTI_InitTypeStu.EXTI_Trigger=EXTI_Trigger_Falling; EXTI_Init(&EXTI_InitTypeStu); SYSCFG_EXTILineConfig(EXTI_PortSourceGPIOA,EXTI_PinSource2); NVIC_InitTypeStu.NVIC_IRQChannel=EXTI0_1_IRQn; NVIC_InitTypeStu.NVIC_IRQChannelCmd=ENABLE; NVIC_InitTypeStu.NVIC_IRQChannelPriority=0x00; NVIC_Init(&NVIC_InitTypeStu); NVIC_InitTypeStu.NVIC_IRQChannel=EXTI2_3_IRQn; NVIC_InitTypeStu.NVIC_IRQChannelCmd=ENABLE; NVIC_InitTypeStu.NVIC_IRQChannelPriority=0x01; NVIC_Init(&NVIC_InitTypeStu); } void EXTI0_1_IRQHandler(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); if(EXTI_GetITStatus(EXTI_Line0) != RESET) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0) == 0) { delay_ms(10); GPIO_SetBits(GPIOA,GPIO_Pin_3); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0/*|GPIO_Pin_1|GPIO_Pin_2*/; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2); // GPIOA->ODR ^= GPIO_Pin_0; GPIOA->ODR = ~GPIO_Pin_0; } } EXTI_ClearFlag(EXTI_Line0); // EXTI_ClearITPendingBit(EXTI_Line0); if(EXTI_GetITStatus(EXTI_Line1) != RESET) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_1) == 0) { delay_ms(10); GPIO_SetBits(GPIOA,GPIO_Pin_3); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_SetBits(GPIOA,GPIO_Pin_0|GPIO_Pin_2); // GPIOA->ODR ^= GPIO_Pin_1; GPIOA->ODR = ~GPIO_Pin_1; } } EXTI_ClearFlag(EXTI_Line1); EXTI_ClearITPendingBit(EXTI_Line1); } void EXTI2_3_IRQHandler(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_AHBPeriphClockCmd(RCC_AHBPeriph_GPIOA, ENABLE); if(EXTI_GetITStatus(EXTI_Line2) != RESET) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_2) == 0) { delay_ms(10); GPIO_SetBits(GPIOA,GPIO_Pin_3); GPIO_InitStructure.GPIO_Pin = /*GPIO_Pin_0|GPIO_Pin_1|*/GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_OUT; GPIO_InitStructure.GPIO_OType = GPIO_OType_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_PuPd = GPIO_PuPd_UP; GPIO_Init(GPIOA, &GPIO_InitStructure); // GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_0); // GPIOA->ODR ^= GPIO_Pin_2; GPIOA->ODR = ~GPIO_Pin_2; } } EXTI_ClearFlag(EXTI_Line2); } #include "stm32f0xx.h" #include "delay.h" #include "led.h" #include "uart.h" int main(void) { delay_init(); Gpio_init(); while(1) { // Gpio_init(); } }
|
|
相关推荐
9个回答
|
|
你这个问题比较多:
1.最忌讳的就是在中断服务程序中用延时,其实可以在按键中断后打开定时器定时20ms后再处理按键程序 2.IO口只要配置一次就行了,没有必要每次都在中断中再次配置 |
|
|
|
没有单独写按键检测函数啊,而且直接用取反指令就能实现的功能啊,你这个程序看起来有点小复杂~
|
|
|
|
meimengxing2014 发表于 2017-6-6 18:43 已经解决了 |
|
|
|
|
|
|
|
|
|
|
|
很乱的代码,不想看,倒胃口
|
|
|
|
|
|
|
|
|
|
|
|
怎么解决的呢?
|
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
STM32配合可编程加密芯片SMEC88ST的防抄板加密方案设计
1063 浏览 0 评论
2395 浏览 1 评论
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
2190 浏览 3 评论
4824 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
2333 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-12-31 04:03 , Processed in 0.571529 second(s), Total 55, Slave 48 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号