前言
本文是基于嵌入式开发板CT117E,stm32f103RBT6。"空手套白狼"就是直接利用官方给的库(v3.5),进行拷贝修改形成可以正常运行的代码。
一、原理图
二、由原理图得到的信息
- 八个led连接着锁存器。
- 锁存器的输入端H D0----H D7,还有使能端N LE,连接的端口分别是PC8-PC15和PD2。
- 连接led的端口 PC8-PC15低电平有效,锁存器的使能端口PD2高电平有效。
三、led初始化
- 蓝桥杯的开发板中led和lcd的引脚是冲突的,所以我们需要修改一下考场给的资源里面的lcd驱动,需要修改下面这三个函数。分别在这三个函数的头部加上u16 t = GPIOC->ODR,尾加上GPIOC->ODR = t,在改变GPIOC->ORD寄存器的值前将其保留,直到lcd完成写操作再把值还给GPIOC的ODR寄存器。
void LCD_WriteReg(u8 LCD_Reg, u16 LCD_RegValue);
void LCD_WriteRAM_Prepare(void);
void LCD_WriteRAM(u16 RGB_Code);
-
led有八个,低电平有效,分别是PC8-PC15,所以初始化的时候一个一个PIN口写太麻烦,这里可以直接写0xff00,就是初始化8-15这几个口;其他结构体的配置都一样;蓝桥杯的开发板对led有锁存器,是PD2,高电平有效,高电平的时候,PC8-15的端口电平值才能传输到led,所以每次我们对led进行控制都要打开锁存器更新一下led的值,再关闭锁存器。
-
初始化函数: 复制拷贝库文件,不用自己敲代码记结构体名字。
STM32固件库代码V3.5版\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle\main.c
void led_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOC | RCC_APB2Periph_GPIOD, ENABLE);
/* Configure PD0 and PD2 in output pushpull mode */
GPIO_InitStructure.GPIO_Pin = GPIO_Pin_2;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = 0xff00;
GPIO_Init(GPIOD, &GPIO_InitStructure);
GPIOC->ODR =0XFF<<8; //首次初始化全部熄灭
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
四、led应用函数
①led的亮 ---- 灭。
void led_ctrl(u8 ledx,u8 status) //ledx取值范围8-15,代表PC8-PC15;
{
if(status==1) //status : 1 ---亮 0 ----灭
{
GPIO_ResetBits(GPIOC,1<<ledx);
GPIO_SetBits(GPIOD,GPIO_Pin_2); //来锁存器
GPIO_ResetBits(GPIOD,GPIO_Pin_2); //关锁存器
}
else
{
GPIO_SetBits(GPIOC,1<<ledx);
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
}
②led 闪烁
void led_toggle(u8 ledx) //ledx: 8-15
{
GPIOC->ODR ^=1<<ledx; //异或,灯的状态取反
GPIO_SetBits(GPIOD,GPIO_Pin_2);
GPIO_ResetBits(GPIOD,GPIO_Pin_2);
}
五、led在主函数的应用方法
led_ctrl(8,1); //led1亮
led_ctrl(8,0); //led1灭
while(1)
{
led_toggle(15);
Delay_Ms(500); //以0.5秒的间隔进行闪烁
}