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.

[参考译文] CCS/SW-EK-TM4C1294XL:使用 TM4C 1294XL 在20x4 LCD 中显示值

Guru**** 2445440 points


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

https://e2e.ti.com/support/microcontrollers/arm-based-microcontrollers-group/arm-based-microcontrollers/f/arm-based-microcontrollers-forum/631032/ccs-sw-ek-tm4c1294xl-display-value-in-20x4-lcd-with-tm4c-1294xl

器件型号:SW-EK-TM4C1294XL

工具/软件:Code Composer Studio

我想将 QC2004A LCD 连接到 TM4C 1294XL。

以下是我的代码。 无错误。 但显示为空白。  

连接: RS-PB4、 EN-PB5、 D4-PE0、 D5-PE1、 D6-PE2、  D7-PE3、 VSS-GND、  VDD-5V、 VEE[PIN 3]-3.3V、  R/W-GND、   背光阳极- 3.3V。

请建议可能的解决方案/指出错误。

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

/*
#define function_set 0x28 //4bit_2LINE_5x7
#define SCLOG_RIGHT 0x1E
#define SCLO_LEFT 0x18
#define RETURE_HOME 0x02
#define increment_cursor 0x06
#define Decreation_Cursor 0x04
#define DisplayON_CursorON 0x0E //显示开-关控制
#define 闪烁_光标 0x0F
#define Invisible _ Cursor 0x0C
#define BLANK_DISPLAY 0x08
#define CLEAR_DISPLAY 0x01
#define SetCursorto1 0x80
#define SetCursorto2 0xC0
#define SetCursorto3 0x94
#define SetCursorto4 0xD4
*/
void Initialize_LCD (void);
void string_to_LCD (unsigned char *s);
void lcd_write (unsigned char、unsigned int);


void main ()
{
SysCtlClockFreqSet ((SYSCTL_XTAL_25MHz | SYSCTL_OSC_main | SYSCTL_USE_PLL | SYSCTL_CFG_VCO_480)、120000000);
SysCtlDelay (100000);//2ms
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOE);
SysCtlDelay (100000);
SysCtlPeripheralEnable (SYSCTL_Periph_GPIOB);
SysCtlDelay (100000);
GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3);
SysCtlDelay (100000);
GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、GPIO_PIN_4|GPIO_PIN_5);
SysCtlDelay (100000);

GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_0|GPIO_PIN_1|GPIO_PIN_2|GPIO_PIN_3、0x00);
SysCtlDelay (2000000);//20ms
initialize_lcd();
while (1){
LCD_WRITE (0X80、0);
string_to _LCD ("1234");
LCD_WRITE (0XC0、0);
string_to _LCD ("qwer");
LCD_WRITE (0X94、0);
String_TO_LCD ("ASDF");
LCD_WRITE (0XD4、0);
String_TO_LCD ("ZXCV");
SysCtlDelay (0XFFFFFF00);
}
}

void Initialize_LCD (void)
{
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、0);//RS 引脚低电平
SysCtlDelay (5000);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、0);//EN 引脚低电平
SysCtlDelay (5000);

LCD_WRITE (0x20、0);
SysCtlDelay (5000);
LCD_WRITE (0x08,0);
SysCtlDelay (5000);
LCD_WRITE (0x01、0);
SysCtlDelay (5000);
LCD_WRITE (0x06、0);
SysCtlDelay (5000);
LCD_WRITE (0x0E、0);
SysCtlDelay (5000);
LCD_WRITE (0X01、0);
SysCtlDelay (100000);
}

void LCD_WRITE (unsigned char data、unsigned int RS)
{
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、RS);//Cammand/Data

SysCtlDelay (5000);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、1);
SysCtlDelay (5000);
//GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_0、((DATA & 0x10)>>4);
//GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_1、((DATA & 0x20)>>5);
//GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_2、((DATA & 0x40)>>6);
//GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_3、((DATA & 0x80)>>7);
GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1_GPIO_PIN_0、((DATA & 0XF0>>4));
SysCtlDelay (5000);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、0);
SysCtlDelay (5000);

SysCtlDelay (5000);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、1);
SysCtlDelay (5000);
//GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_0、(DATA & 0x01));
//GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_1、((DATA & 0x02)>1));
//GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_2、((DATA & 0x04)>>2);
//GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_3、((DATA & 0x08)>>3);
GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1|GPIO_PIN_0、(DATA & 0x0F));
SysCtlDelay (5000);
GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、0);
SysCtlDelay (5000);
}

void string_to_LCD (unsigned char * s)
{
unsigned int slen;
slen=strlen;
while (slen>0)
{
unsigned char D=*s;
lcd_write (*s、1);
SysCtlDelay (0XFFFF0000);
slen--;
S++;
}
} 

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

    [引用 user="Krishnat Pawar"]请建议可能的解决方案/指出错误。

    这确实是一个任务列表-不是吗?

    通过选择"4位 LCD 模式"、您既不会(也不会)自己或您的帮助者。   4个 GPIO 的"节省"在更高的软件复杂性下实现-显示"稳健性!"损失   (因为对"E"的任何干扰都会导致液晶屏完全紊乱! (笑声) 即、双"半字节"传输序列将"未配对"。)

    您对该供应商最有用的 API 的了解需要进一步审查(尤其是 GPIO 读取/写入)。   以下是(仅一个)示例:

    [引用 USER="Krishnat Pawar"] GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、1);[/引用]

    虽然通常使用"1"来"设置位"、但在这里失败了!   您对 SW-DRL-User Guide 的评论表明、"第三个参数必须是目标位的"位打包/值"。"  (不是"1"-而是 GPIO_PIN_5的位打包值为32。  同样、"PIN_7为128、PIN_4为16、PIN_0为1。)

    当然还有更多的代码错误-但是您"放弃"四位 LCD 模式"所要求的不必要的复杂性至关重要!

    您对该论坛的搜索将显示我(多个)过去的帖子、其中一些包括"Grandfather LCD Control IC 的规格"、其中显示了复杂的初始化代码和时序。  (完全错误)会导致后续的所有努力。

    您会注意到 LCD 的对比度引脚设置为3V3 -尽管可能-在 GND 附近调整对比度引脚更为常见-请查看您的显示屏的数据表以了解具体细节。

    四位 LCD 模式(最适合)保留用于高容量应用-不能证明需要额外的"时间/注意"-以便保存4个 GPIO ...  (对于有限的卷使用...)

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

    您好 ,Krishnat,

     我认为最好的方法是在逻辑分析仪上检查是否所有信号都是针对 LCD 显示屏所要求的时序要求正确生成到 LCD 的。 检查液晶屏是否有正确的电源以及您是否正确操作信号。 下面是有关某人在 Raspberry Pi 中是如何完成该操作的参考。

    LCD 引脚 功能 PI 函数 PI 引脚
    01 GND GND P1-06
    02 +5V +5V P1-02
    03 对比度
    04 Rs GPIO7 P1-26.
    05 RW GND P1-06
    06 e GPIO8. P1-24.
    07 数据0
    08 数据1.
    09. 数据2.
    10. 数据3.
    11. 数据4. GPIO25 P1-22.
    12. 数据5. GPIO24 P1-18.
    13. 数据6. GPIO23 P1-16.
    14. 数据7. GPIO18 P1-12.
    15. 通过560欧姆实现+5V
    16. GND P1-06

    #!/usr/bin/python
    编号-------------------------------------------------------
    #______________#/___
    ______________#/,__//__///#/|/______
    
    ,/#
    //_______
    #
    lcd_16x2.py
    #带
    #背光控制和文本对齐
    的20x4 LCD 测试脚本#
    作者:Matt Hawkins
    #日期:2015年4月6日
    #
    www.raspberrypi-spy.co.uk
    #
    编号---
    
    #液晶屏的接线如下:
    # 1:GND
    # 2:5V
    # 3:对比度(0-5V)*
    # 4:RS (寄存器选择)
    # 5:R/W (读写) -接地此引脚
    #6:启用或选通
    #7:数据位0 -未使用
    #8:数据位1 -未使用
    #9:数据位2. -未使用
    #10:数据位3. -未使用
    # 11:数据位4
    # 12:数据位5
    # 13:数据位6
    # 14:数据位7
    # 15:LCD 背光+5V**
    # 16: LCD 背光 GND
    
    #import
    RPi.GPIO as GPIO
    import time
    
    # define GPIO to LCD mapping
    LCD_RS = 7
    LCD_E = 8
    LCD_D4 = 25
    LCD_D5 = 24
    LCD_D6 = 23
    LCD_D7 = 18
    LED_ON = 15
    
    #定义一些器件常量
    LCD_width = 20 #每行最大字符数
    LCD_CHR = True
    LCD_CMD = False
    
    LCD_LINE_1 = 0x80 #第一行的 LCD RAM 地址
    LCD_LINE_2 = 0xC0 #第二行的 LCD RAM 地址
    LCD_LINE_3 = 0x94 #第三行的 LCD RAM 地址
    LCD_LINE_4 = 0xD4 #第四行的 LCD RAM 地址
    
    #定时常数
    E_PULSE = 0.0005
    E_DELAY = 0.0005
    
    def main ():
    #主程序块
    
    GPIO.setmode(GPIO.BCM) #使用 BCM GPIO 编号
    GPIO.setup(LCD_E、GPIA.OUT)# E
    GPIO.setup(LCD_RS、GPIA.OUT)# RS
    GPIO.setup(LCD_D4、GPIA.OUT)# DB4
    GPIO.setup(LCD_D5、GPIA.OUT)# DB5
    GPIO.setup(LCD_D6、GPIA.OUT)# DB6
    GPIO.setup(LCD_D7、GPIA.OUT)# DB7
    GPIO.setup(LED_ON、GPIA.OUT)#
    
    
    初始化显示屏 LCD_背 光()
    
    #开-关-开-开-开(
    0.5)(
    
    
    
    
    
    
    真正 LCD_背 光(真正)时间(0.5)(真正 LCD_背 光)(真正睡眠(0.5)时间(真正的时间(0.5)(真正的 LCD_背 光)时间(真(真正的时间):0.5_背 光)时间(真正
    
    #发送一些居中测试
    LCD_string ("-------------------- "、LCD_LINE_1、2)
    LCD_string ("Rasbperry Pi "、LCD_LINE_2、2)
    LCD_string ("模型 B"、LCD_LINE_3、2)
    LCD_string ("-------------------- "、LCD_LINE_4、2)
    
    time.sleep (3)# 3秒延迟
    
    LCD_string ("RaspberryPi-Spy"、LCD_LINE_1、3)
    LCD_string (".co.uk",LCD_LINE_2,3)
    LCD_string ("、LCD_LINE_3、2)
    LCD_string ("20x4 LCD 模块测试"、LCD_LINE_4、2)
    
    time.Sleep (3)#20秒延迟
    
    #空白显示屏
    LCD_BYTE (0x01、LCD_CMD)
    
    time.sleep (3)# 3 second delay
    
    def LCD_init ():
    #初始化显示
    LCD_BYTE (0x33、LCD_CMD)# 110011初始化
    LCD_BYTE (0x32、LCD_CMD)# 110010初始化
    LCD_BYTE (0x06、LCD_CMD)# 000110光标移动方向
    LCD_BYTE (0x0C、LCD_CMD)# 001100 Display On、Cursor Off LCD_BYTE (0x06、LCD_CMD)
    
    
    # 000110 LCD_LEM (0x1000
    
    )、LCD_LENGTH (0x1000)# CMD)、CMD (0x00011 LCD_LCD_LEM (0x000D)、LCD_LENGTH (0x1000)#
    #向数据引脚发送字节
    #位=数据
    #模式=字符
    #为真 对于命令
    
    GPIO.output (LCD_RS、MODE)# RS
    
    #高位
    GPIO.output (LCD_D4、False)
    GPIO.output (LCD_D5、False)
    GPIO.output (LCD_D6、False)
    GPIO.output (LCD_D7、False)
    (如果 bits&0x10=0x10:
    GPIO.output (LCD_D4、True)
    如果 bits&0x20=0x20:
    GPIO.output (LCD_D5、True)
    如果 bits&0x40=0x40:
    GPIO.output (LCD_D6、True)
    如果 bits&0x80=0x80:
    GPIO.output (LCD_D7、True)
    
    #切换'Enable'引脚
    LCD_TOGGLE_ENABLE ()
    
    #低位
    GPIO.output (LCD_D4、False)
    GPIO.output (LCD_D5、False)
    GPIO.output (LCD_D6、False)
    GPIO.output (LCD_D7、False)
    if bits&0x01=0x01:
    GPIO.output (LCD_D4、True)
    如果 bits&0x02=0x02:
    GPIO.output (LCD_D5、True)
    如果 bits&0x04=0x04:
    GPIO.output (LCD_D6、True)
    如果 bits&0x08=0x08:
    gpio.output (LCD_D7、True)
    
    #切换'引脚
    LCD_TOGGLE_ENABLE ()
    
    def LCD_TOGGLE_ENABLE ():
    #切换启用
    时间。SLEEP (E_DELAY
    
    
    
    ) gpio.output (LCD_E、True) time.Sleep (E_PULSE) gpulse) gpio.output (E_PULSE、True) gpulse) gpio.output (E_PULSE、e=
    
    
    
    
    1、line style = 1、
    
    
    如果已对齐、则为1、#、1、1、表示为右行样式:1、则为1:1:1
    Message = message.lcust (lcd_width、")
    Elif style==2:
    message = message.center (lcd_width、")
    Elif style==3:
    对于
    
    
    
    I IN 范围(LCD_width)、message = message.rJust (LCD_width、") LCD_BYTE (line、LCD_CMD):
    LCD_BYTE (ord (message[i])、LCD_CHR)
    
    def LCD_backlight (flag):
    #如果
    
    
    __name__='_main__',则切换背光开-关-开 GPIO.output (LED_ON、flag):
    
    尝试:
    MAIN ()
    、KeyboardInterrupt 除外:
    最后通过
    :
    LCD_BYTE (0x01、LCD_CMD)
    LCD_string ("Goodbye!"、LCD_LINE_1、2)
    gpio.clean() 

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

    您好、Charles、

    看看这位(拉斯普)同事的"LCD Init"-我认为这不是正确的。   初始化不当-如上所述-完成所有后续工作。
    此外、"严重"对比度引脚电平(引脚3)"未指定!"   需要注意此类详细信息...  (在可疑情况下抛出所有内容...)

    4位模式下的"缺乏稳健性"几乎无法识别、但非常真实在您提供的示例中会采用这种方法。  如你所知-明显违反亲吻!   "节省4个 GPIO -有严重无序显示屏幕的风险"-证明"风险与回报"不能令人满意。

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    您好 CB1、
    感谢您捕获违规代码行(使用 GPIOPinWrite 在多个位置显示)和建议。
  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。

    您好、Charles、

    我认为,这种"违法行为守则"是在输入、"O.P.的守则"和"Rasp 的守则"的情况下发生的!     (请注意、Rasp "导管" 了(显示屏(关键)对比度引脚的必要电压电平设置!)

    并非所有代码-在网上找到"免费"-都保证"按需要运行..."

    您(必须)已经注意到(两者) o.p 和"Rasp"选择了要求更高、更复杂的"四位 LCD 模式!"   通过您演示"Rasp"代码(我认为不正确)、您认为"代码易用性和稳健性"应该以换取"节省4个 GPIO?"   

    我从未有过这样的建议...   KISS -即使这里被禁止-特别是这里被禁止-真正的规则!

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

    您好!

    感谢您的支持。

    连接: VSS[PIN-1]-GND、 VDD[PIN-1]-5V、 VEE[PIN 3]-可变 POT、RS[PIN 4]-PB4、 R/W[PIN 5]-GND、  EN[PIN 6]-PB5、 DB0-DB3- N.C.  D4-PE0、 D5-PE1、 D6-PE2、 D7-PE3、 A[PIN 15]-可变电位计、  A[PIN 16]-GND

    #include 
    #include 
    #include 
    #include "inc/hw_memmap.h"
    #include "inc/hw_types.h"
    #include "driverlib/debug.h"
    #include "driverlib/sysctl.h"
    #include "driverlib/gpio.h"
    
    
    void unsigned_lcd (void);
    void string_to_lcd (SysCtl);void LCD_sysCtl_sysbt (
    sb_sysbt
    
    
    
    
    );void (xtl
    (sb_sysbt);sb_sysbt (sbt)
    
    
    
    SysCtlDelay (100000);
    GPIOPinTypeGPIOOutput (GPIO_Porte _BASE、GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3);
    SysCtlDelay (100000);
    GPIOPinTypeGPIOOutput (GPIO_PORTB_BASE、 GPIO_PIN_4|GPIO_PIN_5);
    SysCtlDelay (100000);
    
    GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_0|GPIO_PIN_1_GPIO_PIN_2|GPIO_PIN_3、0x00);
    SysCtlDelay (2000000);//20ms
    Initialize_LCD ();
    
    
    
    LCD_WRITE (0X80、0);
    string_TO_LCD ("Hello");
    LCD_WRITE (0XC0、0);
    string_TO_LCD ("TI E2E 社区");
    LCD_WRITE (0X94、0);
    string_TO_LCD ("HI CB1 & Chars");
    LCD_WRITE (0XD4、0);
    string_TO_LCD ("谢谢!!!");
    
    
    
    
    
    
    初始化 SysCtlDelay (0XFFFFFF00);while (1){}void SysCtl_LCD (void)
    (void)(void SysCtlPintb
    Write (!!!!!);
    
    
    
    
    
    
    0x5000);GPIOPTLCD_PIN (0x5000);0x5000 (while (0xFFFF)/PIN (0x5000)、0xFFFF)、0x5000、0xFFFF、0xFF0、GPIOPTF (0xFF0)、0xFFFF;0xFF_PIN (0x5000、GPIOPTF (0xFFFF)、0x5000、GPIOPTF (LOBIN、0xFFFF)、0xFF0、0xFF
    
    LCD_WRITE (0x06、0);
    SysCtlDelay (5000);
    LCD_WRITE (0x0E、0);
    SysCtlDelay (5000);
    LCD_WRITE (0x28、0);
    SysCtlDelay (5000);
    LCD_WRITE (0X01、0);
    SysCtlDelay (10000000);
    }
    
    void LCD_WRITE (unsigned char 数据、unsigned int RS)
    {
    if (RS=0)
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_4、0xEF);// Camtb GPIOPIN_Write_4_BASE
    
    、GPIOP_ORTB 0xFF);//数据
    
    SysCtlDelay (5000);
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、0xFF);
    SysCtlDelay (5000);
    
    GPIOPinWrite (GPIO_Porte _BASE、GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1_GPIO_PIN_0、((DATA & 0XF0>>4));
    SysCtlDelay (5000);
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、0xDF);
    SysCtlDelay (5000);
    
    SysCtlDelay (5000);
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、0xFF);
    SysCtlDelay (5000);
    
    GPIOPinWrite (GPIO_Porte _BASE、 GPIO_PIN_3|GPIO_PIN_2|GPIO_PIN_1_GPIO_PIN_0、(数据和0x0F);
    SysCtlDelay (5000);
    GPIOPinWrite (GPIO_PORTB_BASE、GPIO_PIN_5、 0xdf);
    SysCtlDelay (5000);
    }
    
    void string_to_LCD (unsigned char * s)
    {
    unsigned int slen;
    slen=strlen (s);
    while (slen>0)
    {
    unsigned char D=*s;
    LCD_write (* s、1);
    SysCtlDelay (1000000);
    slen-;
    s++
    }
    
    } 

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

    超级喜欢!!!! *****

    这是一个非常有创意的感谢!!!

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

    因此、灵感源自一篇文章、要求"双倍!"  (供执行-尤其是您的照片!)   (我实际上想、"如果海报"展示了他的屏幕"(当我阅读你的显示信息时)、然后看到你、"这样做了!"

    ***类似***   

    ***类似***

    尽管如此-在显示业务方面(非常)成功- 所有八个数据位 (布线)都显示在您的精彩照片中!   (法律学校"证据培训")

    (我对您的4位初始化是否正确仍然不确定(甚至怀疑)-尽管您在第一个和第二个帖子之间进行了修改。)

    事实上、"E"上的任何干扰都将"把您的显示变成混乱"、作为" 4位模式的直接后果"、这会引入一个风险因素  (不能通过节省4个 GPIO 来适当地"奖励"!)   

    此外、每个字符的"写入(或读取)时间"会加倍!

    "帮助者"很少会得到奖励-您非常友好-并且富有想象力!   (切换到(正确) 8位模式会增加工作的稳健性...)