将20x4字符LCD与TI TM4C1294连接会产生一些随机字符

时间:2017-08-31 09:41:07

标签: c embedded microcontroller lcd

我的TI TM4C1294套件连接了20x4字符LCD,如下所示:

  1. 数据总线到端口A.
  2. RS,RW和E引脚到端口L 0-2
  3. 我写了这段代码是为了推动它:

    #include <stdint.h>
    #include <stdbool.h>
    #include "inc/tm4c1294ncpdt.h"
    #include "driverlib/gpio.h"
    #include "driverlib/sysctl.h"
    
    void LCD_SendChar(short c)
    {
        GPIO_PORTA_AHB_DATA_R = c;
        GPIO_PORTL_DATA_R |= 0x01;
        GPIO_PORTL_DATA_R |= 0x04;
        // asm ("   NOP");
        SysCtlDelay(18);
        GPIO_PORTL_DATA_R &= ~(0x04);
        SysCtlDelay(10000);
    }
    
    void LCD_SendCmd(short command)
    {
        GPIO_PORTA_AHB_DATA_R = command;
        GPIO_PORTL_DATA_R |= 0x00;
        GPIO_PORTL_DATA_R |= 0x04;
        // asm ("   NOP");
        SysCtlDelay(18);
        GPIO_PORTL_DATA_R &= ~(0x04);
        SysCtlDelay(10000);
    }
    
    void LCD_SendString(char* value)
    {
        while(*value != 0)
        {
            LCD_SendChar(*value++);
        }
    }
    
    void LCD_Init()
    {
        LCD_SendCmd(0x01);
        LCD_SendCmd(0x38);
        LCD_SendCmd(0x0E);
        LCD_SendCmd(0x06);
        LCD_SendCmd(0x02);
    }
    
    int main(void)
    {
        // Enable clock gating control for GPIO A and L
        SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R10;
        SYSCTL_RCGCGPIO_R |= SYSCTL_RCGCGPIO_R0;
    
        // Wait until GPIO blocks are ready.
        while((SYSCTL_PRGPIO_R & SYSCTL_PRGPIO_R10) == 0);
        while((SYSCTL_PRGPIO_R & SYSCTL_PRGPIO_R0 ) == 0){};
    
        // Configure as Output, digital, no alternate or analog functions.
        GPIO_PORTA_AHB_DIR_R = 0xFF;
        GPIO_PORTA_AHB_DEN_R = 0xFF;
        GPIO_PORTA_AHB_AFSEL_R = 0x0;
        GPIO_PORTA_AHB_AMSEL_R = 0x0;
        GPIO_PORTA_AHB_PCTL_R  = 0x0;
    
        GPIO_PORTL_DIR_R = 0x7;
        GPIO_PORTL_DEN_R = 0x7;
        GPIO_PORTL_AFSEL_R = 0x0;
        GPIO_PORTL_AMSEL_R = 0x0;
        GPIO_PORTL_PCTL_R  = 0x0;
    
        GPIO_PORTL_DATA_R = 0x00;
        SysCtlDelay(2200000);
    
        LCD_Init();
    
        LCD_SendCmd(0x94);
        LCD_SendString("Hello World!");
        LCD_SendCmd(0xD4);
        LCD_SendString("Hello World!");
    
        while (1);
    
    }
    

    电路板以120MHz的速度运行。

    问题在于线路寻址。我发现20x4 LCD的线路寻址分别为{1}},0x800xC00x94,分别为1到3行。当如图所示在两行上发送“Hello World”时,两个字符串显示在同一行上,其间具有随机字符。如果我在每次更改行地址的同时为一行尝试一个“Hello World”,它可以正常工作。没有正确处理线路的原因是什么?和这些随机字符有什么关系?

    我怀疑:

    1. 为每个延迟功能提供的值不准确。
    2. 我已经读过,我必须检查液晶显示屏是否正忙,但我不明白它背后的机制。

0 个答案:

没有答案