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.

[参考译文] 编译器/TM4C123GH6PZ:将 LCD 16x2与 TM4C123相连

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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/783029/compiler-tm4c123gh6pz-interfacing-lcd-16x2-with-tm4c123

器件型号:TM4C123GH6PZ

工具/软件:TI C/C++编译器

您好!

我尝试将16x2 LCD 与 Tiva 连接、在这里我尝试在 LCD 上发送字符串、我在4位模式下使用了 LCD。在我的硬件中、只有4位配置、所以我无法使用8位模式。 请帮助我解决这个4位模式问题。 我在 LCD 屏幕上看到了点、但没有显示任何光标/字符串。我使用 SysTick 中断来提供适当的延时时间。我检查了使用示波器触发的使能引脚、它正在正确触发。 我在许多关于 LCD 显示屏的论坛上都发了红、但仍然无法解决问题。 我不熟悉 Tiva,我希望这个论坛中的人能帮助我。

VSS 接地

VDD 连接到 POT

VEE 连接到+5V

RS 连接到端口 G 引脚4

RW 接地...

使能引脚连接到端口 G 引脚5

D0至 D4分别连接到端口 G 引脚0至引脚4

背光引脚也连接到+5V 和接地...

下面是我用于连接的代码

#include
#include
#include "inc/hw_i2c.h"
#include "inc/hw_memmap.h"
#include "inc/hw_types.h"
#include "driverlib/gpio.h"
#include "driverlib/i2c.h"
#include "driverlib/pin_map.h"
#include "driverlib/sysctl.h"
#include "driverlib/uart.h"
#include "driverlib/SysTick .h"
#include "inc/hw_NVIC.h"
#include "inc/hw_types.h"
#include "driverlib/pin_map.h"
#include "driverlib/interrupt.h"

volatile uint32_t msTicks = 0;
/
LCD 处于4位模式、因此它首先以2个 stroks 发送数据、然后是字符的较高4个半字节

(三 /

/

SysTick 中断功能

(二 /

空 SysTick 处理程序(空)

//
//更新 SysTick 中断计数器。
//
/* delay 中必需的递增计数器()*/
msTicks++;


空延迟(uint32_t dlyTicks)

uint32_t curTicks;

curTicks = msTicks;
while (msTicks - curTicks )< dlyTicks;

/

SysTick 中断结束

(二 /

void lcd_command (unsigned char cmd)

GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、cmd);//LCD 数据
延迟(1000);
//GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0、com);//LCD 模式
GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_4|GPIO_PIN_5、0x00);//make RS=0GPIO 引脚4、E=0 GPIO 引脚5
延迟(1000);
GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_4|GPIO_PIN_5、0x20);//make RS=0、E=1通过高电平到低电平脉冲启用 LCD
延迟(1000);
GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_4|GPIO_PIN_5、0x00);//make RS=0、E=0
延迟(1000);

void LCD_data (无符号字符数据)

GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、DATA);//LCD 数据
延迟(1000);
//GPIOPinWrite (GPIO_PORTD_base、GPIO_PIN_0、com);//LCD 模式
GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_4|GPIO_PIN_5、0x10);//make RS=1GPIO 引脚4、E=0 GPIO 引脚5
延迟(1000);
GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_4|GPIO_PIN_5、0x30);//make RS=1、E=1通过高电平到低电平脉冲启用 LCD
延迟(1000);
GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_4|GPIO_PIN_5、0x10);//make RS=1、E=0
延迟(1000);

void LCD_Init()

LCD_COMMAND (0x28);//4位模式 LCD、在5x7矩阵之间具有2行和字符形状。
延迟(500);//提供500ms 延迟
LCD_COMMAND (0x06);//显示打开、光标关闭/进入模式它告诉 LCD 我们将要使用。
延迟(500);//提供500ms 延迟
LCD_COMMAND (0x0E);//将光标显示在上,显示在上。
延迟(500);//提供500ms 延迟
LCD_COMMAND (0x0F);//将光标显示在上,显示在上。
延迟(500);//提供500ms 延迟
LCD_COMMAND (0x01);//清除屏幕
延迟(500);//提供500ms 延迟

void LCD_String_Display (无符号字符*str)

while (*str!='0')

lcd_data (*str);
STR++;

/

main 从这里开始

秘书长的报告 /

int main (空)

SysCtlClockSet (SYSCTL_SYSDIV_1|SYSCTL_USE_OSC |SYSCTAL_8MHZ|SYSCTL_OSC_MAIN);//8MHz 停止晶体器

SysCtlPeripheralEnable (SYSCTL_Periph_GPIOG);
while (!SysCtlPeripheralReady (SYSCTL_Periph_GPIOG));

GPIOPinTypeGPIOOutput (GPIO_PORTG_base、GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);
IntMasterEnable();//启用处理器中断。
SysTickPeriodSet (7997);//为 SysTick 计时器设置1ms 的周期。
SysTickIntEnable();//启用 SysTick 中断。
SysTickEnable();//启用 SysTick。 SysTickEnable();//启用 SysTick。
//GPIOPinTypeLCD (GPIO_PORTG_base、GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3|GPIO_PIN_4|GPIO_PIN_5);

LCD_Init();

while (1)

LCD_String_Display ("欢迎...");

/

main 的末尾

「香港 /

期待快速重播...

此致、

Alphy

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

    这更多的是 LCD 问题、而不是 TM4C 问题、因此我在知识方面不能提供大量的知识、但我注意到的一件事是:

    您正在使用此命令:

    LCD_COMMAND (0x28);//4位模式 LCD、在5x7矩阵之间具有2行和字符形状。

    因此、0x28是数据的全字节、而数据字节是8位。 换句话说、该命令是二进制的00101000b。

    但在 LCD 命令函数中、您需要执行以下操作:
    GPIOPinWrite (GPIO_PORTG_base、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、cmd);//LCD 数据

    因此、您仅从8个位中的4个发送数据、下半部分为1000b。 其他4个位、上半部分、将丢失。

    因此、我怀疑您的问题是、对于4位接口、您需要在 LCD 屏幕上查找如何拆分和发送字节、然后更新 LCD 命令函数以执行此操作。

    看看这是否能帮助您向前迈进、祝您好运!
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、先生、

    非常感谢您分享您的知识。 它帮助我考虑4位 、并帮助我解决我的问题。 该问题与4位数据传输和延迟有关。

    我更改了延迟并更改了前半部分发送 更高半字节的数据传输、并将使能引脚置为高电平和低  电平、后半部分发送低半字节、然后再次使能和禁用使能引脚。这些更改使我的代码正常工作。   

    再次感谢您的帮助。

    此致、

    Alphy