STM32F103C8T6无法与HD44780通信

问题描述 投票:0回答:2

我正在尝试控制 HD44780 16X2 LCD(4 位 通信)使用STM32F103C8T6。 我这样连接液晶屏:

RS => PA0

EN => PA2

RW 地面

D7 => PB7

D6 => PB6

D5 => PB5

D4 => PB4

液晶显示屏不显示任何内容。问题可能出在哪里?有谁知道这个问题吗?

这是我的代码:

#include "delay.h"
#include "stm32f10x.h" // Device header

void lcd_command(unsigned char command);
void lcd_init(void);
void lcdPosition(unsigned int row, unsigned int column);
void lcd_data(unsigned char data);

int main() {
  delay_init();
  RCC->APB2ENR |= 1 << 2; // Port A Enabled.
  RCC->APB2ENR |= 1 << 3; // Port B Enabled.

  GPIOA->CRL = 0x22222222; // A0 and A2 Output.
  GPIOB->CRL = 0x22222222; // B7,B6,B5,B4 Output.
  GPIOB->ODR = 0x00;       // Port B clear.

  delay_ms(20);
  lcd_command(0x30); // Datasheet says.
  delay_ms(5);
  lcd_command(0x30); // Datasheet says.
  delay_ms(1);
  lcd_command(0x30); // Datasheet says.
  delay_ms(1);
  lcd_init();
  lcdPosition(1, 1); // first row first column
  delay_ms(1);
  lcd_data('A'); // Letter A
  while (1)
    ;
}

void lcd_command(unsigned char command) {

  GPIOA->BRR |= 1 << 0; // RS reset.

  GPIOA->BSRR |= 1 << 2;   // E set.
  GPIOB->ODR = command;    // upper nibble
  delay_ms(2);             // delay
  GPIOA->BRR |= 1 << 2;    // E reset.
  GPIOB->BRR = 0x000000F0; // clear data bits
  delay_ms(2);             // delay

  command = command << 4; // lower nibble

  GPIOA->BSRR |= 1 << 2;   // E set.
  GPIOB->ODR = command;    // lower nibble
  delay_ms(2);             // delay
  GPIOA->BRR |= 1 << 2;    // E reset.
  GPIOB->BRR = 0x000000FF; // clear data bits
}
void lcd_init() {
  lcd_command(0x02); // Return
  delay_ms(2);       // delay
  lcd_command(0x28);
  set 4 - bit data, 2 - line, 5x7 font delay_ms(2); // delay
  lcd_command(0x0C);
  turn on display, cursor off.delay_ms(2); // delay
  lcd_command(0x01);                       // Clear.
  delay_ms(2);                             // delay
  lcd_command(0x06);
  move cursor right delay_ms(4); // delay
}
void lcdPosition(unsigned int row, unsigned int column) {
  if (row == 1) {
    column--;
    lcd_command(0x80 + column); // Define row

  } else if (row == 2) {
    column--;
    lcd_command(0xC0 + column); // Define column
  }
}

void lcd_data(unsigned char data) {
  GPIOA->BSRR |= 1 << 0; // RS reset.
  GPIOA->BSRR |= 1 << 2; // E set.
  GPIOB->ODR = data;
  upper nibble first delay_ms(4); // delay
  GPIOA->BRR |= 1 << 2;           // E reset.
  GPIOB->BRR = 0x000000F0;        // clear data bits
  delay_ms(4);                    // delay

  data = data << 4; // lower nibble

  GPIOA->BSRR |= 1 << 2;   // E set.
  GPIOB->ODR = data;       // lower nibble
  delay_ms(4);             // delay
  GPIOA->BRR |= 1 << 2;    // E reset.
  GPIOB->BRR = 0x000000FF; // clear data bits
}
stm32 communication keil lcd hd44780
2个回答
1
投票

PA0 和 PA2 也不是 5V 耐受引脚,通常 HD44780 是 5V 器件,如果它在 +5V 上运行,请参阅表 5 中的数据表。“中密度 STM32F103xx 引脚定义”,如果 I/ 列中的引脚是 5V 耐受的O水准应该用FT来表示!


0
投票

请仔细阅读第 46 页,图 24 的数据表中如何初始化 4 位接口。

简而言之:你的

lcd_command
接连发送两个半字节,但前几个命令只需要发送一个半字节(因为显示控制器仍处于8位模式)。您需要有一个单独的函数来仅发送一个半字节。

© www.soinside.com 2019 - 2024. All rights reserved.