目录
一、配置CubeMX
配置GPIO,LED和LCD所用到的引脚
生成Keil,打开工程,编译一下检查配置是否有错误
二、添加相应的模块及代码
(1)添加LCD模块的文件
相关参考查看STMG431RBT6---LCD模块
添加相应的lcd.h头文件
添加初始化LCD的代码
(2)添加key按键模块的文件及代码
新建一个文件先保存为key.c
新建一个文件保存为key.h
将key.c文件加载到工程中去
在key.c文件里输入#include “key.h”,保存后编译,实现.h文件与环境的关联
在key.h中添加要用到的函数的头文件
读取按键要用到的函数
要添加的头文件
将此头文件添加到key.h文件中去,保存并编译
按键要用到的引脚的定义写到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)
在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;
}
(3)添加LED模块相关文件
新建文件并保存为led.h
新建文件并保存为led.c
将led.c文件加载到工程中去
编写led.h文件,保存并编译
编写led.c文件
在main.c文件中不要忘记加上头文件
三、按照题目要求添加代码
(1)按键函数Key_Proc()
//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:
;
}
}
此函数中用到的参数声明
(2)LED灯显示函数
定义变量和声明函数
编写LED_Proc函数
(3)LCD屏幕显示函数
首先要更改lcd.c文件中的三个函数,避免引脚与LED引脚产生冲突
LCD屏幕需要实现的功能
屏幕显示时用到的参数
编写LCD_Proc函数
在屏幕显示的时候用到的变量要初始化一下,因此单独写了一个变量初始化的函数
这里用到了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
四、实验结果