zhechong 发表于 2011-8-8 19:36:02

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。

zhechong 发表于 2011-8-8 19:54:27

没办法,自己先顶一下了,静等高手出现···

zhechong 发表于 2011-8-8 20:47:05

为了进一步确定是那个函数出了问题,小弟又把画点函数简化了一下,简化的画点函数不从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);      //最后打开图形显示功能
}
希望大家帮我顶下吧

hck2llj 发表于 2011-8-8 23:07:07

不知道你有没有看过这个帖子,http://www.ceet.hbnu.edu.cn/web/?action-viewthread-tid-7679里面介绍得很详细

hck2llj 发表于 2011-8-8 23:08:07

我用来描过点,也是有你那种情况,不知道是不是我的硬件问题

zhechong 发表于 2011-8-9 15:43:50

回复【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]
查看完整版本: 12864向大虾们求助!