一、实验目的

1、STM32CubeMX在外部中断实验(点此可进入)基础上,增加PC0-PC7、PB9、PB8、PB5、PA8为 LCD 输出引脚,生成 MDK工程文件和外设初始化代码。

2、验证LCD例程。

3、MDK 工程文件要求:实验三基础移植例程的 LCD 驱动函数;程序运行过程中,LCD 显示当前的流水灯花式。

4、用实验板(STM32CubeMX的HCLK时钟设置为80M)验证。


 二、软硬件环境

1.Java Run Time Environment (JRE);

2.STM32CubeMX软件;

3.Keil-MDK;

4.STM32G431RBTx开发板。


三、项目实现

1、STM32CubeMX生成Keil5工程文件和外设初始化代码

        (1)配置LCD相关引脚:将PC0-PC7、PB9、PB8、PB5、PA8配置为输出模式,并且为其打上对应的用户标签。PC8-PC15这八个引脚在配置LED时已经配置过,因为与LCD共用,因此不用再重新配置。如下:

 

        (2)点击“Generate Code”生成工程代码。

2、Keil调试、下载代码

        (1)要求程序流程图:

        (2) 找到LCD相关例程文件:在提供的资料包中,找到LCD的相关例程文件夹(“HAL_06_LCD”文件夹),打开其Keil的MDK工程文件。

        (3)添加LCD的驱动文件以及头文件:在“HAL_06_LCD”文件夹中的“Inc”和“Src”文件夹中分别找到“fonts.h”、“lcd.h”以及“lcd.c”这三个文件,并将其添加到自己的工程中。添加结果如下:

         (4)编写相关代码:将资料包中的MDK文件的LCD相关例程复制到自己的工程中,且还要加上#include "lcd.h"。并且在按键函数以及中断函数中的对应位置,编写LCD_DisplayStringLine函数,使其对应的LED花式名称可以在LCD显示屏中显示出来。如下:

 

        (5)编译代码,若代码无误,便可下载代码。

3、开发板上检验

        在开发板上检验PB1与PB2的中断功能,并且确认按键以及中断对应的LED灯花式都可正确实现,对应的花式名称也可在LCD中显示出来。

4、相关代码

  • LCD例程
	//LCD
	LCD_Clear(Blue);
	LCD_SetBackColor(Blue);
	LCD_SetTextColor(White);
	
	LCD_DisplayStringLine(Line0, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line1, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line2, (uint8_t *)"      LCD Test      ");
	LCD_DisplayStringLine(Line3, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line4, (uint8_t *)"                    ");
	
	LCD_SetBackColor(White);
	LCD_SetTextColor(Blue);

	LCD_DisplayStringLine(Line5, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line6, (uint8_t *)"       HAL LIB      ");
	LCD_DisplayStringLine(Line7, (uint8_t *)"                    ");
	LCD_DisplayStringLine(Line8, (uint8_t *)"         @80        ");
	LCD_DisplayStringLine(Line9, (uint8_t *)"                    ");
  • 花式1和花式4
 while (1)     
  {
		switch(key_READ()){
			/*Key query*/
			case 1:
				LCD_DisplayStringLine(Line6, (uint8_t *)"      left_loop     ");
				LED_OFF(GPIO_PIN_All);
				HAL_Delay(100);
				while(key_READ()==1)
				{
					left_loop();
				}
				break;
//		case 2:
//			while(key_READ()==2)
//				right_loop();
//			break;
//		case 3:
//			LED_ON(LED1_Pin|LED3_Pin|LED5_Pin|LED7_Pin);
//			LED_OFF(LED2_Pin|LED4_Pin|LED6_Pin|LED8_Pin);
//			HAL_Delay(100);
//			while(key_READ()==3)
//			{
//				/*flash half*/
//				LED_Toggle(LED6_Pin|LED7_Pin|LED8_Pin|LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin);
//				HAL_Delay(500);
//			}
//			break;
			case 4:
				LCD_DisplayStringLine(Line6, (uint8_t *)"        flash       ");
				while(key_READ()==4)
				{
					/*flash all*/
					LED_Toggle(LED6_Pin|LED7_Pin|LED8_Pin|LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin);
					HAL_Delay(300);
				}
				break;
			}
    /* USER CODE END WHILE */

    /* USER CODE BEGIN 3 */
  }
  • 花式2和花式3
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
	static uint8_t i,j;
	if(GPIO_Pin == GPIO_PIN_1)
	{
		LCD_DisplayStringLine(Line6, (uint8_t *)"     right_loop     ");
		LED_OFF(GPIO_PIN_All);
		HAL_Delay(100);
		for(i=0;i<8;i++)
		{
			right_loop();
		}
	}
	if(GPIO_Pin == GPIO_PIN_2)
	{
		LCD_DisplayStringLine(Line6, (uint8_t *)"     flash_half     ");
		LED_ON(LED1_Pin|LED3_Pin|LED5_Pin|LED7_Pin);
		LED_OFF(LED2_Pin|LED4_Pin|LED6_Pin|LED8_Pin);
		HAL_Delay(100);
		for(j=0;j<8;j++)
		{
			LED_Toggle(LED6_Pin|LED7_Pin|LED8_Pin|LED1_Pin|LED2_Pin|LED3_Pin|LED4_Pin|LED5_Pin);
			HAL_Delay(500);
		}
	}
}

四、实验效果

LCD


 五、总结

        在本次实验中,我们成功验证了LCD例程,由此可表现出STM32驱动LCD的可行性,并且成功实现了在LCD显示屏上显示当前LED花式的名称,其在开发板上的验证也符合预期。

        这标志着在这次实验中,我掌握了 LCD 模块的硬件接口与驱动原理、掌握了STM32的LCD的配置方法。并且我在实验过程中也对于嵌入式系统的开发流程更加熟悉,嵌入式编程能力和调试与优化能力也进一步增强。除此之外,我还深入理解了LCD在实际应用中的重要性。后续可以进一步探索LCD与其他外设的协同工作,以构建更高效、更方便的嵌入式系统。

Logo

智能硬件社区聚焦AI智能硬件技术生态,汇聚嵌入式AI、物联网硬件开发者,打造交流分享平台,同步全国赛事资讯、开展 OPC 核心人才招募,助力技术落地与开发者成长。

更多推荐