12864液晶屏上笑脸显示疑问
时间:10-02
整理:3721RD
点击:
51单片机12864液晶屏显示代码如下,程序调试没问题了,但是有个疑问求高人解答,显示用户自定义字符中,LCD_WriteData(0);是什么意思?为什么写了两个同样的语句才能调试正常,写一个却显示不出笑脸?
请高手看完程序解答以下两个问题:1、LCD_WriteData(0);在这里是什么意思?
2、为什么重复写两次LCD_WriteData(0);语句,才能显示出笑脸
希望有人指点一下,感激不尽!
代码如下:
#include<reg52.h>
sbit RS=P2^4;
sbit RW=P2^5;
sbit EN=P2^6;
sbit PSB=P2^1;
sbit RST=P2^3;
#define DataPort P0
#define RS_CLR RS=0
#define RS_SET RS=1
#define RW_CLR RW=0
#define RW_SET RW=1
#define EN_CLR EN=0
#define EN_SET EN=1
unsigned char code SmileFace16x16[]={ //笑脸图片
0x0F,0xF0,0x10,0x08,0x20,0x04,0x40,0x02,0x9C,0x39,0xBE,0x7D,0x80,0x01,0x80,0x01,
0x80,0x01,0x88,0x11,0x84,0x21,0x43,0xC2,0x20,0x04,0x10,0x08,0x0F,0xF0,0x00,0x00,
};
void delayUS(unsigned char z)
{
while(--z);
}
void delayMS(unsigned char z)
{
while(z--)
{
delayUS(245);
delayUS(245);
}
}
void BF_Check()
{
RS_CLR;
RW_SET;
EN_SET;
DataPort=0xff;
while((DataPort&0x80)==0x80);
EN_CLR;
}
void LCD_WriteCmd(unsigned char Cmd)
{
BF_Check();
RS_CLR;
delayUS(5);
RW_CLR;
delayUS(5);
EN_SET;
delayUS(5);
DataPort=Cmd;
delayUS(5);
EN_CLR;
}
void LCD_WriteData(unsigned char Data)
{
BF_Check();
RS_SET;
delayUS(5);
RW_CLR;
delayUS(5);
EN_SET;
delayUS(5);
DataPort=Data;
delayUS(5);
EN_CLR;
}
void LCD_WriteString(unsigned char x,unsigned char y,unsigned char *String)
{
switch(y)
{
case 1: LCD_WriteCmd(0x80+x); break;
case 2: LCD_WriteCmd(0x90+x); break;
case 3: LCD_WriteCmd(0x88+x); break;
case 4: LCD_WriteCmd(0x98+x); break;
default: break;
}
while(*String!='\0')
{
LCD_WriteData(*String);
String++;
}
}
void Write_CGRAM() //写入自定义字符
{
static unsigned char i=0;
LCD_WriteCmd(0x40);
for(i=0;i<16;i++)
{
LCD_WriteData(SmileFace16x16[i*2]);
LCD_WriteData(SmileFace16x16[i*2+1]);
}
}
void Display_CGRAM(unsigned char x,unsigned char y) //显示用户自定义字符
{
switch(y)
{
case 1: LCD_WriteCmd(0x80+x); break;
case 2: LCD_WriteCmd(0x90+x); break;
case 3: LCD_WriteCmd(0x88+x); break;
case 4: LCD_WriteCmd(0x98+x); break;
default: break;
}
LCD_WriteData(0);
LCD_WriteData(0);
}
/*void CLR_Screen()
{
LCD_WriteCmd(0x01);
delayMS(5);
}*/
void LCD_Init()
{
PSB=1;
delayMS(5);
RST=1;
delayMS(5);
LCD_WriteCmd(0x30);
delayMS(5);
LCD_WriteCmd(0x0c);
delayMS(5);
LCD_WriteCmd(0x01);
delayMS(5);
LCD_WriteCmd(0x06);
delayMS(5);
}
void main()
{
// static unsigned char i=0;
LCD_Init();
Write_CGRAM();
while(1)
{
Display_CGRAM(0,1);
LCD_WriteString(1,1,"单片机");
LCD_WriteString(0,2,"abcdefg");
LCD_WriteString(0,3,"LCD12864点阵液晶");
LCD_WriteString(0,4,"2012,1,29");
while(1);
}
}

高手速速现身吧
LCD_WriteData(0); 写数据
两个LCD_WriteData(0);应该是以查码方式写的数据吧~~没查过两个0 是不是笑脸
void disply2(void)
{
uchar m;
uchar c,d;
c=0xBA;
d=0xC0;
write_com(0x90);//写屏的位置
for(m=0;m<8;m++)
{
write_dat(c); //查码的方式写汉字
write_dat(d);
delay_nms(10);
d++;
}
}
应该和我这个一样的吧
没明白
不懂
连续写2个字节0表示调用用户的在0x40处开始的自定义汉字(或者说自定义图标),,仔细看看手册吧,有4组编码的,00,02,04,06. ;如果你只是想显示一个笑脸,只要写入一字节的0x01,或者是1字节的0x02就可以了,
我还是没有明白
感谢分享,谢谢了
