多看几遍12864的说明书DATASHEET,将引脚功能、数据、控制 代码记熟,先排除硬件问题。再仔细校对控制时序。
static void lcd12864_write_command(uint8 cmd)/*写命令*/
{
while(lcd12864_chek_busy());
LCD12864_RS = 0;
LCD12864_RW = 0;
LCD12864_EN = 0;
delay1us();
LCD12864_DATA = cmd;
delay50us();
LCD12864_EN = 1;
delay50us();
LCD12864_EN = 0;
return temp1;
}
// 描述: lcd12864写数据
// 参数: dat:写入的数据.
// 返回: none.
//========================================================================
static void lcd12864_write_data(uint8 dat)
{
while(lcd12864_chek_busy());
LCD12864_RS = 1;
LCD12864_RW = 0;
LCD12864_EN = 0;
LCD12864_DATA = dat;
delay50us();
LCD12864_EN = 1;
delay50us();
LCD12864_EN = 0;
}
//========================================================================
// 描述: lcd12864初始化
// 参数: none.
// 返回: none.
//========================================================================
void lcd12864_init()
{
//引脚配置
LCD12864_RS_OUT;
LCD12864_RW_OUT;
LCD12864_E_OUT;
LCD12864_RST_OUT;
LCD12864_DATA_OUT;
LCD12864_RST = 1;
LCD12864_RST = 0;
LCD12864_RST = 1; //复位RST=1
lcd12864_write_command(0x34); //34H--扩充指令操作
delay5us();
lcd12864_write_command(0x30); //功能设置,一次送8位数据,基本指令集
delay5us();
lcd12864_write_command(0x0C); //显示状态开关:整体显示开,光标显示关,光标显示反白关
delay5us();
lcd12864_write_command(0x01); //清DDRAM
delay5us();
lcd12864_write_command(0x02); //DDRAM地址归位
delay5us();
lcd12864_write_command(0x80); //设定DDRAM 7位地址000,0000到地址计数器AC
delay5us();
}
//========================================================================
// 描述: lcd12864设定显示位置
// 参数: X,Y:坐标.
// 返回: none.
//========================================================================
void lcd12864_display_pos(uint8 X,uint8 Y)
{
uint8 pos;
if (Y==0)
{Y=0x80;}
else if (Y==1)
{Y=0x90;}
else if (Y==2)
{Y=0x88;}
else if (Y==3)
{Y=0x98;}
pos = X+Y ;
lcd12864_write_command(pos); //显示地址
}
//========================================================================
// 描述: lcd12864清屏
// 参数: none.
// 返回: none.
//========================================================================
void lcd12864_clear()
{
lcd12864_write_command(0x30);//
lcd12864_write_command(0x01);//清除显示
delay(1);
}
//========================================================================
// 描述: lcd12864写单个字符
// 参数: X,Y;坐标; sig:要显示的字符.
// 返回: none.
//========================================================================
void lcd12864_show_char(uint8 X,uint8 Y,uint8 sig)
{
lcd12864_display_pos(X,Y);
lcd12864_write_data(sig); //输出单个字符
}
//========================================================================
// 描述: lcd12864写字符串
// 参数: X(0~3)行,Y(0~7)个字符; str:要显示的字符串;
// 返回: none.
//========================================================================
void lcd12864_show_string(uint8 X,uint8 Y,uint8 *str)
{
uint8 i = 0;
lcd12864_display_pos(X,Y);
while(str[i] != '\0')
{
lcd12864_write_data(str[i]);
i++;
}
}
//========================================================================
// 描述: lcd12864写数字()
// 参数: X(0~3)行,Y(0~7)个字符; num:要显示的数字;
// 返回: none.
//========================================================================
void lcd12864_show_num(uint8 x,uint8 y,int num)
{
char men[8];
char *str = men;
sprintf(str,"%d",num);
lcd12864_show_string(x,y,str);
}
//========================================================================
// 描述: lcd12864显示图像
// 参数: p:要显示的图像.
// 返回: none.
//========================================================================
void lcd12864_show_image(uint8 *p)
{
int ygroup,x,y,i;
int temp;
int tmp;
for(ygroup=0;ygroup<64;ygroup++) //写入液晶上半图象部分
{ //写入坐标
if(ygroup<32)
{
x=0x80;
y=ygroup+0x80;
}else
{
x=0x88;
y=ygroup-32+0x80;
}
lcd12864_write_command(0x34); //写入扩充指令命令
lcd12864_write_command(y); //写入y轴坐标
lcd12864_write_command(x); //写入x轴坐标
lcd12864_write_command(0x30); //写入基本指令命令
tmp=ygroup*16;
for(i=0;i<16;i++)
{
temp=p[tmp++];
lcd12864_write_data(temp);
}
}
lcd12864_write_command(0x34); //写入扩充指令命令
lcd12864_write_command(0x36); //显示图象
}
|