蓝桥杯嵌入式 ---- “空手套白狼“ 之 LED


前言

本文是基于嵌入式开发板CT117E,stm32f103RBT6。"空手套白狼"就是直接利用官方给的库(v3.5),进行拷贝修改形成可以正常运行的代码。

一、原理图

在这里插入图片描述
在这里插入图片描述

二、由原理图得到的信息

  • 八个led连接着锁存器。
  • 锁存器的输入端H D0----H D7,还有使能端N LE,连接的端口分别是PC8-PC15和PD2。
  • 连接led的端口 PC8-PC15低电平有效,锁存器的使能端口PD2高电平有效。

三、led初始化

  1. 蓝桥杯的开发板中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);
  1. led有八个,低电平有效,分别是PC8-PC15,所以初始化的时候一个一个PIN口写太麻烦,这里可以直接写0xff00,就是初始化8-15这几个口;其他结构体的配置都一样;蓝桥杯的开发板对led有锁存器,是PD2,高电平有效,高电平的时候,PC8-15的端口电平值才能传输到led,所以每次我们对led进行控制都要打开锁存器更新一下led的值,再关闭锁存器。

  2. 初始化函数: 复制拷贝库文件,不用自己敲代码记结构体名字。


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秒的间隔进行闪烁
}
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值