概述:使用两个按键分别控制两个灯的亮灭。按键A(PA_1)使用上拉的方式控制LED0(PC_13)亮灭,按键B(PA_2)使用下拉的方式控制LED1(PA_0)亮灭。
一.上拉与下拉的区别
上拉:没有按键输入的时候是1,由万用表测得该管脚是3.3V, 有键按下时是0 ;
下拉:没有按键输入的时候是0,由万用表测得该管脚是0V, 有键按下时是1;
二.设计外电路(LED与按键)
两个LED灯:
由于STMF103C8T6的PC_13上挂载了一个LED灯,所以可以将其作为LED0;
在洞洞板上焊接LED1,如图:
在洞洞板上焊接两个按键:
三.Keil5代码分析
LED初始化:
void LED_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOC, ENABLE); //使能PA,PC端口时钟
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0; //LED0-->PA.0 端口配置
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP; //推挽输出
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz; //IO口速度为50MHz
GPIO_Init(GPIOA, &GPIO_InitStructure); //根据设定参数初始化GPIOA.0
GPIO_SetBits(GPIOA,GPIO_Pin_0); //PA.0 输出高
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_13; //LED1-->PC.13 端口配置, 推挽输出
GPIO_Init(GPIOC, &GPIO_InitStructure); //推挽输出 ,IO口速度为50MHz
GPIO_ResetBits(GPIOC,GPIO_Pin_13); //PC.13 输出低
}
KEY初始化:
void KEY_Init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);//使能PORTA时钟
GPIO_PinRemapConfig(GPIO_Remap_SWJ_JTAGDisable, ENABLE);//关闭jtag,使能SWD,可以用SWD模式调试
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1;//PA15
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU; //设置成上拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOA15
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;//PC5
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD; //设置成下拉输入
GPIO_Init(GPIOA, &GPIO_InitStructure);//初始化GPIOC5
}
在KEY_Scan中通过LED0GPIO_ReadInputDataBit()读取键值,通过返回值控制LED灯的亮灭
int main(void)
{
u8 t=0; //获得键值
delay_init(); //延时函数初始化
LED_Init(); //初始化LED
KEY_Init(); //初始化按键
LED0=0; //点亮LED
while(1)
{
t=KEY_Scan(0); //得到键值
switch(t)
{
case KEY0_PRES:
LED0=!LED0;
break;
case KEY1_PRES:
LED1=!LED1;
break;
default:
delay_ms(10);
}
}
}