你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

STM32G431RBT6模块综合之LED_LCD_Key

[复制链接]
STMCU小助手 发布时间:2023-3-3 14:00
一、配置CubeMX

e2a40ee3ff9048feb5b6a2ad3a2b859e.png

c8e4dfc24e8648a68997801a6470da46.png


78e4d2b15e3643028dfa071c5087cb10.png

配置GPIO,LED和LCD所用到的引脚

8d90a2e1f3264dc0873ab34f117c4b62.jpg

b7ac8b07a2ee42b1a374abe04f74b859.jpg

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

0855cb6a22884f1abdb1ee556530ca28.png

二、添加相应的模块及代码
(1)添加LCD模块的文件
添加相应的lcd.h头文件

7bfd57699b724c4aba9eab70df879e7f.jpg

添加初始化LCD的代码



(2)添加key按键模块的文件及代码
新建一个文件先保存为key.c

91ce427e929d4de9944b395eb4c9648a.png

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

e3b14308e8fb46ecb2af49f3419fd6bf.png

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

5bb20a8be5b24b8fab8e194b28a17b84.png

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

b92984cec1e7456cb34828f95747361a.png

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

读取按键要用到的函数

0ee61c62574c4c29b869e8cdfe6ba985.png

要添加的头文件

bcc8ed702ac443af9913939ed908c45e.png

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

f7bc043bbdb44345a329ccb298d4fc48.png

按键要用到的引脚的定义写到key.h文件中去,并添加按键函数声明
  1. #define                KB1        HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_0)
  2. #define                KB2        HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_1)
  3. #define                KB3        HAL_GPIO_ReadPin(GPIOB,GPIO_PIN_2)
  4. #define                KB4        HAL_GPIO_ReadPin(GPIOA,GPIO_PIN_0)
复制代码

d0379df59f8247709738aaeb7dd80b6a.png

在key.c中添加两个按键函数的代码,保存并编译
  1. char Key_Scan(void)
  2. {
  3.         static int kb1_count = 0, kb2_count = 0, kb3_count = 0, kb4_count = 0;
  4.         char key_value = 0;
  5.         //key1
  6.         if(KB1 == 0)
  7.         {
  8.                 HAL_Delay(10); //去抖
  9.                 if(KB1 == 0)
  10.                 {
  11.                         kb1_count++;
  12.                         if(kb1_count == 1)
  13.                         {
  14.                                 key_value = 1;
  15.                                 while(KB1 == GPIO_PIN_RESET);        //按键松开效果        
  16.                         }
  17.                 }
  18.         }
  19.         else
  20.         {
  21.                 kb1_count = 0;        
  22.         }

  23.         //key2
  24.         if(KB2 == 0)
  25.         {
  26.                 HAL_Delay(10); //去抖
  27.                 if(KB2 == 0)
  28.                 {
  29.                         kb2_count++;
  30.                         if(kb2_count == 1)
  31.                         {
  32.                                 key_value = 2;
  33.                                 while(KB2 == GPIO_PIN_RESET);        
  34.                         }
  35.                 }
  36.         }
  37.         else
  38.         {
  39.                 kb2_count = 0;        
  40.         }

  41.         //key3
  42.         if(KB3 == 0)
  43.         {
  44.                 HAL_Delay(10); //È¥¶¶
  45.                 if(KB3 == 0)
  46.                 {
  47.                         kb3_count++;
  48.                         if(kb3_count == 1)
  49.                         {
  50.                                 key_value = 3;
  51.                                 while(KB3 == GPIO_PIN_RESET);               
  52.                         }
  53.                 }
  54.         }
  55.         else
  56.         {
  57.                 kb3_count = 0;        
  58.         }        
  59.         
  60.         //key4
  61.         if(KB4 == 0)
  62.         {
  63.                 HAL_Delay(10); //去抖
  64.                 if(KB4 == 0)
  65.                 {
  66.                         kb4_count++;
  67.                         if(kb4_count == 1)
  68.                         {
  69.                                 key_value = 4;
  70.                                 while(KB4 == GPIO_PIN_RESET);                        
  71.                         }                                
  72.                 }
  73.         }
  74.         else
  75.         {
  76.                 kb4_count = 0;        
  77.         }        
  78.         
  79.         return key_value;
  80. }

  81. //³¤°´¶Ì°´
  82. char Key_Scan_CD(void)
  83. {
  84.         static int kb1_count = 0, kb2_count = 0, kb3_count = 0, kb4_count = 0;
  85.         char key_value = 0;
  86.         //key1
  87.         if(KB1 == 0)
  88.         {
  89.                 HAL_Delay(10); //去抖
  90.                 if(KB1 == 0)
  91.                 {
  92.                         kb1_count++;                                
  93.                         if(kb1_count > 70)
  94.                         {
  95.                                 key_value = 11;
  96.                         }
  97.                 }               
  98.         }
  99.         else
  100.         {
  101.                 if(kb1_count >= 1 && kb1_count <=50)
  102.                         key_value = 1;        
  103.                 kb1_count = 0;        
  104.         }

  105.         //key2
  106.         if(KB2 == 0)
  107.         {
  108.                 HAL_Delay(6); //去抖
  109.                 if(KB2 == 0)
  110.                 {
  111.                         kb2_count++;
  112.                         if(kb2_count == 1)
  113.                         {
  114.                                 key_value = 2;
  115.                                 while(KB2 == GPIO_PIN_RESET);        
  116.                         }
  117.                 }
  118.         }
  119.         else
  120.         {
  121.                 kb2_count = 0;        
  122.         }

  123.         //key3
  124.         if(KB3 == 0)
  125.         {
  126.                 HAL_Delay(6); //去抖
  127.                 if(KB3 == 0)
  128.                 {
  129.                         kb3_count++;
  130.                         if(kb3_count == 1)
  131.                         {
  132.                                 key_value = 3;
  133.                                 while(KB3 == GPIO_PIN_RESET);               
  134.                         }
  135.                 }
  136.         }
  137.         else
  138.         {
  139.                 kb3_count = 0;        
  140.         }        
  141.         
  142.         //key4
  143.         if(KB4 == 0)
  144.         {
  145.                 HAL_Delay(6); //去抖
  146.                 if(KB4 == 0)
  147.                 {
  148.                         kb4_count++;
  149.                         if(kb4_count == 1)
  150.                         {
  151.                                 key_value = 4;
  152.                                 while(KB4 == GPIO_PIN_RESET);                        
  153.                         }                                
  154.                 }
  155.         }
  156.         else
  157.         {
  158.                 kb4_count = 0;        
  159.         }        
  160.         
  161.         return key_value;
  162. }
复制代码



(3)添加LED模块相关文件
新建文件并保存为led.h



新建文件并保存为led.c

c096251d51354fe6b002a8e634a2a9a1.png

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

ebb7b525f82043fa90ab4eaed83cbfe8.png

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

83b26987d0f44e4588147e582634cfee.png

编写led.c文件

c443b666da454977ab7d9a81c7cc5e0d.png

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

6409ef78e3f444c489fc0aaaa4a567b7.png


三、按照题目要求添加代码
(1)按键函数Key_Proc()

5ca36f9732a94d85939346e285d46c54.png

  1. //Key processing function
  2. void Key_Proc(void)
  3. {
  4.         char cur_key = 0;
  5.         
  6.         cur_key = Key_Scan();
  7.         
  8.         switch(cur_key)
  9.         {
  10.                 case 1:
  11.                         Show_Flag++;
  12.                         if(Show_Flag == 3)
  13.                                 Show_Flag = 1;
  14.                         break;
  15.                 case 2:
  16.                         if(Show_Flag == 2)
  17.                         {
  18.                                 CNBR_Price += 0.5f;
  19.                                 VNBR_Price += 0.5f;                                                
  20.                         }
  21.                         break;
  22.                 case 3:
  23.                         if(Show_Flag == 2)
  24.                         {
  25.                                 CNBR_Price -= 0.5f;
  26.                                 VNBR_Price -= 0.5f;
  27.                                 if(CNBR_Price < 0)
  28.                                         CNBR_Price = 0.0f;
  29.                                 if(VNBR_Price < 0)
  30.                                         VNBR_Price = 0.0f;                                                                                       
  31.                         }
  32.                         break;
  33.                 case 4:
  34.                         break;               
  35.                 default:
  36.                         ;
  37.         }
  38. }
复制代码

此函数中用到的参数声明

ebf957a377c043d1b6906b446fa05d32.png

(2)LED灯显示函数

a998c5531c7147c0acc459bdb6bc72da.png

0722dd642a7e43c994c7d516e354bb4b.png

定义变量和声明函数

968273c22bbc4355af3b301c79303194.png

编写LED_Proc函数

766276a0b1764795b4eb88f80d55221e.png

(3)LCD屏幕显示函数
首先要更改lcd.c文件中的三个函数,避免引脚与LED引脚产生冲突

67ebb1145dc543ba96b55fcc8a7806be.png

f7926bbc0b7a49c0ae43b97802e8cba1.png



LCD屏幕需要实现的功能

d84012117191471b92a4450ec142d1a7.png

a42bdcb6b74a47aab5962c481c5217f5.png

726b4211464940dc976d9ab0e6491d57.png

屏幕显示时用到的参数

dd042303f81a4f60950791d25b6a4815.png

编写LCD_Proc函数
163c1e20f84d41b090b09a2385f0dc11.png

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

07d5f491b1cd456bae64935aca011cc9.png

这里用到了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

e45d7403602c4ea482293b59e5796a32.png


四、实验结果

3292e1ada20b432bba121a50d0ada729.png

9870611998504c01b44b1cd3e782eb20.png

9a3f319716f744b18011c98fbc4b9108.png

————————————————
版权声明:想要优秀点儿


b71ccf0fa63f4ed58e0d54ee14b6fbf6.png
ab6fae1c909e4ff58fc2063e081747c5.png
607c62bb04ef4473b54026d2d8f1fb5f.png
6f3ea7eab2f945e096fc6d7f70e3d4f0.png
收藏 评论0 发布时间:2023-3-3 14:00

举报

0个回答

所属标签

相似分享

官网相关资源

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版