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.

[参考译文] LCD 16x2接口出现故障?

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/593478/lcd-16x2-interface-failed

主题中讨论的其他器件:TM4C123TM4C123GH6PM

我尝试向 LCD 16x2发送一个字符、但它失败了。 未显示任何内容。 使用此代码、我可以通过 PIC 和8051微控制器连接 LCD。 我稍微更改了一些以适应 Tiva C Launchpad、但它不起作用。  
我使用引脚 B0-B7来传输数据。 A5-A6是 RS 和 E、RW 接地。 这是我的代码:

#include
#include
#include
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/gpio.h"

#define P0 GPIO_PIN_0
#define P1 GPIO_PIN_1
#define P2 GPIO_PIN_2
#define P3 GPIO_PIN_3
#define P4 GPIO_PIN_4
#define P5 GPIO_PIN_5
#define P6 GPIO_PIN_6
#define P7 GPIO_PIN_7

void delay_ms (int t)

SysCtlDelay (SysCtlClockGet ()/(3000/t));

void lcd_cmd (char cmd)

GPIOPinWrite (GPIO_Porta_base、P5、0);
GPIOPinWrite (GPIO_Porta_base、P6、1<<6);
GPIOPinWrite (GPIO_PORTB_BASE、P0|P1|P2|P3|P4|P5|P6|P7、cmd);
delay_ms (10);
GPIOPinWrite (GPIO_Porta_base、P6、0);
delay_ms (20);

void LCD_data (字符数据)

GPIOPinWrite (GPIO_Porta_base、P5、1<<5);
GPIOPinWrite (GPIO_Porta_base、P6、1<<6);
GPIOPinWrite (GPIO_PORTB_BASE、P0|P1|P2|P3|P4|P5|P6|P7、DATA);
delay_ms (10);
GPIOPinWrite (GPIO_Porta_base、P6、0);
delay_ms (20);

void LCD_WrStr (char *str)

while (* str)

lcd_data (*str);
STR++;

void SetCursor _LCD (unsigned char m、unsigned char n)//chinh vi tri con tro

如果(m=1)

LCD_cmd (0x80+n);
delay_ms (10);

其他

LCD_cmd (0xC0+n);
delay_ms (10);


void LCD_init (void)

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOA);
GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、P0|P1|P3|P4|P5|P6|P7);
GPIOPinTypeGPIOOutput (GPIO_Porta_base、P5|P6);
GPIOPinWrite (GPIO_Porta_base、P5、0);
GPIOPinWrite (GPIO_Porta_base、P6、0);
GPIOPinWrite (GPIO_PORTB_BASE、P0|P1|P2|P3|P4|P5|P6|P7、0);
// delay_ms (200);
// LCD_cmd (0x30);
// delay_ms (500);
// LCD_cmd (0x30);
// delay_ms (110);
// LCD_cmd (0x30);
// delay_ms (1000);
LCD_cmd (0x38);
delay_ms (1000);
LCD_cmd (0x0C);
delay_ms (1000);
LCD_cmd (0x06);
delay_ms (1000);
LCD_cmd (0x01);
delay_ms (1000);

int main (空)

SysCtlClockSet (SYSCTL_SYSDIV_5|SYSCTL_USE_PLL|SYSCTL_XTAL_16MHz|SYSCTL_OSC_MAIN);
lcd_init();
SetCursor LCD (1、0);
delay_ms (100);
LCD_DATA ('H');

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您能在 E 和 RS 引脚上看到时钟信号输出吗?
    您是否使用了与 SysCtlClockGet 兼容的 MCU? 请注意、此功能仅与 TM4C123芯片兼容。 此外、最好仅计算一次1ms 的延迟、而不是在每次调用时验证系统时钟。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    并非所有2x16特性 LCD 模块都(直接)接受3V3作为逻辑高电平输入。 (实际上、有这样的模块是为3V3输入"设计"的)
    这可能(单独)—也可能不会—解释您的失败。   不是8051和 (旧版) PIC 5V 输出电平器件?

    您是否看到显示屏的"dot field"? 您对 Vo 施加了什么电压? (您无法复制"过去"的成功设置和组件? 我们没有被告知这一点。)

    一如既往-是否所有连接都在 LCD 的边缘连接器和 MCU 之间进行了测试/验证? (即欧姆输出)

    最后-您没有提到您的 MCU 或电路板-这会证明很有帮助-是否不会?

    如果是 TM4C123 LPAD -可能存在(令人愉快) 0Ω Ω 电阻器-哪个(可能)会阻碍端口 B 的2个引脚?   (这是您为 LCD 数据选择的"非常"的端口!)

    请注意、"失败和/或不起作用"等描述在尝试提供帮助时提供的值很少(即无)。 (部分)需要详细信息。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用的是 tm4c123ghpm。 我知道 sysctldelay 函数需要3个周期、因此我为自己编写了 delay_ms 函数。 我想我会尝试使用 LED 检查 E 和 RS 引脚、就像您说的那样。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    我使用的是 tm4cghpm。 我可以在 LCD 上看到点字段、我正在使用 VBUS 引脚连接到 LCD、我知道 LCD 正在工作、并且我已经检查了很多次连接。 端口 B 是否有任何问题需要解决?
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    谢谢-谢谢。 您会注意到一个 MCU -但不会注意到您的电路板。 如果 Launchpad -电阻器 R9/10连接到 PD0/PD1。 (它们不会像我之前所担心的那样影响 Port_B。

    通过"查看点字段"、我们可以确保正确处理 LCD 的"Vo"引脚-问题很可能落在互连或时序方面。

    您应该能够编写短代码块、在2秒的间隔内将 Port_B 总线从"0xAA 切换为0x55"、这样您就可以监控 LCD 接头上交替出现的1s 或0s (安全)到达情况。 您可以使用 RS & E 执行相同的操作-选择代码、每切换@ 2Hz -足够慢、以便(甚至)粗 DVM 响应。 (如果您无法很好地使用更好的设备-同样、我们也没有被告知。)

    您没有提到您的 LCD 规格-某些字符模块将不会"看到"3V3为逻辑高电平。 (因为该电平低于5V 的70%!) 您的 LCD 规格是对该规格的判断/评判-除非您过去(成功)的 PIC MCU (也)运行@ 3V3级别。 (再次询问此问题-未回答)

    一如既往-在开始时、更多/更长的延迟不会受到影响。 稍后-工作后-您可以"微调"-太短的延迟将导致您(现在)注意到的确切问题。

    从我对您的代码的快速回顾中、一切都不会跳出来。    

    当您报告已移动此 LCD (现在是它的第三个家)时、您如何确保所有连接保持完好和稳定?   您最近检查过吗?   (客户经常告诉我们-所有的事情都被检查-几乎总是-我们(然后)发现这不真实-我们浪费的时间/旅行/沮丧要收费!)   "简单的事情太频繁了-被忽视了!"