ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

STM32之用野火的F429点彩虹(HAL库)-02

2021-07-28 21:34:43  阅读:229  来源: 互联网

标签:02 HAL PIN void STM32 Led GPIO LED


这次想要实现的功能是:
开局流水灯
k1:流水暂停/流水继续
k2:流水灯时开关灯,流水暂停时k2手动换色
(灯的顺序是从红色开始的 继续是接着之前的灯 开关是从红色开始)

继续上一次的cubeMX

image
打开pc13和pa1脚

程序部分:

用了枚举所以贴贴菜鸟教程

https://www.runoob.com/cprogramming/c-enum.html

typedef enum LED_STATE_t{
	LED_OFF,
	LED_FLOWE,
	LED_PAUSE,
}LED_STATE_t;
LED_STATE_t LED_State = LED_FLOWE; // * LED 流水开关
unsigned char flag = 0;
unsigned char key1_flag = 1;//key1标志位
//变量们

void Led_Close()
{
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_SET);
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_SET);
}//关闭LED灯

void Led_Red()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10,GPIO_PIN_RESET);
}//红灯
void Led_Yellow()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10|GPIO_PIN_11,GPIO_PIN_RESET);
}//黄灯
void Led_Green()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11,GPIO_PIN_RESET);
}//绿灯
void Led_Cyan()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_11|GPIO_PIN_12,GPIO_PIN_RESET);
}//青灯
void Led_Blue()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_12,GPIO_PIN_RESET);
}//蓝灯
void Led_Purple()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10|GPIO_PIN_12,GPIO_PIN_RESET);
}//紫灯
void Led_White()
{
	Led_Close();
	HAL_GPIO_WritePin(GPIOH,GPIO_PIN_10|GPIO_PIN_11|GPIO_PIN_12,GPIO_PIN_RESET);
}//白灯
//这里把之前的灯都放函数里了

void (*Choice[7])(void) = {Led_Red,Led_Yellow,Led_Green,Led_Cyan,Led_Blue,Led_Purple,Led_White};//把所有灯放入指针数组

void Led_River()
{
	(*Choice[flag])();

	if (LED_State == LED_FLOWE)
	{
		HAL_Delay(1000);//延时亮一下
		flag++;
		if(flag == 7)
			flag = 0;
	}
}//流水灯

void Scan_Keys()
{
	if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 1)
	{
		HAL_Delay(5);
		if (HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 1)
		{ // * 停止流水
			 
			if (LED_State == LED_PAUSE)
			{// * 流水则关闭
					LED_State = LED_FLOWE;
			}
			else if (LED_State == LED_FLOWE)
			{// * 开始流水
					LED_State = LED_PAUSE;
			}
			while(HAL_GPIO_ReadPin(GPIOA, GPIO_PIN_0) == 1);
		}
	}
	
	if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == 1)
	{
		HAL_Delay(5);
		if (HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == 1)
		{ 
			
			if (LED_State == LED_OFF)
			{ // * 打开LED
				LED_State = LED_FLOWE;
			}
			else if (LED_State == LED_PAUSE)
			{ // * 手动换色
				flag++;
				if(flag == 7)
					flag = 0;
			}
			else if (LED_State == LED_FLOWE)
			{ // * 关闭LED
				LED_State = LED_OFF;
				Led_Close();
				flag = 0;
			}
			
			while(HAL_GPIO_ReadPin(GPIOC, GPIO_PIN_13) == 1);
		}
	}
}//按键判断

然后是主函数部分(刚刚那些在主函数外边)

while (1)
  {
		
    /* USER CODE END WHILE */
		
    /* USER CODE BEGIN 3 */
		if (LED_State != LED_OFF)
		{
			Led_River();//流水灯
		}
		Scan_Keys();//检测按键
  }

效果展示(调了三倍速)

image

注:因为没用中断 用的延时 所以按键不够灵敏 下次改进

标签:02,HAL,PIN,void,STM32,Led,GPIO,LED
来源: https://www.cnblogs.com/jun-ruo-sui-nian/p/MCUandES_7.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有