该代码是一个基于STM32的LCD1602驱动程序。该程序包含了LCD1602的初始化、写指令、写数据等函数。其中,LCD1602的相关宏定义和引脚定义在代码中有详细说明。在主函数中,通过调用LCD1602的初始化函数和写指令、写数据函数,实现了在LCD1602上显示一个字符的功能。该代码中的while(1)部分为空循环,即程序会一直执行该部分,直到程序被强制终止。

/* USER CODE BEGIN Header */
/** 
  ******************************************************************************
  * @file           : main.c
  * @brief          : Main program body
  ******************************************************************************
  * @attention
  *
  * Copyright (c) 2023 STMicroelectronics.
  * All rights reserved.
  *
  * This software is licensed under terms that can be found in the LICENSE file
  * in the root directory of this software component.
  * If no LICENSE file comes with this software, it is provided AS-IS.
  *
  ******************************************************************************
  */
/* USER CODE END Header */
/* Includes ------------------------------------------------------------------*/
#include "main.h"
#include "tim.h"
#include "gpio.h"

/* Private includes ----------------------------------------------------------*/
/* USER CODE BEGIN Includes */
  //LCD1602相关的宏定义
#define RS_GPIO_Port GPIOB
#define RW_GPIO_Port GPIOB
#define EN_GPIO_Port GPIOB
#define RS_GPIO_PIN GPIO_PIN_0
#define RW_GPIO_PIN GPIO_PIN_1
#define EN_GPIO_PIN GPIO_PIN_2

#define RS_HIGH HAL_GPIO_WritePin(RS_GPIO_Port, RS_GPIO_PIN, GPIO_PIN_SET)
#define RS_LOW HAL_GPIO_WritePin(RS_GPIO_Port, RS_GPIO_PIN, GPIO_PIN_RESET)
#define RW_HIGH HAL_GPIO_WritePin(RW_GPIO_Port, RW_GPIO_PIN, GPIO_PIN_SET)
#define RW_LOW HAL_GPIO_WritePin(RW_GPIO_Port, RW_GPIO_PIN, GPIO_PIN_RESET)
#define EN_HIGH HAL_GPIO_WritePin(EN_GPIO_Port, EN_GPIO_PIN, GPIO_PIN_SET)
#define EN_LOW HAL_GPIO_WritePin(EN_GPIO_Port, EN_GPIO_PIN, GPIO_PIN_RESET)

/* USER CODE END Includes */

/* Private typedef -----------------------------------------------------------*/
/* USER CODE BEGIN PTD */
  /* USER CODE END PTD */

/* Private define ------------------------------------------------------------*/
/* USER CODE BEGIN PD */
/* USER CODE END PD */

/* Private macro -------------------------------------------------------------*/
/* USER CODE BEGIN PM */
  /* USER CODE END PM */

/* Private variables ---------------------------------------------------------*/
  /* USER CODE BEGIN PV */
  /* USER CODE END PV */

/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
  /* USER CODE END PFP */

/* Private user code ---------------------------------------------------------*/
/* USER CODE BEGIN 0 */
  //LCD1602写指令
void writeCmd(char cmd) {
    RS_LOW; //选择写指令寄存器
    RW_LOW;
    EN_LOW;
    GPIOA->ODR = cmd;  //将指令存入LCD1602的八位数据线中
    HAL_Delay(5);
      EN_HIGH;
    HAL_Delay(5);
    EN_LOW;
}

  //LCD1602写数据
void writeData(char myData) {
    RS_HIGH;  //选择写数据寄存器
    RW_LOW;
    EN_LOW;
    GPIOA->ODR = myData;  //将数据存入LCD1602的八位数据线中
    HAL_Delay(5);
      EN_HIGH;
    HAL_Delay(5);
      EN_LOW;
}

  //LCD1602初始化
void lcd1602Init() {
    HAL_Delay(15);   //延时 15ms
    writeCmd(0x38);  //写指令 38H(不检测忙信号)
      HAL_Delay(5);    //延时 5ms
    writeCmd(0x38);  //写指令 38H:显示模式设置
    writeCmd(0x08);  //写指令 08H:显示关闭
    writeCmd(0x01);  //写指令 01H:显示清屏
    writeCmd(0x06);  //写指令 06H:显示光标移动设置
    writeCmd(0x0C);  //写指令 0CH:显示开及光标设置
}

/* USER CODE END 0 */

/**
  * @brief  The application entry point.
  * @retval int
  */
int main(void) {
  /* USER CODE BEGIN 1 */
    /* USER CODE END 1 */
  /* MCU Configuration--------------------------------------------------------*/
  /* Reset of all peripherals, Initializes the Flash interface and the Systick. */
  HAL_Init();
    /* USER CODE BEGIN Init */
    /* USER CODE END Init */
  /* Configure the system clock */
  SystemClock_Config();
    /* USER CODE BEGIN SysInit */
    /* USER CODE END SysInit */
  /* Initialize all configured peripherals */
  MX_GPIO_Init();
  MX_TIM2_Init();
  /* USER CODE BEGIN 2 */
         char displayAddress = 0x80 + 0x05;
       char dsiplayData = 'H';
         lcd1602Init();
       writeCmd(displayAddress);  //字符显示的地址
     writeData(dsiplayData);  //显示的字符
     /* USER CODE END 2 */
  /* Infinite loop */
  /* USER CODE BEGIN WHILE */
  while (1)
  {
    /* USER CODE END WHILE */
    /* USER CODE BEGIN 3 */
  }
  /* USER CODE END 3 */
}

/**
  * @brief System Clock Configuration
  * @retval None
  */
void SystemClock_Config(void) {
  RCC_OscInitTypeDef RCC_OscInitStruct = {0};
  RCC_ClkInitTypeDef RCC_ClkInitStruct = {0};

    /** Initializes the RCC Oscillators according to the specified parameters
  * in the RCC_OscInitTypeDef structure.
  */
  RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
  RCC_OscInitStruct.HSEState = RCC_HSE_ON;
  RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
  RCC_OscInitStruct.HSIState = RCC_HSI_ON;
  RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
  RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
  RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL9;
  if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
  {
    Error_Handler();
  }

    /** Initializes the CPU, AHB and APB buses clocks
  */
  RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
                              |RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
  RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
  RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
  RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV2;
  RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
  if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_2) != HAL_OK)
  {
    Error_Handler();
  }
}

/**
  * @brief  This function is executed in case of error occurrence.
  * @retval None
  */
void Error_Handler(void)
{
  /* USER CODE BEGIN Error_Handler_Debug */
  /* User can add his own implementation to report the HAL error return state */
  __disable_irq();
  while (1)
  {
  }
  /* USER CODE END Error_Handler_Debug */
}

#ifdef  USE_FULL_ASSERT
/**
  * @brief  Reports the name of the source file and the source line number
  *         where the assert_param error has occurred.
  * @param  file: pointer to the source file name
  * @param  line: assert_param error line source number
  * @retval None
  */
void assert_failed(uint8_t *file, uint32_t line)
{ 
  /* USER CODE BEGIN 6 */
  /* User can add his own implementation to report the file name and line number,
     tex: printf("Wrong parameters value: file %s on line %d\r\n", file, line) */
  /* USER CODE END 6 */
}
#endif /* USE_FULL_ASSERT */

代码解释:

  • 该代码是一个基于STM32的LCD1602驱动程序,包含LCD1602的初始化、写指令、写数据等函数。
  • lcd1602Init() 函数用于初始化LCD1602,包括设置显示模式、清屏、设置光标移动方向等。
  • writeCmd() 函数用于向LCD1602发送指令,例如设置显示模式、清屏、设置光标位置等。
  • writeData() 函数用于向LCD1602发送数据,例如要显示的字符等。
  • 在主函数中,首先调用 lcd1602Init() 函数初始化LCD1602,然后通过 writeCmd()writeData() 函数在LCD1602上显示字符 'H'。
  • 该代码中的while(1)部分为空循环,即程序会一直执行该部分,直到程序被强制终止。

使用说明:

  1. 将该代码添加到您的STM32项目中。
  2. 修改代码中的LCD1602引脚定义,使其与您的电路连接方式一致。
  3. 编译并运行您的项目,您将在LCD1602上看到字符 'H' 被显示出来。

注意:

  • 该代码仅用于简单的字符显示功能,如果需要实现更复杂的功能,例如显示中文、设置背景颜色等,需要修改代码以满足您的需求。
  • 该代码假设您已经了解STM32的基本操作,并已经搭建了基本的开发环境。

原文地址: https://www.cveoy.top/t/topic/m0OJ 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录