硬件:-(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);
}
}
我还尝试了一些其他代码。 但结果是相同的。
如果可以、请帮助我。
谢谢你。
祝你度过美好的一天!

