LED原理
有单片机基础就很简单了,上原理图。
573锁存器使能端为PD2,当PC8-PC15为低电平,且573锁存时LED点亮。
初始化LED代码如下,先关闭所有LED。
void ledinit()
{
GPIO_InitTypeDef GPIO_InitStructer;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC|RCC_APB2Periph_GPIOD,ENABLE);//PD2 PC8-PC15
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_Out_PP;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_2;
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOD,&GPIO_InitStructer);
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15;
GPIO_Init(GPIOC,&GPIO_InitStructer);
GPIO_SetBits(GPIOC,GPIO_Pin_8|GPIO_Pin_9|GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12|GPIO_Pin_13|GPIO_Pin_14|GPIO_Pin_15);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
KEY原理
由原理图知按下按键相应端口为低电平。
初始化代码如下。
void keyinit()
{
GPIO_InitTypeDef GPIO_InitStructer;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB,ENABLE);//PA0/8 PB1/2
GPIO_InitStructer.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_0;
GPIO_InitStructer.GPIO_Speed=GPIO_Speed_2MHz;
GPIO_Init(GPIOA,&GPIO_InitStructer);
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_8;
GPIO_Init(GPIOA,&GPIO_InitStructer);
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_1;
GPIO_Init(GPIOB,&GPIO_InitStructer);
GPIO_InitStructer.GPIO_Pin=GPIO_Pin_2;
GPIO_Init(GPIOB,&GPIO_InitStructer);
}
按键检测需要延迟函数。需要使用到STM32的滴答定时器,简单配置即可。
主函数里检测按键并点亮相应LED。
main.c部分代码如下
#include "stm32f10x.h"
#include <stdio.h>
uint32_t delaytime; //在中断函数中需要用到
void ledinit(void);
void keyinit(void);
void delay(uint32_t ms);
int main(void)
{
SysTick_Config(72000); //在core_cm3.h文件中1694行
ledinit();
keyinit();
while (1)
{
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==RESET)
{
delay(5);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)==RESET)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_8);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==RESET)
{
delay(5);
if(GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)==RESET)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_9);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==RESET)
{
delay(5);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==RESET)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_10);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==RESET)
{
delay(5);
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2)==RESET)
{
GPIO_ResetBits(GPIOC,GPIO_Pin_11);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
}
}
void delay(uint32_t ms)
{
delaytime=ms;
while(delaytime!=0);
}
中断文件中部分代码如下
#include "stm32f10x_it.h"
extern uint32_t delaytime; //外部变量在主函数中
void SysTick_Handler(void)
{
delaytime--;
}
还可以一次控制多个LED点灭。如下代码,图片一看就懂。
GPIO_Write(GPIOC,0x5fff); 点亮LED8,6
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);