12864向大虾们求助!
我想实现在12864画任意点,可是读出的数据总是不对,明明只点亮一个点,画出的点多显示那么两三个点,关于12864读数据时要注意的两点:一是EN要先置低,二是读数据时要先假读一次,这两个地方我都注意了,可读出的数据还是不正确,请大虾们帮帮我!谢谢大家了。读数据及画点函数如下:
/*******************************************
函数名称:Read_Data
功 能:从液晶中读出数据
参 数:无
返回值:无
********************************************/
ucharRead_Data()
{
uchar lcdtemp = 0,lcddata = 0;
LCD_RS_L;
LCD_RW_H;
LCD_DataIn; //设置P4口为输入状态
do //判忙
{
LCD_EN_H;
_NOP();
_NOP();
lcdtemp = LCD2MCU_Data;
LCD_EN_L;
}
while(0x80==(lcdtemp & 0x80));
LCD_RS_H; //读数据:RS=0;RW=1
LCD_RW_H;
_NOP();
LCD_EN_L;
LCD_EN_H; //使能,读出数据
lcddata = LCD2MCU_Data;
delay_us(1);
LCD_EN_L;
delay_us(1);
return lcddata;
}
/*********************************************
函数名称:Lcd_Point
功 能:实现液晶屏上任意点(x,y)的绘画
参 数:x:横坐标(范围:0~127)
y:从坐标(范围:0~63)
color:是否点亮该点(1:点亮;0:不点亮)
返回值:无
**********************************************/
void Lcd_Point(uchar x,uchar y,uchar color)
{
uchar i,XAddr,YAddr,BitTemp,Data_H,Data_L;
XAddr = x/16; //确定x的区域(0~8)
YAddr = y%64;
BitTemp = x%16;
if(y > 31) //change:32->31
{
XAddr +=8;
YAddr -=32;
}
Write_Cmd(0x34);
for(i=0;i<2;i++)
{
Write_Cmd(0x80 + YAddr);
Write_Cmd(0x80 + XAddr);
Data_H = Read_Data();
Data_L = Read_Data();
}
if(color == 1)
{
if(BitTemp > 7)
{
Data_L |= (0x80>>(BitTemp-8));
}
else
{
Data_H |= (0x80>>(BitTemp));
}
}
else
{
} //最后打开图形显示功能
Write_Cmd(0x80 + YAddr);
Write_Cmd(0x80 + XAddr);
Write_Data(Data_H);
Write_Data(Data_L);
Write_Cmd(0x36);
}
单片机用的是MSP430f149,液晶控制IC是ST7920。 没办法,自己先顶一下了,静等高手出现··· 为了进一步确定是那个函数出了问题,小弟又把画点函数简化了一下,简化的画点函数不从12864读取数据(这样的画点函数限制很大,没什么太大价值),经测试能够实现在“任意点”处画点,因此问题应该出在读数据函数,哪位大虾有成功从12864读出数据的函数没,附上一二,借小弟参考下吧
程序如下:
/*********************************************
函数名称:Lcd_Point1(简化版)
功 能:实现液晶屏上任意点(x,y)的绘画
参 数:x:横坐标(范围:0~127)
y:从坐标(范围:0~63)
color:是否点亮该点(1:点亮;0:不点亮)
返回值:无
**********************************************/
void Lcd_Point1(uchar x,uchar y,uchar color)
{
uchar XAddr,YAddr,BitTemp,Data_H,Data_L;
XAddr = x/16; //确定x的区域(0~8)
YAddr = y%64;
BitTemp = x%16;
if(y > 31) //change:32->31
{
XAddr +=8;
YAddr -=32;
}
Write_Cmd(0x34);
Write_Cmd(0x80 + YAddr);
Write_Cmd(0x80 + XAddr);
if(color == 1)
{
if(BitTemp > 7)
{
Data_H = 0x00;
Data_L = (0x80>>(BitTemp-8));
}
else
{
Data_H = (0x80>>(BitTemp));
Data_L = 0x00;
}
}
else
{
}
Write_Cmd(0x80 + YAddr);
Write_Cmd(0x80 + XAddr);
Write_Data(Data_H);
Write_Data(Data_L);
Write_Cmd(0x36); //最后打开图形显示功能
}
希望大家帮我顶下吧 不知道你有没有看过这个帖子,http://www.ceet.hbnu.edu.cn/web/?action-viewthread-tid-7679里面介绍得很详细 我用来描过点,也是有你那种情况,不知道是不是我的硬件问题 回复【3楼】hck2llj 小猪
-----------------------------------------------------------------------
稍微看了下,这篇帖子不错!谢谢推荐!昨晚经过排查,终于能够成功的读出数据并画出点了,问题处在假读那块,只需将那块稍微修改一下即可
程序如下:
Write_Cmd(0x80 + YAddr);
Write_Cmd(0x80 + XAddr);
Read_Data(); //注意这块与源程序的区别
Data_H = Read_Data();
Data_L = Read_Data();
其实之前这样也试过,但不成功,估计是修改时不小心还修改了其他地方,不知你描点不成功是否也是这块的原因。这两次在430版块发帖都没什么人回,不知是430版块太冷清了,还是是我人品太差了./emotion/em123.gif
页:
[1]