LCD是st7920带字库的。
我的程序:
读数据:
uchar readdata()
{
uchar rv=0;
P0=0xff;
LCD_RS = 1;
LCD_RW = 1;
LCD_E=0;
delay1(10) //延时10微秒
LCD_E=1;
delay1(100); //延时100微秒
rv=P0;
LCD_E=0;
rv=Convert(rv); // P0口是反接的,所以写了个算法把顺序倒过来
return(rv);
}
画点的函数:
void drawpoint(uchar x,char y) //以左边界的中点为原点 y [-32,31] x[0,127]
{
uchar modx1,modx2;
uchar wr1=0,wr2=0;
modx1=x/16;
modx2=x%16;
WriteCommandLCD(0x34);
WriteCommandLCD(0x36);//打开绘图开关
if(y<0)
{
WriteCommandLCD(0x7f-y); //设置垂直坐标
WriteCommandLCD(0x88+modx1); //设置水平坐标
readdata();
wr1=readdata();
wr2=readdata();
//delay1(4);
WriteCommandLCD(0x7f-y); //设置垂直坐标
WriteCommandLCD(0x88+modx1); //设置水平坐标
if(modx2>8)
{
WriteDataLCD(wr1|0x00);
WriteDataLCD(wr2|(0x01<<(15-modx2)));
}
if(modx2<8)
{
WriteDataLCD(wr1|(0x01<<(7-modx2)));
WriteDataLCD(wr2|0x00);
}
}
if(y>=0)
{
WriteCommandLCD((0x80+31-y)); //设置垂直坐标
WriteCommandLCD(0x80+modx1); //设置水平坐标
readdata();
wr1=readdata();
wr2=readdata();
//delay1(4);
WriteCommandLCD((0x80+31-y)); //设置垂直坐标
WriteCommandLCD(0x80+modx1); //设置水平坐标
if(modx2>8)
{
WriteDataLCD(wr1|0x00);
WriteDataLCD(wr2|(0x01<<(15-modx2)));
}
if(modx2<8)
{
WriteDataLCD(wr1|(0x01<<(7-modx2)));
WriteDataLCD(wr2|0x00);
}
}
WriteCommandLCD(0x30);//返回基本指令集设定状态
}
uchar Convert(uchar In_Date)
{
uchar i, Out_Date = 0, temp = 0;
for(i=0; i<8; i++)
{
temp = (In_Date >> i) & 0x01;
Out_Date |= (temp << (7 - i));
}
return Out_Date;
}
下面三个函数应该没什么问题,也贴出来。
写指令:
void WriteCommandLCD(uchar Command)
{
LCD_E = 0;
LCD_RS = 0;
LCD_RW = 0;
LCD_Data = Convert(Command);
LCD_E = 1;
delay(1);
LCD_E = 0;
}
写数据:
void WriteDataLCD(uchar Data)
{
LCD_E = 0;
LCD_RS = 1;
LCD_RW = 0;
LCD_Data = Convert(Data);
LCD_E = 1;
delay(1);
LCD_E = 0;
}
初始化:
void LCDInit(void)
{
WriteCommandLCD(0x34);
delay(1);
WriteCommandLCD(0x30);
delay(1);
WriteCommandLCD(0x0c);
delay(1);
WriteCommandLCD(0x01);
delay(1);
}
调试的结果是,如果没有读数据这一步,12864可以正确在相应位置显示一个点,但是因为没有读数据,不能在同一个坐标下面重复画两个点。
如果加了读数据,无法正确显示一个点,而是16个点,即读出来的数据总是0xff。
看了N遍datasheet,改了各种延时,时序也变了好多种,老是出现同样的问题。
我的12864没有问题,而且我换了一个用,结果没变。
此帖出自
小平头技术问答
2.7920串行模式的数据传输方向是单向,顾不能串行读取数据
一周热门 更多>