- 實驗目的:
- 了解LCD1602的使用方法.
- 掌握編寫LCD1602顯示程式的方法.
- 實驗環境:
- 硬體:STM32F103C8T6核心闆,PC,USB線.
- 軟體:Windows10,STM32CubeIDE,HAL庫.
- 實驗原理:
- LCD1602可以顯示兩行,每行16個字元.
-
LCD1602一共有11根線用于與MCU通信,具體如下:
RS: 0–狀态/指令 1–資料
RW: 0–寫 1–讀
E: 0–使能 1–失能
D0-D7: 資料指令總線
-
LCD1602的基本操作可以分為以下4種:
讀狀态: 輸入RS=0, RW=1, E=0
讀資料: 輸入RS=1, RW=1, E=0
寫指令: 輸入RS=0, RW=0, E=0
寫資料: 輸入RS=1, RW=0, E=0
詳見LCD1602時序圖及其對照表.
//在這個實驗當中,我們隻需要配置E,RS,RW,D4-D7這7個引腳即可.
- 程式設計:
- 這裡我們選擇外部高速時鐘(HSE),需要在System Core中配置RCC;
-
配置GPIO引腳
E--------------------PB0
RS------------------PB1
RW-----------------PB2
D4------------------PB12
D5------------------PB13
D6------------------PB14
D7------------------PB15
- 配置SYS
STM32Cube配置LCD1602液晶屏 - 配置時鐘樹
STM32Cube配置LCD1602液晶屏 - 配置TIM1
STM32Cube配置LCD1602液晶屏 STM32Cube配置LCD1602液晶屏 - 生成代碼
- 編寫使用者代碼
- 編寫LCD1602驅動程式
-
檔案LCD1602.C
/*
LCD1602.C
*/
#include <lcd1602.h>
#include "stm32f1xx_hal.h"
/***********Define the LCD PINS below*********/
#define RS_Pin GPIO_PIN_1
#define RS_GPIO_Port GPIOB
#define RW_Pin GPIO_PIN_2
#define RW_GPIO_Port GPIOB
#define E_Pin GPIO_PIN_0
#define E_GPIO_Port GPIOB
#define D4_Pin GPIO_PIN_12
#define D4_GPIO_Port GPIOB
#define D5_Pin GPIO_PIN_13
#define D5_GPIO_Port GPIOB
#define D6_Pin GPIO_PIN_14
#define D6_GPIO_Port GPIOB
#define D7_Pin GPIO_PIN_15
#define D7_GPIO_Port GPIOB //��������
/********define the timer handler beloe**********/
#define timer htim1
extern TIM_HandleTypeDef timer;
void delay (uint16_t us)
{
__HAL_TIM_SET_COUNTER(&timer, 0);
while(__HAL_TIM_GET_COUNTER(&timer) < us);
}
/*************************************************/
void send_to_lcd (char data, int rs)
{
HAL_GPIO_WritePin(RS_GPIO_Port, RS_Pin, rs);
/*write the data to the respective pin*/
HAL_GPIO_WritePin(D7_GPIO_Port, D7_Pin, ((data>>3)&0x01));
HAL_GPIO_WritePin(D6_GPIO_Port, D6_Pin, ((data>>2)&0x01));
HAL_GPIO_WritePin(D5_GPIO_Port, D5_Pin, ((data>>1)&0x01));
HAL_GPIO_WritePin(D4_GPIO_Port, D4_Pin, ((data>>0)&0x01));
/*toggle EN PIN to send the data
*if the HCLK > 100HZ,use the 20us delay
*if LCD still doesn't work,increase the delay to 50, 80 or 100..
*/
HAL_GPIO_WritePin(E_GPIO_Port, E_Pin, 1);
delay (20);
HAL_GPIO_WritePin(E_GPIO_Port, E_Pin, 0);
delay (20);
}
void lcd_send_cmd (char cmd)
{
char datatosend;
/*send upper nibble first*/
datatosend = ((cmd>>4)&0x0f);
send_to_lcd(datatosend,0); //RS must be while sending command
/*send Lower Nibble*/
datatosend = ((cmd)&0x0f);
send_to_lcd(datatosend,0);
}
void lcd_send_data (char data)
{
char datatosend;
/*send upper nibble first*/
datatosend = ((data>>4)&0x0f);
send_to_lcd(datatosend, 1); //rs = 1 for sending data
/*send Lower Nibble*/
datatosend = ((data)&0x0f);
send_to_lcd(datatosend, 1);
}
void lcd_clear (void)
{
lcd_send_cmd(0x01);
HAL_Delay(2);
}
void lcd_put_cur(int row, int col)
{
switch (row)
{
case 0:
col |= 0x80;
break;
case 1:
col |=0xc0;
break;
}
lcd_send_cmd (col);
}
void lcd_init (void)
{
//4 bit initialisation
HAL_Delay(50); //wait for >40ms
lcd_send_cmd (0x30);
HAL_Delay(5); //wait for >4.1ms
lcd_send_cmd (0x30);
HAL_Delay(1); //wait for >100us
lcd_send_cmd (0x30);
HAL_Delay(10);
lcd_send_cmd (0x20); //4 bit mode
HAL_Delay(10);
//dislay initialisation
lcd_send_cmd (0x28); //function set -->DL=0 (4 bit mode), N = 1(2 lioe display) F = 0(5X8 characters)
HAL_Delay(1);
lcd_send_cmd (0x08);
HAL_Delay(1);
lcd_send_cmd (0x01);
HAL_Delay(1);
HAL_Delay(1);
lcd_send_cmd (0x06);
HAL_Delay(1);
lcd_send_cmd (0x0c);
}
void lcd_send_string (char *str)
{
while (*str) lcd_send_data (*str++);
}
-
檔案LCD1602.h
#ifndef INC__LCD1602_H_
#define INC__LCD1602_H_
void lcd_init(void); //initialize lcd
void lcd_send_cmd(char cmd); //send command to the lcd
void lcd_send_data(char data); //send data to the lcd
void lcd_send_string(char *str); //send string to the lcd
void lcd_put_cur(int row, int col); //put cursor at the entered position row (0 or 1), col (0-15)
void lcd_clear(void);
#endif /*INC_LCD1602_H_*/
在
main.c
中編寫簡單的使用者代碼
/* Private function prototypes -----------------------------------------------*/
void SystemClock_Config(void);
/* USER CODE BEGIN PFP */
int row=0;
int col=0;
/* USER CODE END PFP */
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_TIM1_Init();
/* USER CODE BEGIN 2 */
HAL_TIM_Base_Start(&htim1);
lcd_init ();
lcd_put_cur(0, 0);
lcd_send_string("HELLO ");
lcd_send_string("STM32 ");
lcd_send_string("CUBE");
lcd_put_cur(1,0);
lcd_send_string("hello ");
lcd_send_string("world");
HAL_Delay(3000);
lcd_clear();
/* USER CODE END 2 */
- 編譯并下載下傳;
- 實驗現象;
- LCD1602第一行顯示HELLO STM32 CUBE.
- LCD1602第二行顯示hello world.
以上就是全部内容,希望對同是STM32Cube小白的人有所幫助!!!