我的TI TM4C1294套件连接了20x4字符LCD,如下所示:
我写了这段代码是为了推动它:
#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}},0x80
,0xC0
,0x94
,分别为1到3行。当如图所示在两行上发送“Hello World”时,两个字符串显示在同一行上,其间具有随机字符。如果我在每次更改行地址的同时为一行尝试一个“Hello World”,它可以正常工作。没有正确处理线路的原因是什么?和这些随机字符有什么关系?
我怀疑: