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.

[参考译文] MSP430FR5739:16x2 LCD 连接问题

Guru**** 2465890 points


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

https://e2e.ti.com/support/microcontrollers/msp-low-power-microcontrollers-group/msp430/f/msp-low-power-microcontroller-forum/597024/msp430fr5739-16x2-lcd-interfacing-problem

器件型号:MSP430FR5739

硬件:-(MP430FR5739)(LCD:- 1602a)

软件: - CCS 7.1

 

问题:-

LCD 显示屏的一条(有时两条线路)线路显示黑盒-我为这一条线路感到苦恼。

 

我多次检查接线图与下图完全相同

P1.0 => P1.7  (D0至 D7数据线)

P2.2 =>启用

P2.1=> RS

V0 => POT 中间 (10K)

VSS 和 K =>接地

VDD 和 A =>+5V

 

此外、我尝试使用外部电源、但结果相同。

但是、我的仿真是可以正常工作的。

这是我的代码


#include "stdio.h"
#include "string.h"
#include "stdlib.h"
#define DELAY_VALUE 500
 
void send_cmd (unsigned char 命令)

 
 P1OUT &= 0x00;
 P2OUT &= 0x00;
 P1OUT =命令;
 P2OUT &= 0x00;
   P2OUT &=~BIT1;                       // RS = 0用于命令、P1.6 0x40
   //RW 接地
   P2OUT &=~BIT2;                       //EN = 0、P1.7、0x80
   _delay_cycles (delay_value);
   P2OUT |= BIT2;                       // EN = 1、P1.7、0x80
   _delay_cycles (delay_value);
   P2OUT &=~BIT2;                       //EN = 0、P1.7、0x80
   _delay_cycles (delay_value);
 


void send_char (无符号字符字符)

 P1OUT &= 0x00;
 P2OUT &= 0x00;
 P1OUT =字符;
 // P1OUT &= 0x00;
    P2OUT |= BIT1;                       // RS = 0用于命令、P1.6
  // RW 接地
    P2OUT &=~BIT2;                       //EN = 0、P1.7
    _delay_cycles (delay_value);
    P2OUT |= BIT2;                       // EN = 1、P1.7
    _delay_cycles (delay_value);
    P2OUT &=~BIT2;                       //EN = 0、P1.7
    _delay_cycles (delay_value);


void send_string (char *字符串)

unsigned char i=0;
 
 while (String[i]!='\0')
 {
 
 P1OUT &= 0x00;
 P2OUT &= 0x00;
 P1OUT =字符串[i];
 P2OUT |= BIT1;                       // RS = 0用于命令、P1.6
    // RW 接地
 P2OUT &=~BIT2;                       //EN = 0、P1.7
 _delay_cycles (delay_value);
 P2OUT |= BIT2;                       // EN = 1、P1.7
 _delay_cycles (delay_value);
 P2OUT &=~BIT2;                       //EN = 0、P1.7
 _delay_cycles (delay_value);
 if (i>=16)  //如果字符串中的字符数大于16,则会自动执行以下命令
 SEND_cmd (0x18); //将显示屏向右移动
 _DELAY_CYCLES (40000);  // 100毫秒延迟
 i++;
 }
 

 
void LCD_Init (void)

 SEND_cmd (0x38);  //将 LCD 配置为2行5x7矩阵
 _delay_cycles (delay_value);
 SEND_cmd (0x0E);  //display on、Cursor blink
 _delay_cycles (delay_value);
 SEND_cmd (0x06); //光标自动递增
 _delay_cycles (delay_value);
 SEND_cmd (0x01); //清除显示
 _delay_cycles (delay_value);
 

 
void main (void)

 WDTCTL = WDTPW + WDTHOLD;                //停止 WDT
 BCSCTL1 = CALBC1_1MHz;                   //设置 DCO
 DCOCTL = CALDCO_1MHz;
 BCSCTL2 &=~(DIVS_3);//此行 代码可确保 SMCLK 分频器为0、
  //因此我们有 SMCLK=DCO =1MHz (实际上、如果我们有一个/8分频器、它应该是 BCSCTL2 |= DIVS_3;)。
 
 
 P1DIR = 0xFF;//将 P1设为输出
 P2DIR = 0xFF;//使 P2作为输出
 

 P1SEL = 0; //这两个是"功能选择寄存器 PxSEL 和 PxSEL2"、
 P1SEL = 0;//如果两者都为零,则表示选择了简单的 I/O 功能。
 //P2SEL2 = 0;//如果两者都为零,则意味着选择了简单的 I/O 功能。
 
 
 
 P2DIR |= 0x01;                           //将 P1.0设置为输出方向
 P2REN |= 0x01;
 
 
  __DELAY_CYCLES (1500);//在电源电压上升至4.5V 后等待超过15ms
  SEND_cmd (0x30);
  _DELAY_CYCLES (400); //等待超过4.1ms
  SEND_cmd (0x30);
  __delay_cycles (100); //等待100us 以上,但__delay_cycles (1)将提供1ms
  SEND_cmd (0x30);
  _DELAY_CYCLES (100);
  send_cmd (0x02);//返回主页
  _DELAY_CYCLES (100);
 
 
 LCD_Init();// LCD 初始化
 
       
  while (1)
  {
 
  SEND_cmd (0x01); //清除显示
      _delay_cycles (delay_value);
      SEND_cmd (0x81); //清除显示
      _delay_cycles (delay_value);
      send_string ("Hello World");
      _delay_cycles (delay_value);
  SEND_cmd (0xC0); //清除显示
      _delay_cycles (delay_value);
      send_string ("     MSP430");
      _DELAY_CYCLES (1000000);
  }
 


我还尝试了一些其他代码。 但结果是相同的。

如果可以、请帮助我。

谢谢你。

祝你度过美好的一天!

 

  • 请注意,本文内容源自机器翻译,可能存在语法或其它翻译错误,仅供参考。如需获取准确内容,请参阅链接中的英语原文或自行翻译。
    P1.4连接到 NTC 电路、这可能会影响您的并行端口命令/写入。 黑色框表示 LCD 未初始化或对比度太高。 5V 电源轨应连接到引脚2 (Vdd)和15 (BLA)。 您应该确保所有时序遵循 LCD 模块规格、并使用逻辑分析仪/示波器屏幕截图来进一步调试您的问题。

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

    这似乎是一个时序问题、您尚未阅读数据表。

    您在写入字符时的延迟非常严重。 最短周期时间为1us,使用您选择的1MHz 时钟时,您无法更快地进行,因此这些 delay_cycles()调用只是浪费时间,没有任何作用。

    另一方面,LCD_init()中的延迟是不够的。 加电后必须等待至少15ms、然后发送函数集命令、等待至少4.1ms、再次发送、等待100us、再次发送。

    您仅发送函数集命令一次、在发送下一条命令之前仅等待500us。

    此外、虽然代码中的注释表明显示屏的 RW 引脚已接地、但您尚未在列出的连接中包含该引脚。