首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >STM32F103C8T6无法与HD44780通信

STM32F103C8T6无法与HD44780通信
EN

Stack Overflow用户
提问于 2019-09-30 17:22:00
回答 2查看 172关注 0票数 3

我试图用HD44780控制16X2液晶显示器(4位通信)使用STM32F103C8T6。我用这样的方式连接LCD:

RS => PA0 EN => PA2 RW地面 D7 => PB7 D6 => PB6 D5 => PB5 D4 => PB4

液晶显示器不显示任何东西。问题可能在哪里?有人知道这个问题吗?

这是我的代码:

代码语言:javascript
复制
#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
}
EN

回答 2

Stack Overflow用户

发布于 2019-11-26 09:51:53

另外,PA0和PA2不是5V容错引脚,通常HD44780是5V设备,如果它在+5V上运行,请参考表5中的数据表。“中等密度STM32F103xx引脚定义”,如果该引脚在I/O列级别上为5V,则应用FT表示!

票数 1
EN

Stack Overflow用户

发布于 2019-10-01 11:04:00

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

简而言之:您的lcd_command一个接一个地发送两个小块,但是您只需要为前几个命令发送一个咬口(因为显示控制器仍然处于8位模式)。您需要有一个单独的函数才能只发送一条信息。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58172516

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档