发新帖我要提问
12
返回列表
打印

请教12864液晶屏显示花屏的问题,急~~~~~~~~~

[复制链接]
楼主: alphal
手机看帖
扫描二维码
随时随地手机跟帖
21
zusen| | 2007-12-29 16:54 | 只看该作者 回帖奖励 |倒序浏览

还是将你的LCD驱动那部分的程序发上来吧,呵呵

使用特权

评论回复
22
孤星119| | 2007-12-29 17:12 | 只看该作者

多半是时序问题

使用特权

评论回复
23
huangqi412| | 2007-12-29 17:16 | 只看该作者

估计是时序问题,时序和指令间都延时多点试试

使用特权

评论回复
24
alphal|  楼主 | 2007-12-29 17:19 | 只看该作者

....代码,大家帮忙查查...先谢过了.

/*-------------------------------------------Includes-----------------------------------------*/
#include "sys_config.h"
#include "hw_config.h"
#include "hw_gpiodrv.h"

#ifdef    LCD
#include "font.h"

/*--------------------------------------------Macros------------------------------------------*/
    
/*-----------------------------------------Local types----------------------------------------*/
    
/*-------------------------------------Exported variables-------------------------------------*/    
volatile u1_t xdata ghwlcm_fontBuf[4][16];         //显示英文时存放ASCII,4行16列,显示中文时存放汉字内码,4行8列

/*---------------------------------------Local variables--------------------------------------*/
             void  hwlcm_LCMWriteCMD(u1_t CMD) ;
static void  _hwlcm_LCMWriteData(u1_t dat) ;
static void  _hwlcm_LCMWriteColAddr(u1_t addr)  ;
static u1_t  _hwlcm_DichotomyFindISN(u2_t dat) ; 


/*=====================================================================================
函数: hwlcm_LCMWriteCMD
功能: 写命令
参数: CMD:命令
返回: 无
备注:
创建: whs-07-11-23
修改:
========================================================================================*/
void hwlcm_LCMWriteCMD(u1_t CMD)                  //指令
{
    bool_t    __bea ;

    __bea = _testbit_(EA) ;
    hwgpio_ClearPin(LCDEN_PORT, LCDEN_PIN) ;
    _nop_() ;
    _nop_() ;
    hwgpio_ClearPin(LCDDI_PORT, LCDDI_PIN) ; 
    _nop_() ;
    _nop_() ;
    hwgpio_ClearPin(LCDCS_PORT, LCDCS_PIN) ; 
    _nop_() ;
    _nop_() ;
    hwgpio_WritePort(P0, CMD) ;
  _nop_();
  _nop_();
    _nop_() ;
     hwgpio_SetPin(LCDEN_PORT, LCDEN_PIN) ;
    _nop_() ;
    _nop_() ;
     hwgpio_SetPin(LCDCS_PORT, LCDCS_PIN) ;
    _nop_() ;
    _nop_() ;

    EA = __bea ;
}

/*=====================================================================================
函数: _hwlcm_LCMWriteData
功能: 写数据
参数: dat:数据
返回: 无
备注:
创建: whs-07-11-23
修改:
========================================================================================*/
static void _hwlcm_LCMWriteData(u1_t dat)
{    
    bool_t    __bea ;

    __bea = _testbit_(EA) ;                                                                                             //数据
    hwgpio_ClearPin(LCDEN_PORT, LCDEN_PIN) ;
    _nop_() ;
    _nop_() ;
    hwgpio_SetPin(LCDDI_PORT, LCDDI_PIN) ;
    _nop_() ;
    _nop_() ;
    hwgpio_ClearPin(LCDCS_PORT, LCDCS_PIN) ;
    _nop_() ;
    _nop_() ;
    hwgpio_WritePort(P0, dat) ;
  _nop_();
  _nop_();
    _nop_();
    hwgpio_SetPin(LCDEN_PORT, LCDEN_PIN) ;
    _nop_() ;
    _nop_() ;
    hwgpio_SetPin(LCDCS_PORT, LCDCS_PIN) ;
    _nop_() ;
    _nop_() ;

    EA = __bea ;
}

/*=====================================================================================
函数: _hwlcm_LCMWriteColAddr
功能: 写列地址
参数: addr:列地址
返回: 无
备注:
创建: whs-07-11-23
修改:
========================================================================================*/
static void _hwlcm_LCMWriteColAddr(u1_t addr)
{
  u1_t __temp;
    bool_t    __bea ;

    __bea = _testbit_(EA) ;

  __temp = addr + 2 ;
  hwlcm_LCMWriteCMD(__temp & 0x0f);
  hwlcm_LCMWriteCMD(((__temp & 0xf0) >> 4) | 0x10);

    EA = __bea ;
}

/*=====================================================================================
函数: _hwlcm_DichotomyFindISN
功能: 二分法查找查找数据(汉字内码)
参数: dat:待查数
返回: dat在数组(cSymbLattGB16)中位置
备注:
创建: whs-07-11-23
修改:
========================================================================================*/
static u1_t _hwlcm_DichotomyFindISN(u2_t dat)
{
  u2_t  __StationA, __StationB;
  u2_t  __TemData;
  u2_t    __StationMid;

  __StationA = 0;
  __StationB = AMOUNT_OF_CHINESE_FONT - 1;
    __StationMid = 0;
    __TemData = 0;

  while (__StationA <= __StationB)
  {
    __StationMid = (__StationA + __StationB) / 2;
    __TemData = cSymbLattGB16[__StationMid].Index.Index16;

    if (__TemData > dat)
    {
      __StationB = __StationMid - 1 ;
    }
    else
        { 
            if (__TemData < dat)
        {
          __StationA = __StationMid + 1 ;
        }
        else
        {
                return __StationMid    ;
        }
        }

  }
  return (0);
}

/*=====================================================================================
函数: hwlcm_RefreshDisplayRAM
功能: 显示ghwlcm_fontBuf的内容
参数: RefRow:待显示行
返回: 英文8*16点阵,中文16*16点阵
备注:
创建: whs-07-11-23
修改:
========================================================================================*/
void hwlcm_RefreshDisplayRAM(u1_t RefRow)
{
  volatile u1_t idata      __i;
    volatile u1_t idata    __j;
    volatile u1_t idata         __k;                               //行    列
  volatile u2_t idata     __TempPosit;
  volatile Uint2_u  idata    __tempISN;
    bool_t        __bea ;

    __bea = _testbit_(EA) ;
    __j = 0 ;
    __k = 0 ;
    __TempPosit     = 0 ;

    __i = RefRow ;
//for (__i=0; __i<4; __i++)
  {
    for (__j=0; __j<16; __j++)
    {
      //显示中文
      if (ghwlcm_fontBuf[__i][__j] > 0x7f)     //汉字内码头一个字节是大于0x7f
      {   
        __tempISN.U_2byte.Hbyte = ghwlcm_fontBuf[__i][__j];
        __tempISN.U_2byte.Lbyte = ghwlcm_fontBuf[__i][__j + 1];
        __TempPosit = _hwlcm_DichotomyFindISN(__tempISN.U_word);                //查找汉字内码对应的点阵数据地址

        hwlcm_LCMWriteCMD(LCM_PAGE|(__i * 2));             //第i*2页
                       
        _hwlcm_LCMWriteColAddr(__j * 8);                         //第_hwlcm_LCMWriteData
                       
        for (__k = 0; __k < 16; __k++)
        {
          _hwlcm_LCMWriteData(cSymbLattGB16[__TempPosit].Msk[__k]);
                    _nop_() ;
        }
        
        hwlcm_LCMWriteCMD(LCM_PAGE|(__i * 2 + 1));  
        _hwlcm_LCMWriteColAddr(__j * 8);
        
        for (__k = 16; __k < 32; __k++)
        {
          _hwlcm_LCMWriteData(cSymbLattGB16[__TempPosit].Msk[__k]);
                    _nop_() ;
        }   
           
        __j = __j + 1;
      }
      //显示英文
      else
      {   
        hwlcm_LCMWriteCMD(LCM_PAGE|(__i * 2));//第i*2页
        _hwlcm_LCMWriteColAddr(__j * 8);//第j*8列
        for (__k = 0; __k < 8; __k++)
        {
                _hwlcm_LCMWriteData(c_ASCII[ghwlcm_fontBuf][__i][__j] - ASCII_OFFSET_ADDRESS][__k]);
                    _nop_() ;
        }
        
        hwlcm_LCMWriteCMD(LCM_PAGE|(__i * 2 + 1));  
        _hwlcm_LCMWriteColAddr(__j * 8);        
        for (__k = 8; __k < 16; __k++)
        {
            _hwlcm_LCMWriteData(c_ASCII[ghwlcm_fontBuf][__i][__j] - ASCII_OFFSET_ADDRESS][__k]);
                        _nop_() ;
        }                
      }

            _nop_() ;
            _nop_() ;
            _nop_() ;
            _nop_() ;
            _nop_() ;
            _nop_() ;
            _nop_() ;
            _nop_() ;
    }
  }

    EA = __bea ;
}

#if 1
/*=====================================================================================
函数: hwlcm_DisplayFromMemo
功能: 读点阵数据显示
参数: pDataMem:点阵数据存储位置
            RowPlace:显示行位置
            ColsPalce:显示列位置
            DisType:显示类型,0:E文,1:中文
返回: 无
备注:
创建: whs-07-11-23
修改:
========================================================================================*/
//                                                                数据空间                行                            列                        E/汉字                            
void  hwlcm_DisplayFromMemo(u1_t *pDataMem, u1_t RowPlace, u1_t ColsPalce, u1_t DisType)                //行列位置
{
    u1_t __k;

    if(DisType)
    {//显示中文
        hwlcm_LCMWriteCMD(LCM_PAGE|(RowPlace * 2));             //第i*2页
                       
        _hwlcm_LCMWriteColAddr(ColsPalce * 8);                         //第_hwlcm_LCMWriteData
                       
        for (__k = 0; __k < 16; __k++)
        {
            _hwlcm_LCMWriteData(pDataMem[__k]);
        }
        
        if(DisType == 1)
        {//显示汉字后一半
            hwlcm_LCMWriteCMD(LCM_PAGE|(RowPlace * 2 + 1));  
            _hwlcm_LCMWriteColAddr(ColsPalce * 8);
            
            for (__k = 16; __k < 32; __k++)
            {
                _hwlcm_LCMWriteData(pDataMem[__k]);
            }
        }
    }
    else
    {//显示英文
     hwlcm_LCMWriteCMD(LCM_PAGE|(RowPlace * 2));//第i*2页
    _hwlcm_LCMWriteColAddr(ColsPalce * 8);//第j*8列
    for (__k = 0; __k < 8; __k++)
    {
            _hwlcm_LCMWriteData(pDataMem[__k]);
    }
    
    hwlcm_LCMWriteCMD(LCM_PAGE|(RowPlace * 2 + 1));  
    _hwlcm_LCMWriteColAddr(ColsPalce * 8);        
    for (__k = 8; __k < 16; __k++)
    {
        _hwlcm_LCMWriteData(pDataMem[__k]);
    }  
    }   
}
#endif
                                
/*=====================================================================================
函数: hwlcm_LCMInit
功能: 初始化
参数: 无
返回: 无
备注:
创建: whs-07-11-23
修改:
========================================================================================*/
void hwlcm_LCMInit(void)
{
    hwgpio_SetPin(LCDRST_PORT, LCDRST_PIN) ;    //不能clear了,就复位了。
    hwgpio_ClearPin(LCDEN_PORT, LCDEN_PIN) ;
    hwgpio_SetPin(LCDCS_PORT, LCDCS_PIN) ;
    hwgpio_ClearPin(LCDDI_PORT, LCDDI_PIN) ;

    memset(ghwlcm_fontBuf, ASCII_OFFSET_ADDRESS, sizeof(ghwlcm_fontBuf)) ;        //填充空格
}

/*=====================================================================================
函数: syslcm_LCMInit
功能: 初始化
参数: 无
返回: 无
备注:包括模式设置的初始化
创建: whs-07-11-23
修改:
========================================================================================*/
void syslcm_LCMInit(void)
{
    hwlcm_LCMInit() ;

    _timerlcm = LCMRESET_TIME ;

    hwlcm_LCMWriteCMD(LCM_RESET);         //复位      不能随便复位,一复位那些设置全没了。

  hwlcm_LCMWriteCMD(LCM_MAPPINGCONTROL);
  hwlcm_LCMWriteCMD(LCM_PUMPCONTROL);
  hwlcm_LCMWriteCMD(LCM_BAISRATIO);
  hwlcm_LCMWriteCMD(LCM_VP1);
  hwlcm_LCMWriteCMD(LCM_VP2);
  hwlcm_LCMWriteCMD(LCM_TC);
  hwlcm_LCMWriteCMD(LCM_RAMADDR);
  hwlcm_LCMWriteCMD(LCM_FRAMERATE);
  hwlcm_LCMWriteCMD(LCM_PANELLOADING);
  hwlcm_LCMWriteCMD(LCM_MA);

  hwlcm_LCMWriteCMD(LCM_COMMONDISP);            //0xa7为反色显示
  hwlcm_LCMWriteCMD(LCM_DISPWHITE);             //0xa5为全黑
  hwlcm_LCMWriteCMD(LCM_STARTLINE0);            //设起始行为0

    syslcm_SetLCMStartLine(0) ;
    syslcm_SetLCMDisplayType(0) ;
    hwlcm_LCMWriteCMD(LCM_DISPLAYON);             //开启LCM
}



使用特权

评论回复
25
OneMillion| | 2007-12-29 18:18 | 只看该作者

楼主,把电源电路贴上来吧,

 多半是电源的问题。

使用特权

评论回复
26
谈的元| | 2007-12-29 19:27 | 只看该作者

呵呵,花屏后能否自动恢复正常显示?

没改变内容的地方也要刷新。

使用特权

评论回复
27
icecut| | 2007-12-29 19:39 | 只看该作者

把好的LCD换到坏的板子上,测试一下LCD的质量

还是速度问题。用示波器测波形吧。

使用特权

评论回复
28
499734424| | 2014-1-6 10:52 | 只看该作者

也碰到显示一段时间,然后错位的问题

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则