蓝桥杯嵌入式1、按键、流水灯

0、添加lLibrary的相关依赖
在这里插入图片描述

1、打开液晶参考历程
2、重新定义液晶初始化函数

void lcdall_init(void);
void lcdall_init(void)
{
	STM3210B_LCD_Init();
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	LCD_Clear(Blue);
	LCD_DisplayStringLine(Line4 ,"    Hello,world.   ");
	Delay_Ms(1000);
}

3、初始化 LED和按键(蓝桥杯嵌入式开发板LED灯位PC8-15,使用LED灯时应同时控制锁存PD2;按键为PA0、8和PB1、2)
(1)打开:第十一届蓝桥杯大赛个人赛(电子类)模拟题\嵌入式设计与开发\STM32固件库v3.5\STM32F10x_StdPeriph_Lib_V3.5.0\Project\STM32F10x_StdPeriph_Examples\GPIO\IOToggle复制以下主函数的初始化代码,进行更改,进行LED和按键初始化,注意按键模式不是GPIO_Mode_Out_PP而是

int main(void)
{
  /*!< At this stage the microcontroller clock setting is already configured, 
       this is done through SystemInit() function which is called from startup
       file (startup_stm32f10x_xx.s) before to branch to application main.
       To reconfigure the default setting of SystemInit() function, refer to
       system_stm32f10x.c file
     */     
       
  /* GPIOD Periph clock enable */
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD, ENABLE);

  /* Configure PD0 and PD2 in output pushpull mode */
  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOD, &GPIO_InitStructure);

定义LED初始化 (将LED初始化为灭的状态)

void led_init(void)
{
  GPIO_InitTypeDef     GPIO_InitStructure;		//要放在函数最前面
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOD|RCC_APB2Periph_GPIOC, ENABLE);


  GPIO_InitStructure.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_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
  GPIO_Init(GPIOC, &GPIO_InitStructure);

  /* 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_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);
  Delay_Ms(1000);
}

4、特别需要注意的是,系统时钟初始化、液晶初始化,LED初始化顺序
最好是一下顺序,不然会产生灯全亮,液晶初始化没字等情况,所以最好为一下顺序

SysTick_Config(SystemCoreClock/1000);
led_init();
lcdall_init();

5、按照LED灯的初始化情况,初始化按键,按键模式为GPIO_Mode_IPU,按键为PA0\8,PB1\2

void key_init(void)
{
  GPIO_InitTypeDef     GPIO_InitStructure;		//要放在函数最前面
  RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA|RCC_APB2Periph_GPIOB, ENABLE);


  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0|GPIO_Pin_8;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPU;	  //注意 输入模式
  GPIO_Init(GPIOA, &GPIO_InitStructure);

  GPIO_InitStructure.GPIO_Pin = GPIO_Pin_1|GPIO_Pin_2;
  GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
  GPIO_InitStructure.GPIO_Mode = GPIO_Mode_AIN;
  GPIO_Init(GPIOB, &GPIO_InitStructure);

}

6、定义流水灯控制函数

void led_control(uint16_t LED,uint16_t staues)
{
	  if(staues)
	  {
	  	GPIO_SetBits(GPIOC,LED);
 		GPIO_SetBits(GPIOD,GPIO_Pin_2);//
  		GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	  
	  }
	  else
	  {
	  	GPIO_ResetBits(GPIOC,LED);
 		GPIO_SetBits(GPIOD,GPIO_Pin_2);//
  		GPIO_ResetBits(GPIOD,GPIO_Pin_2);
	  
	  }

}

7、检测流水灯函数、实现闪烁使用GPIO_Pin_All让灯全熄灭,然后再控制自己想控制的 灯

while(1)
{
   led_control(GPIO_Pin_9,0);
   led_control(GPIO_Pin_10,0);
   Delay_Ms(500);
   led_control(GPIO_Pin_All,1);
   led_control(GPIO_Pin_9,1);
   led_control(GPIO_Pin_10,1);
   Delay_Ms(500);
}

8、定义按键输入

#define  KEY1  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_0)   	 
#define  KEY2  GPIO_ReadInputDataBit(GPIOA,GPIO_Pin_8)  
#define  KEY3  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_1)   	 
#define  KEY4  GPIO_ReadInputDataBit(GPIOB,GPIO_Pin_2) 

9、编写按键控制函数

uint16_t key_scan(void)
{
   uint16_t key_value=0	 ;
	 if(KEY1==0)
	   {
	   	 key_value=1;
	   }
	  if(KEY2==0)
	   {
	   	 key_value=2;
	   }
	  if(KEY3==0)
	   {
	   	 key_value=3;
	   }

	  if (KEY4==0)
	   {
	   	 key_value=4;
	   }
	return 	key_value;
}

10、主函数按键具体控制:下面这种是按下就亮不按不亮不持续的


```clike
	while(1)
{
   KEY_value=key_scan();
   if(KEY_value==1)
   {
   	 led_control(GPIO_Pin_9,0);
   }
   if(KEY_value==2)
   {
   	 led_control(GPIO_Pin_10,0);
   }
   if(KEY_value==3)
   {
   	 led_control(GPIO_Pin_11,0);

   }
   if(KEY_value==4)
   {
   	 led_control(GPIO_Pin_12,0);
   }
   else
   {
   	 led_control(GPIO_Pin_All,1);
   }

}

下面是按下一直亮、直到按下别的按键

while(1)
{
	key_scan();
   if(key_value==1)
   {
   	 led_control(GPIO_Pin_9,0);
   }
   if(key_value==2)
   {
   	 led_control(GPIO_Pin_10,0);
   }
   if(key_value==3)
   {
   	 led_control(GPIO_Pin_11,0);

   }
   if(key_value==4)
   {
   	 led_control(GPIO_Pin_12,0);
   }
   else
   {
   	 led_control(GPIO_Pin_All,1);
   }

}

11、流水灯函数、最简单写法,go to definition of
GPIO_ResetBits 找到相应的BRR寄存器,将0x80左移即可。

void led_flow(uint16_t staues)
{
  	  	GPIOC->BRR = 0x80<<staues;
 		GPIO_SetBits(GPIOD,GPIO_Pin_2);//
  		GPIO_ResetBits(GPIOD,GPIO_Pin_2);

}

相应的主函数如下时从左往右亮,到8全熄灭,然后再左向右亮’

	while(1)
	{
	 for(i=0;i<=8;i++)
	 {
	   led_flow(i);
	   Delay_Ms(1000);
	   if(i==8)
		{
        led_control(GPIO_Pin_All,1);
		Delay_Ms(1000);
		}
		
	 }

    }
  • 4
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

位沁

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值