应该是时序问题,传一个验证过的程序给你参考。程序中用NOP短延时你也可以去掉或加长延时测试。
void LCMInit(void) //LCM初始化
{
WriteCommandLCM(0x38,1); //显示模式设置,开始要求每次检测忙信号 设置8位格式,2行,5*7
WriteCommandLCM(0x3c,1); //显示模式设置,开始要求每次检测忙信号 设置8位格式,2行,5*10
//4 显示开/关控制 0 0 0 0 1 D C B D=0关显示 D=1开显示 C=0无光标 C=1有光标 B=0光标不闪烁 B=1光标闪烁
WriteCommandLCM(0x08,1); //显示关
WriteCommandLCM(0x06,1); //显示光标移动设置 不移位
WriteCommandLCM(0x0E,1); //显示开、有光标、光标不闪烁
WriteCommandLCM(0x01,1); //清除屏幕显示
}
//写数据
void WriteDataLCM(unsigned char WDLCM)
{
ReadStatusLCM(); //检测忙
LCM_Data = WDLCM;
LCM_RS = 1;
LCM_RW = 0;
LCM_E = 0;
_nop_();_nop_();_nop_();//延时
LCM_E = 1;
}
//写指令
void WriteCommandLCM(unsigned char WCLCM, bit BuysC) //BuysC为0时忽略忙检测
{
if (BuysC==1){ ReadStatusLCM();} //根据需要检测忙
LCM_Data = WCLCM;
LCM_RS = 0;
LCM_RW = 0;
LCM_E = 0;
_nop_();_nop_();_nop_();//延时
LCM_E = 1;
}
//读数据
unsigned char ReadDataLCM(void)
{
LCM_RS = 1;
LCM_RW = 1;
LCM_E = 0;
_nop_();_nop_();_nop_();//延时
LCM_E = 1;
return(LCM_Data);
}
unsigned char ReadStatusLCM(void)// 读状态
{
LCM_Data = 0xFF;
LCM_RS = 0;
LCM_RW = 1;
LCM_E = 0;
_nop_();_nop_();_nop_();//延时
LCM_E = 1;
while (LCM_Data & 0x80); //检测忙信号 忙时一直等待
return(LCM_Data);
}
//按指定位置显示一串字符
void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData)
{
unsigned char ListLength=0;
Y &= 0x1; //限制 X不能大于15
X &= 0xF; //限制 Y不能大于1
while (DData[ListLength]!=0) //若到达字串尾则退出
{
if (X <= 20) //X坐标应小于0xF
{
DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符
}
X++; ListLength++;
}
}
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
{
Y &= 0x1; //限制 X不能大于15
X &= 0xF; //限制 Y不能大于1
if (Y==1) { X |= 0x40; }//当要显示第二行时地址码+0x40;
X |= 0x80; // 算出指令码 写入显示地址时要求最高位D7恒定为高电平1
WriteCommandLCM(X, 0); //这里不检测忙信号,发送地址码 X值>=0x80
WriteDataLCM(DData);
}
//-----------------------------------------------------------------
//将8字节自定义字符的字模写到CGRAM中
void write_pic(unsigned char add, unsigned char *pic_num)
{
unsigned char i;
add=add<<3;
for(i=0;i<8;i++)
{
WriteCommandLCM(0x40|add+i,1); //D7D6=01 D5~D3显示自定义字符时的字符号 D2~D0行号
WriteDataLCM(*pic_num++);
}
ReadStatusLCM(); //检测忙或延时一段时间 此行一定要,否则执行完立即显示该字符时会不显示
} |