STM32G431RBT6---LED_LCD_Key模块综合

目录

一、配置CubeMX

 二、添加相应的模块及代码

(1)添加LCD模块的文件

 (2)添加key按键模块的文件及代码

 (3)添加LED模块相关文件

三、按照题目要求添加代码

(1)按键函数Key_Proc()

(2)LED灯显示函数

(3)LCD屏幕显示函数

(4)主函数编写main.c

 四、实验结果


一、配置CubeMX

STM32G431RBT6---LED_LCD_Key模块综合_第1张图片

 STM32G431RBT6---LED_LCD_Key模块综合_第2张图片

STM32G431RBT6---LED_LCD_Key模块综合_第3张图片 配置GPIO,LED和LCD所用到的引脚

STM32G431RBT6---LED_LCD_Key模块综合_第4张图片

 STM32G431RBT6---LED_LCD_Key模块综合_第5张图片

 生成Keil,打开工程,编译一下检查配置是否有错误

STM32G431RBT6---LED_LCD_Key模块综合_第6张图片

 二、添加相应的模块及代码

(1)添加LCD模块的文件

相关参考查看STMG431RBT6---LCD模块

添加相应的lcd.h头文件

STM32G431RBT6---LED_LCD_Key模块综合_第7张图片

添加初始化LCD的代码STM32G431RBT6---LED_LCD_Key模块综合_第8张图片

 (2)添加key按键模块的文件及代码

新建一个文件先保存为key.c

STM32G431RBT6---LED_LCD_Key模块综合_第9张图片

新建一个文件保存为key.h

STM32G431RBT6---LED_LCD_Key模块综合_第10张图片

 将key.c文件加载到工程中去

STM32G431RBT6---LED_LCD_Key模块综合_第11张图片

 在key.c文件里输入#include “key.h”,保存后编译,实现.h文件与环境的关联

STM32G431RBT6---LED_LCD_Key模块综合_第12张图片

 在key.h中添加要用到的函数的头文件

读取按键要用到的函数

STM32G431RBT6---LED_LCD_Key模块综合_第13张图片

 要添加的头文件

STM32G431RBT6---LED_LCD_Key模块综合_第14张图片

 将此头文件添加到key.h文件中去,保存并编译

STM32G431RBT6---LED_LCD_Key模块综合_第15张图片

 按键要用到的引脚的定义写到key.h文件中去,并添加按键函数声明

#define		KB1	HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
#define		KB2	HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
#define		KB3	HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
#define		KB4	HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)

STM32G431RBT6---LED_LCD_Key模块综合_第16张图片

 在key.c中添加两个按键函数的代码,保存并编译

char Key_Scan(void)
{
	static int kb1_count = 0, kb2_count = 0, kb3_count = 0, kb4_count = 0;
	char key_value = 0;
	//key1
	if(KB1 == 0)
	{
		HAL_Delay(10); //去抖
		if(KB1 == 0)
		{
			kb1_count++;
			if(kb1_count == 1)
			{
				key_value = 1;
				while(KB1 == GPIO_PIN_RESET);	//按键松开效果	
			}
		}
	}
	else 
	{
		kb1_count = 0;	
	}

	//key2
	if(KB2 == 0)
	{
		HAL_Delay(10); //去抖
		if(KB2 == 0)
		{
			kb2_count++;
			if(kb2_count == 1)
			{
				key_value = 2;
				while(KB2 == GPIO_PIN_RESET);	
			}
		}
	}
	else 
	{
		kb2_count = 0;	
	}

	//key3
	if(KB3 == 0)
	{
		HAL_Delay(10); //È¥¶¶
		if(KB3 == 0)
		{
			kb3_count++;
			if(kb3_count == 1)
			{
				key_value = 3;
				while(KB3 == GPIO_PIN_RESET);		
			}
		}
	}
	else 
	{
		kb3_count = 0;	
	}	
	
	//key4
	if(KB4 == 0)
	{
		HAL_Delay(10); //去抖
		if(KB4 == 0)
		{
			kb4_count++;
			if(kb4_count == 1)
			{
				key_value = 4;
				while(KB4 == GPIO_PIN_RESET);			
			}				
		}
	}
	else 
	{
		kb4_count = 0;	
	}	
	
	return key_value;
}

//³¤°´¶Ì°´
char Key_Scan_CD(void)
{
	static int kb1_count = 0, kb2_count = 0, kb3_count = 0, kb4_count = 0;
	char key_value = 0;
	//key1
	if(KB1 == 0)
	{
		HAL_Delay(10); //去抖
		if(KB1 == 0)
		{
			kb1_count++;				
			if(kb1_count > 70)
			{
				key_value = 11;
			}
		}		
	}
	else 
	{
		if(kb1_count >= 1 && kb1_count <=50)
			key_value = 1;	
		kb1_count = 0;	
	}

	//key2
	if(KB2 == 0)
	{
		HAL_Delay(6); //去抖
		if(KB2 == 0)
		{
			kb2_count++;
			if(kb2_count == 1)
			{
				key_value = 2;
				while(KB2 == GPIO_PIN_RESET);	
			}
		}
	}
	else 
	{
		kb2_count = 0;	
	}

	//key3
	if(KB3 == 0)
	{
		HAL_Delay(6); //去抖
		if(KB3 == 0)
		{
			kb3_count++;
			if(kb3_count == 1)
			{
				key_value = 3;
				while(KB3 == GPIO_PIN_RESET);		
			}
		}
	}
	else 
	{
		kb3_count = 0;	
	}	
	
	//key4
	if(KB4 == 0)
	{
		HAL_Delay(6); //去抖
		if(KB4 == 0)
		{
			kb4_count++;
			if(kb4_count == 1)
			{
				key_value = 4;
				while(KB4 == GPIO_PIN_RESET);			
			}				
		}
	}
	else 
	{
		kb4_count = 0;	
	}	
	
	return key_value;
}

 STM32G431RBT6---LED_LCD_Key模块综合_第17张图片

 (3)添加LED模块相关文件

新建文件并保存为led.h

STM32G431RBT6---LED_LCD_Key模块综合_第18张图片

 新建文件并保存为led.c

STM32G431RBT6---LED_LCD_Key模块综合_第19张图片

 将led.c文件加载到工程中去

STM32G431RBT6---LED_LCD_Key模块综合_第20张图片

编写led.h文件,保存并编译

STM32G431RBT6---LED_LCD_Key模块综合_第21张图片

 编写led.c文件

STM32G431RBT6---LED_LCD_Key模块综合_第22张图片

在main.c文件中不要忘记加上头文件

STM32G431RBT6---LED_LCD_Key模块综合_第23张图片

三、按照题目要求添加代码

(1)按键函数Key_Proc()

STM32G431RBT6---LED_LCD_Key模块综合_第24张图片

//Key processing function
void Key_Proc(void)
{
	char cur_key = 0;
	
	cur_key = Key_Scan();
	
	switch(cur_key)
	{
		case 1:
			Show_Flag++;
			if(Show_Flag == 3)
				Show_Flag = 1;
			break;
		case 2:
			if(Show_Flag == 2)
			{
				CNBR_Price += 0.5f;
				VNBR_Price += 0.5f;						
			}
			break;
		case 3:
			if(Show_Flag == 2)
			{
				CNBR_Price -= 0.5f;
				VNBR_Price -= 0.5f;
				if(CNBR_Price < 0)
					CNBR_Price = 0.0f;
				if(VNBR_Price < 0)
					VNBR_Price = 0.0f;											
			}
			break;
		case 4:
			break;		
		default:
			;
	}
}

 此函数中用到的参数声明

STM32G431RBT6---LED_LCD_Key模块综合_第25张图片

(2)LED灯显示函数

 STM32G431RBT6---LED_LCD_Key模块综合_第26张图片

定义变量和声明函数

STM32G431RBT6---LED_LCD_Key模块综合_第27张图片

 编写LED_Proc函数

STM32G431RBT6---LED_LCD_Key模块综合_第28张图片

(3)LCD屏幕显示函数

首先要更改lcd.c文件中的三个函数,避免引脚与LED引脚产生冲突

STM32G431RBT6---LED_LCD_Key模块综合_第29张图片

STM32G431RBT6---LED_LCD_Key模块综合_第30张图片 STM32G431RBT6---LED_LCD_Key模块综合_第31张图片

 LCD屏幕需要实现的功能

STM32G431RBT6---LED_LCD_Key模块综合_第32张图片

 STM32G431RBT6---LED_LCD_Key模块综合_第33张图片

STM32G431RBT6---LED_LCD_Key模块综合_第34张图片 

 屏幕显示时用到的参数

STM32G431RBT6---LED_LCD_Key模块综合_第35张图片

 编写LCD_Proc函数

STM32G431RBT6---LED_LCD_Key模块综合_第36张图片

 在屏幕显示的时候用到的变量要初始化一下,因此单独写了一个变量初始化的函数

STM32G431RBT6---LED_LCD_Key模块综合_第37张图片

这里用到了sprintf函数,因此要添加上头文件#include "stdio.h"

*****解释一下sprintf函数的用法

sprintf函数的原形:int sprintf( char *buffer, const char *format [, argument,...] );

*前两个参数固定,可选参数可以是任意个。buffer是字符数组名;format是格式化字符串

*sprintf的作用是将一个格式化的字符串输出到一个目的字符串

*例子:sprintf(s, "%d", 1234); //产生"1234"

(4)主函数编写main.c

STM32G431RBT6---LED_LCD_Key模块综合_第38张图片

 四、实验结果

STM32G431RBT6---LED_LCD_Key模块综合_第39张图片

STM32G431RBT6---LED_LCD_Key模块综合_第40张图片

 STM32G431RBT6---LED_LCD_Key模块综合_第41张图片

 

 

 

你可能感兴趣的:(单片机,嵌入式硬件)