一、说明:
研1新生自学嵌入式,配套江协,自己复习食用。
STM32 F103C8T2
1.模块化编程:
为了简化代码,将代码分为main.c ,LED.c,KEY.c,并设置好头文件.h文件,在魔术棒中添加好。
2.头文件文件设置方法:
1.首先新建一个文件夹,里面分别建立LED.c,LED.h,KEY.c,KEY.h文件。
配置KEY.h文件:(#infdef及#define 需要__KEY_H)
#ifndef __KEY_H
#define __KEY_H
void KEY_Init(void); (注意分号)
int KEY_Getnum(void);
#endif
3.设备:
根据江协科技所给的设备及其连线
这节课新学的函数!
1.uint8_t GPIO_ReadInputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);‘
这个函数是用来读取输入数据寄存器某一个端口的输入值的;
uint16_t GPIO_Pin;
用来指定某一个端口;
uint8_t;
用来代表返回值的高低电平;(可以用来读取按键)
2. uint16_t GPIO_ReadInputData(GPIO_TypeDef* GPIOx);
uint16_t是一个16位的数据,每一位代表一个端口值;(整个);
3. uint8_t GPIO_ReadOutputDataBit(GPIO_TypeDef* GPIOx, uint16_t GPIO_Pin);
这个函数是用来读取输出数据寄存器某一个端口的输入值的;
4.uint16_t GPIO_ReadOutputData(GPIO_TypeDef* GPIOx);
int16_t是一个16位的数据,每一位代表一个端口值;(整个);
4.输入数据寄存器(GPIO_ReadInputDataBit,GPIO_ReadInputData)读取;
5.输出数据寄存器(GPIO_ReadoutDataBit,GPIO_ReadoutData)读取;
三、正式编写
LED编写:
打开LED.c
#include "stm32f10x.h"
GPIO_InitTypeDef GPIO_InitStructure;
void LED_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA,ENABLE);
GPIO_InitStructure.GPIO_Mode=GPIO_Mode_Out_PP;//设置上拉模式,按下开关为低电平,默认为高电平
GPIO_InitStructure.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOA,&GPIO_InitStructure);
GPIO_SetBits(GPIOA,GPIO_Pin_1|GPIO_Pin_2);
} 初始化
void LED1_ON(void)(控制LED_1启动函数)
GPIO_ResetBits(GPIOA,GPIO_Pin_1);(将GPIO_Pin_1设置为低电平)
}
void LED1_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_1);(将GPIO_Pin_2设置为低电平)
}
void LED2_ON(void)
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);
}
void LED2_OFF(void)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);
}
以上为控制灯亮灯灭函数
void LED1_TURN(void) 取反,
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0) 读取输出位高低电平,
{
GPIO_SetBits(GPIOA,GPIO_Pin_1); 将pin_1设置为高电平
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);// 将pin_1设置为低电平
}
}
void LED2_TURN(void)
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_2)==0)
{
GPIO_SetBits(GPIOA,GPIO_Pin_2);//将pin_2设置为高电平
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_2);// 将pin_2设置为低电平
}
}
第二部分
include "stm32f10x.h"
#include "Delay.h"
GPIO_InitTypeDef GPIO_InitStructure1;
void KEY_Init(void)
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitStructure1.GPIO_Mode=GPIO_Mode_IPU;
GPIO_InitStructure1.GPIO_Pin=GPIO_Pin_1|GPIO_Pin_11;
GPIO_InitStructure1.GPIO_Speed=GPIO_Speed_50MHz;
GPIO_Init(GPIOB,&GPIO_InitStructure1);
} 初始化
uint8_t KEY_Getnum(void)
{
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0) (用来读取输入数据寄存器某一个端口的输入值的,按键按下为低电平,(上拉模式))
{
Delay_ms(20);(消除抖动)
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)==0);
Delay_ms(20);
KEY_num=1;(按下赋予1,在第三部分接收)
}
if(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0)
{
Delay_ms(20);
while(GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_11)==0);
Delay_ms(20);
KEY_num=2;
}
return KEY_num;
}
第三部分
#include "LED.h"
#include "KEY.h"
uint8_t KeyNum;
int main(void)
{
LED_Init();
KEY_Init();
while (1)
{
KeyNum =KEY_Getnum();
if(KeyNum==1)(第一个开关按下)
{
LED1_TURN();下面分析
}
if(KeyNum==2)
{
LED2_TURN();
}
}
}
void LED1_TURN(void) 取反,
{
if(GPIO_ReadOutputDataBit(GPIOA,GPIO_Pin_1)==0) 读取输出位高低电平,
{
GPIO_SetBits(GPIOA,GPIO_Pin_1); 将pin_1设置为高电平,如果此时是高电平,输出模式为上拉模式,LED的双引脚都是高电平,无法点亮,LED熄灭
}
else
{
GPIO_ResetBits(GPIOA,GPIO_Pin_1);// 将pin_1设置为低电平,pin_1设置为低电平,如果此时是高电平,输出模式为上拉模式,LED的双引脚一高一低电平,点亮LED。
}