1 #include "stm32f10x.h"// 相当于51单片机中的 #include2 #include "stm32f10x_gpio.h" 3 /*通过按键实现LED灯的亮灭 4 *本项目是两个效果,烧程序时注意分开!!!!! 5 *1、LED实现的效果实是K1一直按下LED一直亮,直到K1松开LED熄灭 6 *2、按一下key实现LED亮,再按一下实现LED灭 7 * 8 */ 9 10 /*配置GPIO11 *step1配置时钟12 *结构体:Speed、Mode、Pin13 *初始化14 */15 int main(void)16 {17 //点亮红色灯18 //step1:使能19 20 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);21 //结构体22 GPIO_InitTypeDef a;23 a.GPIO_Speed=GPIO_Speed_50MHz;24 a.GPIO_Pin=GPIO_Pin_5;25 //推挽输出26 a.GPIO_Mode=GPIO_Mode_Out_PP;27 //调用GPIO初始化函数28 GPIO_Init(GPIOB,&a);29 //设置PB5为低点平30 //GPIO_ResetBits(GPIOB,GPIO_Pin_5);31 //GPIO_SetBits(GPIOB,GPIO_Pin_5);32 33 34 35 /**************按键初始*************/36 37 //step1:时钟使能38 RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);39 //step2:定义GPIO初始化结构体变量40 GPIO_InitTypeDef b;41 b.GPIO_Speed=GPIO_Speed_50MHz;42 b.GPIO_Pin=GPIO_Pin_0;43 //浮空输入44 b.GPIO_Mode=GPIO_Mode_IN_FLOATING;45 //stept3:调用GPIO初始化函数46 GPIO_Init(GPIOA,&b);47 /************************1********************************/48 /*49 *知识点:读取电平的函数:GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);50 *详细见后面截图51 */52 53 /*LED实现的效果实是K1一直按下LED一直亮,直到K1松开LED熄灭*/54 55 while(1)//死循环随时检测按键的情况56 {57 //读取引脚的点平并赋值给i58 int i = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);59 if(i==0)//判断K1的电平是否为060 {61 //为0时,设置PB5为高电平,62 GPIO_SetBits(GPIOB,GPIO_Pin_5);63 }64 else65 {66 67 //设置PB5为低点平68 GPIO_ResetBits(GPIOB,GPIO_Pin_5);69 }70 }71 72 73 /***************************2*********************************/74 /*********以下代码实现按键按一下LED亮,再按以下LED灭*********/75 int pre=0;//上一次循环按键的点平76 while(1)77 {78 //读取引脚的点平79 int states = GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0);80 if(states==0&&pre==1)//states是循环时检测的电平,难点在这???????????81 {82 //按键刚松开那一刻,states马上变为0,但是上一次循环中给pre赋的值还是183 if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_5)==0)//再判断是否为低电平84 {85 //给GPIOB端口5赋值为高电平,实现LED亮86 GPIO_SetBits(GPIOB,GPIO_Pin_5);87 }88 else89 {90 //给GPIOB端口5赋值为低电平,实现LED灭91 GPIO_ResetBits(GPIOB,GPIO_Pin_5);92 }93 }94 pre=states;//把本次循环按键的电平赋值给上一次95 }96 /*******************************************************************/ 97 }