我写的STM32 LCD库用不了
STM32 LCD Library Which Is Written By Me It Doesn't Work
我写了STM32f3xx的LDC驱动。接线正确,但 LCD 不工作。 LCD 仅显示白色方块,因此我认为数据引脚无法正常工作或存在逻辑错误。我使用 char 因为数据实际上是 1 个字节。
函数的任务如下:
fallingEdge()
: 发送到唤醒 LCD 的下降沿信号。
send4BitMode()
: LCD 工作在 4 位模式。所以首先,它会将 MSB(4) 位发送到 LCD。之后,我使用按位运算符右移 4 位,以便将 LSB(4) 位发送到 LCD。
sendCommand()
:此函数向 LCD 发送命令。 (两次)
sendCharacter()
: 此函数将字符发送到 LCD。 (两次)
这里是原型函数的lcd.h;
/*
* lcd.h
* Created on: 1 Ara 2020
* Author: fatay
*/
/*
* LCD Connection Pins for Using This Library
* DataPin1 -> RB1
* DataPin2 -> RB2
* DataPin3 -> RB3
* DataPin4 -> RB4
* EPin -> RB5
* RSPin -> RB6
*
*/
#ifndef INC_LCD_H_
#define INC_LCD_H_
#include <stdint.h>
#include "stm32f3xx.h"
#define DataPin1 1
#define DataPin2 2
#define DataPin3 3
#define DataPin4 4
#define EPin 5
#define RSPin 6
void clearLCD(void);
void setCursorToFirstLine(void);
void setCursorToSecondLine(void);
void initLCD(void);
void writeLCD(char str);
#endif /* INC_LCD_H_ */
这是 lcd.c 文件;
#include <stdlib.h>
#include "stm32f3xx_hal.h"
#include "lcd.h"
/*
* LCD Connection Pins for Using This Library
* DataPin1 -> RB1
* DataPin2 -> RB2
* DataPin3 -> RB3
* DataPin4 -> RB4
* EPin -> RB5
* RSPin -> RB6
*
*/
//for manipulating bits
#define SET_IF(expr) ((expr) ? GPIO_PIN_SET : GPIO_PIN_RESET)
/*
* We will be send falling edge signal
* for waking up an LCD. So function
* should be like this;
*
*/
static void fallingEdge(void)
{
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_RESET);
}
/*
* We send parallel 4 bit data in two times.
* We will be getting first four (LSB) bits and then
* the second one (MSB) bits.
*/
static void send4BitMode(char data)
{
HAL_GPIO_WritePin(GPIOB, DataPin4, SET_IF(data & 0x08));
HAL_GPIO_WritePin(GPIOB, DataPin3, SET_IF(data & 0x04));
HAL_GPIO_WritePin(GPIOB, DataPin2, SET_IF(data & 0x02));
HAL_GPIO_WritePin(GPIOB, DataPin1, SET_IF(data & 0x01));
fallingEdge();
HAL_Delay(1);
}
static void sendCommand(char command)
{
HAL_GPIO_WritePin(GPIOB, RSPin, GPIO_PIN_RESET);
send4BitMode(command >> 4);
send4BitMode(command);
}
static void sendCharacter(char character)
{
HAL_GPIO_WritePin(GPIOB, RSPin, GPIO_PIN_SET);
send4BitMode(character >> 4);
send4BitMode(character);
}
/*
*
* USER SCOPE
*
*/
void clearLCD(void) {
sendCommand(0x01);
}
void setCursorToFirstLine(void)
{
sendCommand((char) 0x80);
}
void setCursorToSecondLine(void)
{
sendCommand((char) 0x40);
}
void initLCD(void)
{
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, RSPin, GPIO_PIN_RESET);
sendCommand((char) 0x20 | 0x00 | 0x08);
HAL_Delay(5);
clearLCD();
setCursorToFirstLine();
HAL_Delay(500);
}
void writeLCD(char str)
{
sendCharacter(str);
}
感谢您的关注。
你有没有尝试过这样的事情:
static void send4BitMode(char data)
{
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_SET);
HAL_Delay(1);
// delay of 100 MicroSec on my side
HAL_GPIO_WritePin(GPIOB, DataPin4, SET_IF(data & 0x08));
HAL_GPIO_WritePin(GPIOB, DataPin3, SET_IF(data & 0x04));
HAL_GPIO_WritePin(GPIOB, DataPin2, SET_IF(data & 0x02));
HAL_GPIO_WritePin(GPIOB, DataPin1, SET_IF(data & 0x01));
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_RESET);
}
看看https://www.waveshare.com/datasheet/LCD_en_PDF/LCD1602.pdf
12. INITIALIZATION SEQUENCE,顺序为:
void initLCD(void)
{
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, RSPin, GPIO_PIN_RESET);
// The RW pin must be low
send4BitMode((char) 0x03);
// wait 4.1 ms
send4BitMode((char) 0x03);
// wait 100 us
send4BitMode((char) 0x03);
send4BitMode((char) 0x02); // set interface to 4 bit
sendCommand( 0x28 ); // 0x20: Function set, 0x08: 2 lines
...
}
我写了STM32f3xx的LDC驱动。接线正确,但 LCD 不工作。 LCD 仅显示白色方块,因此我认为数据引脚无法正常工作或存在逻辑错误。我使用 char 因为数据实际上是 1 个字节。
函数的任务如下:
fallingEdge()
: 发送到唤醒 LCD 的下降沿信号。send4BitMode()
: LCD 工作在 4 位模式。所以首先,它会将 MSB(4) 位发送到 LCD。之后,我使用按位运算符右移 4 位,以便将 LSB(4) 位发送到 LCD。sendCommand()
:此函数向 LCD 发送命令。 (两次)sendCharacter()
: 此函数将字符发送到 LCD。 (两次)
这里是原型函数的lcd.h;
/*
* lcd.h
* Created on: 1 Ara 2020
* Author: fatay
*/
/*
* LCD Connection Pins for Using This Library
* DataPin1 -> RB1
* DataPin2 -> RB2
* DataPin3 -> RB3
* DataPin4 -> RB4
* EPin -> RB5
* RSPin -> RB6
*
*/
#ifndef INC_LCD_H_
#define INC_LCD_H_
#include <stdint.h>
#include "stm32f3xx.h"
#define DataPin1 1
#define DataPin2 2
#define DataPin3 3
#define DataPin4 4
#define EPin 5
#define RSPin 6
void clearLCD(void);
void setCursorToFirstLine(void);
void setCursorToSecondLine(void);
void initLCD(void);
void writeLCD(char str);
#endif /* INC_LCD_H_ */
这是 lcd.c 文件;
#include <stdlib.h>
#include "stm32f3xx_hal.h"
#include "lcd.h"
/*
* LCD Connection Pins for Using This Library
* DataPin1 -> RB1
* DataPin2 -> RB2
* DataPin3 -> RB3
* DataPin4 -> RB4
* EPin -> RB5
* RSPin -> RB6
*
*/
//for manipulating bits
#define SET_IF(expr) ((expr) ? GPIO_PIN_SET : GPIO_PIN_RESET)
/*
* We will be send falling edge signal
* for waking up an LCD. So function
* should be like this;
*
*/
static void fallingEdge(void)
{
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_SET);
HAL_Delay(1);
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_RESET);
}
/*
* We send parallel 4 bit data in two times.
* We will be getting first four (LSB) bits and then
* the second one (MSB) bits.
*/
static void send4BitMode(char data)
{
HAL_GPIO_WritePin(GPIOB, DataPin4, SET_IF(data & 0x08));
HAL_GPIO_WritePin(GPIOB, DataPin3, SET_IF(data & 0x04));
HAL_GPIO_WritePin(GPIOB, DataPin2, SET_IF(data & 0x02));
HAL_GPIO_WritePin(GPIOB, DataPin1, SET_IF(data & 0x01));
fallingEdge();
HAL_Delay(1);
}
static void sendCommand(char command)
{
HAL_GPIO_WritePin(GPIOB, RSPin, GPIO_PIN_RESET);
send4BitMode(command >> 4);
send4BitMode(command);
}
static void sendCharacter(char character)
{
HAL_GPIO_WritePin(GPIOB, RSPin, GPIO_PIN_SET);
send4BitMode(character >> 4);
send4BitMode(character);
}
/*
*
* USER SCOPE
*
*/
void clearLCD(void) {
sendCommand(0x01);
}
void setCursorToFirstLine(void)
{
sendCommand((char) 0x80);
}
void setCursorToSecondLine(void)
{
sendCommand((char) 0x40);
}
void initLCD(void)
{
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, RSPin, GPIO_PIN_RESET);
sendCommand((char) 0x20 | 0x00 | 0x08);
HAL_Delay(5);
clearLCD();
setCursorToFirstLine();
HAL_Delay(500);
}
void writeLCD(char str)
{
sendCharacter(str);
}
感谢您的关注。
你有没有尝试过这样的事情:
static void send4BitMode(char data)
{
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_SET);
HAL_Delay(1);
// delay of 100 MicroSec on my side
HAL_GPIO_WritePin(GPIOB, DataPin4, SET_IF(data & 0x08));
HAL_GPIO_WritePin(GPIOB, DataPin3, SET_IF(data & 0x04));
HAL_GPIO_WritePin(GPIOB, DataPin2, SET_IF(data & 0x02));
HAL_GPIO_WritePin(GPIOB, DataPin1, SET_IF(data & 0x01));
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_RESET);
}
看看https://www.waveshare.com/datasheet/LCD_en_PDF/LCD1602.pdf 12. INITIALIZATION SEQUENCE,顺序为:
void initLCD(void)
{
HAL_GPIO_WritePin(GPIOB, EPin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, RSPin, GPIO_PIN_RESET);
// The RW pin must be low
send4BitMode((char) 0x03);
// wait 4.1 ms
send4BitMode((char) 0x03);
// wait 100 us
send4BitMode((char) 0x03);
send4BitMode((char) 0x02); // set interface to 4 bit
sendCommand( 0x28 ); // 0x20: Function set, 0x08: 2 lines
...
}