This thread has been locked.

If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.

[参考译文] EK-TM4C123GXL:连接不带库的 HD44780 LCD

Guru**** 2443830 points


请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/628875/ek-tm4c123gxl-interfacing-with-hd44780-lcd-without-library

器件型号:EK-TM4C123GXL

这可能是一个长射,但我想我会给它一个射门。

基本上、我尝试手动获取1个字符、即使在通用20x4 LCD 屏幕上打印也是如此(专门购买 :https://www.adafruit.com/product/198)

我的代码是超级基本的、因为我基本上尝试用4位模式复制第42页上的"示例": https://cdn-shop.adafruit.com/datasheets/HD44780.pdf

下面是我的代码

:#include "tm4c123ghp6.h"
#define PORTB (*(volatile unsigned long *) 0x400050FC)
#define GPIO_PORTB_OUT (*(volatile unsigned long *) 0x400050FC)//位5-0
#define GPIO_PORTB_DIR_R (*(volatile unsigned long *) 0x40005400)
#define GPIO_PORTB_AFSEL_R (*(volatile unsigned long *) 0x40005420)
#define GPIO_PORTB_DEN_R (*(volatile unsigned long *) 0x4000551C)
#define GPIO_PORTB_AMSEL_R (*(volatile unsigned long *) 0x40005528)
#define GPIO_PORTB_PCTL_R (*(volatile unsigned long *) 0x4000552C)
#define GPIO_Porte _IN (*(volatile unsigned long *) 0x4002400C)//位1-0
#define SENSOR (*((volatile unsigned long *) 0x4002400C)

#define GPIO_PORT_DIR_R (*(volatile unsigned long *) 0x40024400)
#define GPIO_Porte _AFSEL_R (*(volatile unsigned long *) 0x40024420)
#define GPIO_Porte _DEN_R (*(volatile unsigned long *) 0x4002451C)
#define GPIO_Porte _AMSEL_R (*(volatile unsigned long *) 0x40024528)
#define GPIO_Porte _PCTL_R (*(volatile unsigned long *) 0x4002452C)
#define SYSCTL_RCGC2_R (*(volatile unsigned long *) 0x400FE108)
#define SYSCTL_RCGC2_GPIOE 0x00000010 //端口 E 时钟门控控制
#define SYSCTL_RCGC2_GPIOB 0x00000002 //端口 B 时钟门控控制


//假设连接 PB3-PB0 = D7-D4
// RS = PB4
// EN = PB5

//输入:delayMS 的 msec 数
//输出:none
void delayMS (unsigned long msec){
unsigned long count;
while (msec > 0){//在仍有 delayMS 时重复
计数= 16000;//大约1ms
while (count > 0){
count--;
} //此 while 循环大约需要3个周期
msec--;
}





}int main (void){
volatile unsigned long delay;
SYSCTL_RCGC2_R |= 0x12; // 1) B E
delay = SYSCTL_RCGC2_R; // 2)无需解锁
GPIO_PORTB_AMSEL_R &=~0x3F;// 3)禁用 PB5-0
GPIO_PORTB_PCTL_R 上的模拟功能&&~

~0x00FFFFFF;// 4)启用常规 GPIO GPIO_PORTB_DIR_R |= 0x3F;// 5) PB5_ORTB_R 上的输出
;// 0 GPIO_0 = 0xTB_R 0或 PBORSEL 上的0

while (1){

PORTB = 0x02;
delayMS (5);
PORTB = 0x12;//启用
delayMS (5);
PORTB = 0x02;//使能关闭

PORTB = 0x02;
delayMS (5);
PORTB = 0x12;//启用
delayMS (5);
PORTB = 0x02;//使能关闭

PORTB = 0x10;//启用
delayMS (5);
PORTB = 0x00;//使能关闭

PORTB = 0x10;//启用
delayMS (5);
PORTB = 0x00;//使能关闭

PORTB = 0x10;//启用
delayMS (5);
PORTB = 0x2E;
delayMS (5);
PORTB = 0x00;//使能关闭

PORTB = 0x10;//启用
delayMS (5);
PORTB = 0x26;
delayMS (5);
PORTB = 0x00;//使能关闭


PORTB = 0x10;//启用
delayMS (5);
PORTB = 0x34;
delayMS (5);
PORTB = 0x00;//使能关闭

PORTB = 0x10;//启用
delayMS (5);
PORTB = 0x38;
delayMS (5);
PORTB = 0x00;//使能关闭


PORTB = 0x00;
delayMS (5);
PORTB |= 0x00;
delayMS (5);
PORTB |= 0x00;



}


} 

它非常基本、因为我对使用 Tiva 板非常陌生。 我可以执行基本的 GPIO 操作、但没有什么花哨的东西。 我还意识到 HAL 库存在..但我只是尝试在调试器中按照这个"示例"代码发送准确的命令。 我没有 R/W连接,它接地。  Enable 是 PB5、 RS 是 PB4、是 DB7-DB4 PB3-0

我确信它已连接到试验电路板上。 但我确信我只是遗漏了一些明显的东西。 我阅读了数据表,根据我的理解,我需要将 enable high-->do command---> Turn enable off? 因此、我尝试使用较小的延迟。

有什么想法吗? 这可能不是合适的论坛、但我想我会给它一个机会。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    所有此类字符 LCD (和这些图形)都具有(要求)"初始化代码例程"。 如果您使用论坛的"搜索"框(在论坛页面顶部)并输入"HD44780"、您应该会找到我发布的几个帖子、其中显示了所需的初始化代码。

    我发现您的代码"未注释为意图!" ("启用打开/启用关闭"的重复"剪切/粘贴"未能描述每个呼叫的目标是什么"。)

    您的大部分代码都是"直接注册"、它绕过了"供应商 API 提供的极端价值"-增加了您的工作时间和工作量、并阻止了(潜在)此处"帮助者"的响应。

    您"必须"为"显示引脚"Vo"(通常为引脚3)提供适当的电压、以启用显示对比度。 在初始化后、这会得到适当调整、以便"像素字段"(所有像素都关闭)"几乎不可见"。

    虽然"4位模式"节省了4个 I/O -它会将您的时间/工作量增加一倍-并且远低于更标准的"8位模式"。 (在4位模式下、"E"上的单一干扰将中断 LCD 的所有后续事务-并且证明(非常)很难检测到...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    公司/I 正在"移动"我们的(外部)仓库-这必须是快速的。

    我强烈建议您添加4个端口引脚(以"一对一配置"(例如、(MCU) PX7 <-> DB7 (LCD)、(MCU) Px0 <-> DB0 (LCD)))中的8位总线)。 RS 和 E 都可能从第二个端口到达、您将 R/W 连接到 GND 是可以的。

    我记得、更简单的"8位初始化代码"是:0x38、0x38、0x06、0x0E、0x01 -所有这些代码之间都发送了"长"延迟(MS)。 (请参考我在此处剪切/粘贴的 HD44780规范、概述了所需的合规性。)

    请注意、所有"初始化"在"RS = 0"时发生-后跟一个适当宽度的"E"正脉冲。 所有显示命令还采用 RS=0 -字符/数据写入(单独)设置 RS=1。

    正如您所报告的、被称为"初始化"、"浮动 Vo 引脚"和(尤其是)" Devil" 4位模式"是"问题"的主要原因...
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    我将通过三电位计向 V0提供电压。 是的、我的代码是超级无注释的、因为我只是尝试使最基本的功能正常工作、而无需任何库进行学习。 我认为我对数据表进行了错误处理、并看到了示例代码。 但这可能不包括实际的初始化代码,因为我认为第41页上的示例代码也包括了这一点。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    如上所述、尤其是在"Devil/4位模式"下、您必须正确完成初始化! (我认为您提供的代码在这方面并不足够。)

    尽管"诱人"的意思是简单地"获取现有代码"-它是否"不起作用"-那么该怎么办? 如果您想超越(简单)"剪切/粘贴!"的范畴、您(现在)知道该去哪里?

    请允许我注意、(任何)"未注释的代码"(如您所述)很少被称为"超级工作/表现!"

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    是的、我这次将使用实际初始化代码重试、只是为了确保。 由于从技术上讲、这是一个5V LCD、不管怎样可能工作。 (我正在等待实际的3.3V LCD 屏幕发货)。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    [引用用户="Matt Smith29"]从技术上讲、这是一个5V LCD、无论怎样可能都无法正常工作。

    回顾 HD44780规格(或实际器件规格-如您的模块所用)将澄清 LCD 控制器是否将3V3信号电平视为"高电平"。

    4x20模块使您能够创建"2x 和4x"高度字符(通过战略性软件)、并证明比(更多使用的) 2x16更有用。   另外请注意、有(视觉上更令人兴奋的)"VFD"和"OLED"(也是4x20格式)、但它们的成本与"128x64图形 LCD "一样高。