打印
[ZLG-ARM]

ks0108 12864液晶驱动问题?

[复制链接]
2513|5
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
graby|  楼主 | 2008-3-21 13:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
   这几天一直在用周工的EASYARM2131调这块液晶,代码是原来在51用过的,移植上来的,感觉上没什么问题,用示波器测试电平也很好,液晶没有问题,在51上调出来正常,是ARM上的驱动电流不够,还是程序有问题,搞了好几天都没有结果,请高人指点,以下为我的代码。
#include "config.h"

#ifndef __LCD12864_H 
#define __LCD12864_H

#define      LCD_DI       1 << 8
#define      LCD_RW       1 << 9
#define      LCD_E        1 << 10
#define      LCD_CSA      1 << 11
#define      LCD_CSB      1 << 12
#define      LCD_RST      1 << 13
#define      LCD_BUSY     0x00000080
#define      LCD_DAT      0xff

#define      LCD_ALL_DIR()  IO0DIR = IO0DIR | (LCD_DI  |  
                                               LCD_RW  |  
                                               LCD_E   |  
                                               LCD_CSA |  
                                               LCD_CSB |  
                                               LCD_RST)   

#define      LCD_ALL_CLR()  IO0CLR = 0x00003fff  

                                            
#define     DI_H()         IO0SET = LCD_DI
#define     DI_L()         IO0CLR = LCD_DI
#define     RW_H()         IO0SET = LCD_RW
#define     RW_L()         IO0CLR = LCD_RW
#define     E_H()          IO0SET = LCD_E
#define     E_L()          IO0CLR = LCD_E
#define     CSA_H()        IO0SET = LCD_CSA     
#define     CSA_L()        IO0CLR = LCD_CSA
#define     CSB_H()        IO0SET = LCD_CSB
#define     CSB_L()        IO0CLR = LCD_CSB
#define     RST_H()        IO0SET = LCD_RST
#define     RST_L()        IO0CLR = LCD_RST
 
extern  void LCD_Init(void);
extern  void LCD_CLR(uint8 dat);
extern  void LCD_Delay(uint32 dly);
extern  void SendData(uint8 data);
extern  void Write_Cmd_L(uint8 cmd);
extern  void Write_Cmd_R(uint8 cmd);
extern  void Write_Dat_L(uint8 dat);
extern  void Write_Dat_R(uint8 dat); 
extern  void write_data(uint8 xpos,uint8 ypos,uint8 lcddata);
extern  void lcd_putchar8x8( uint8 x,uint8 y,uint8 ch );

#endif
#include "config.h"
#include "zifu8_8.h"

/*********LCD初始化*****************/
void LCD_Init(void)
{
 uint32 i;
 PINSEL0=0x00000000;
 LCD_ALL_DIR();
 LCD_ALL_CLR();
 RST_L();                
 for(i=0; i<10000; i++);
 RST_H();   
 for(i=0; i<10000; i++); 
 CSA_H();
 CSB_H();
 LCD_Delay(30);
 Write_Cmd_L(0x3e);     //关显示
 Write_Cmd_R(0x3e);
 Write_Cmd_L(0xc0);        //起始行
 Write_Cmd_R(0xc0);    
 Write_Cmd_L(0x3f);        //开显示
 Write_Cmd_R(0x3f);
 LCD_CLR(0x00);
 LCD_Delay(2000);
}
/***********************************/
/***********************************/
void LCD_CLR(uint8 dat)
{    
    uint8 i,j,page;
    for( i = 0; i < 8; i++ )
    {
        page = i;
        page |= 0xb8;
        Write_Cmd_L( page );
        LCD_Delay(10);
        Write_Cmd_L( 0x40 );
        for( j = 0; j < 64; j++ ){
        Write_Dat_L(dat);
        LCD_Delay(10);}
        Write_Cmd_R( page );
        LCD_Delay(10);
        Write_Cmd_R( 0x40 );
        for( j = 0; j < 64; j++ ){
        Write_Dat_R(dat);
        LCD_Delay(10);}
    }    
}

/***********************************/

/***********延时********************/
void LCD_Delay(uint32 dly)
{
 uint16 i;
 for(i=0;i<dly;i++); 
}
/***********************************/

/**********命令数据写出**************/
void SendData(uint8 dat)
{
 IO0CLR = 0xff; //先清零,在送数据
 IO0SET = dat&0xff;
}
/***********************************/

/**********写左命令*****************/
void Write_Cmd_L(uint8 cmd)

 uint32 bak;
 CSB_H();
 CSA_L();
 RW_H();
 DI_L();
 IO0DIR = 0x00003f00 ; 
 LCD_Delay(10);
 do{
 E_H(); 
 LCD_Delay(100);
 bak = IO0PIN;
 E_L();
 }while(bak&LCD_BUSY);
 IO0DIR = 0x00003fff;
 LCD_Delay(10);
 RW_L();
 LCD_Delay(10);
 SendData(cmd);
 LCD_Delay(100);
 E_H(); 
 LCD_Delay(100);
 E_L(); 
}
/************************************/

/**********写右命令*****************/
void Write_Cmd_R(uint8 cmd)
{
 uint32 bak;
 CSB_L();
 CSA_H();
 RW_H();
 DI_L();
 IO0DIR = 0x00003f00 ;//定义数据口为输入方式
 LCD_Delay(10);
 do{
 E_H(); 
 LCD_Delay(100);
 bak = IO0PIN;
 E_L();
 }while(bak&LCD_BUSY);
 IO0DIR = 0x00003fff;//定义数据口为输出方式
 LCD_Delay(10);
 RW_L();
 LCD_Delay(10);
 SendData(cmd);
 LCD_Delay(100);
 E_H(); 
 LCD_Delay(100);
 E_L();
}
/************************************/

/**********写左数据*****************/
void Write_Dat_L(uint8 dat)
{
 uint32 bak;
 CSB_H();
 CSA_L();
 RW_H();
 DI_L();
 IO0DIR = 0x00003f00 ;
 LCD_Delay(10);
 do{
 E_H(); 
 LCD_Delay(100);
 bak = IO0PIN;
 E_L();
 }while(bak&LCD_BUSY);
 IO0DIR = 0x00003fff ;
 LCD_Delay(10);
 DI_H();
 LCD_Delay(10);
 RW_L();
 LCD_Delay(10);
 SendData(dat);
 RW_H();
 E_H(); 
 LCD_Delay(100);
 E_L();
}
/************************************/

/**********写右数据*****************/
void Write_Dat_R(uint8 dat)
{
 uint32 bak;
 CSB_L();
 CSA_H();
 RW_H();
 DI_L();
 IO0DIR = 0x00003f00 ;
 LCD_Delay(10);
 do{
 E_H(); 
 LCD_Delay(100);
 bak = IO0PIN;
 E_L();
 }while(bak&LCD_BUSY);
 IO0DIR = 0x00003fff ;
 LCD_Delay(10);
 DI_H();
 LCD_Delay(10);
 RW_L();
 LCD_Delay(10);
 SendData(dat);
 LCD_Delay(100);
 E_H(); 
 LCD_Delay(100);
 E_L();
}
/************************************/

/************写数据*****************/
void write_data(uint8 xpos,uint8 ypos,uint8 lcddata)
{    if(xpos<128)
   {
    if( ( xpos & 0xc0 )== 0 )
    {
        Write_Cmd_L( 0xb8 | ypos );   //写页命令
        LCD_Delay(10);
        Write_Cmd_L( 0x40 | xpos);    //写行命令
        LCD_Delay(10);
        Write_Dat_L( lcddata );       //写左边数据
        LCD_Delay(10); 
    }
    else if( ( xpos & 0xc0 )== 0x40 )
    {
        Write_Cmd_R( 0xb8 | ypos );        
        LCD_Delay(10);
        Write_Cmd_R( 0x40 | xpos );                
        LCD_Delay(10);
        Write_Dat_R( lcddata );
        LCD_Delay(10);
    }
 }        
}
/************************************/
/************显示一个字符************/
void lcd_putchar8x8( uint8 x,uint8 y,uint8 ch )
{
    uint8 i;
    for( i = 0; i < 8; i ++ )
    {
        write_data( x+i, y, zifu[(ch - 0x20)*8 + i] );
        LCD_Delay(10);
    }     
}

相关帖子

沙发
zlgarm| | 2008-3-21 14:15 | 只看该作者

12864

graby 您好!
    在EasyARM2131开发板配套光盘中专门针对LCD12864的Demo程序路径为:EasyARM2131_V1.4下册实验例程第9章-ZLGGUI应用实例。
                         On duty zlgarm_lijintao

使用特权

评论回复
板凳
graby|  楼主 | 2008-3-22 10:16 | 只看该作者

ks0108

例程出来的程序,液晶也没有反应,所以怀疑的2131的驱动能力

使用特权

评论回复
地板
zlgarm| | 2008-3-24 15:29 | 只看该作者

LPC2131

graby  您好:
  
   LPC2131正常工作时,I/O口可以输入/输出4mA电流,驱动能力上应该没有问题。
   请看看您的程序,其它地方有没有对引脚连接设置过。
                                        on duty:zlgarm_zhanghuping
   

使用特权

评论回复
5
yuzhuju| | 2008-3-24 17:35 | 只看该作者

MCU的驱动肯定是没问题.

LCD DRIVER IC输入状态时,IO都是高阻抗,驱动怎么会有问题.

怀疑是2131的速度比较快.

你在每个写指令写数据的TIMING里面多加些DELAY.

使用特权

评论回复
6
silentband| | 2008-3-25 23:03 | 只看该作者

我也正在用LPC213x调试液晶,关注ing

原来51上的程序已经测试过,移植到arm上的确容易出问题
速度因素可能比较大,建议加delay~
再看看液晶手册及其厂家提供的例程,把读写时序再看看
一起讨论!silentband@163.com

使用特权

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

本版积分规则

24

主题

59

帖子

0

粉丝