是IPU(上拉输入),而IPD是(下拉),很明显PA0接了个电阻到VDD,而当有按键按下时,电路接通到地,所以PA0处读到的电压是0,当释放时,与VDD想接,是高电平为1 |
我把程序改为 按键按下灯取反四次 #include "stm32f10x.h" #include "sys.h" //#include "intrins.h" #define LED1 PDout(2) // PD2 uint16_t temp,i; void Delay(unsigned int count) { unsigned int i; for(;count!=0;count--) { i=5000; while(i--); } } int main(void) { GPIO_InitTypeDef GPIO_InitStructure; RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;//注意GPIO_Mode_IPD不是GPIO_Mode_IPU GPIO_Init(GPIOA, &GPIO_InitStructure); RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD,ENABLE); GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2; GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; GPIO_Init(GPIOD,&GPIO_InitStructure); temp=0x0001;//注要放在循环前边 while(1) { if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1) //没按下按键为0 按下按键为1 { Delay(200); if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==1) { for(i=0;i<8;i++) { // GPIO_Write(GPIOD,temp); LED1=!LED1; Delay(1000); } } }while(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==0); //按键释放应该放在按键判断之外 } } |