这几天一直在用周工的EASYARM2131调这块液晶,代码是原来在51用过的,移植上来的,感觉上没什么问题,用示波器测试电平也很好,液晶没有问题,在51上调出来正常,是ARM上的驱动电流不够,还是程序有问题,搞了好几天都没有结果,请高人指点,以下为我的代码。<br />#include "config.h"<br /><br />#ifndef __LCD12864_H <br />#define __LCD12864_H<br /><br />#define LCD_DI 1 << 8<br />#define LCD_RW 1 << 9<br />#define LCD_E 1 << 10<br />#define LCD_CSA 1 << 11<br />#define LCD_CSB 1 << 12<br />#define LCD_RST 1 << 13<br />#define LCD_BUSY 0x00000080<br />#define LCD_DAT 0xff<br /><br />#define LCD_ALL_DIR() IO0DIR = IO0DIR | (LCD_DI | <br /> LCD_RW | <br /> LCD_E | <br /> LCD_CSA | <br /> LCD_CSB | <br /> LCD_RST) <br /><br />#define LCD_ALL_CLR() IO0CLR = 0x00003fff <br /><br /> <br />#define DI_H() IO0SET = LCD_DI<br />#define DI_L() IO0CLR = LCD_DI<br />#define RW_H() IO0SET = LCD_RW<br />#define RW_L() IO0CLR = LCD_RW<br />#define E_H() IO0SET = LCD_E<br />#define E_L() IO0CLR = LCD_E<br />#define CSA_H() IO0SET = LCD_CSA <br />#define CSA_L() IO0CLR = LCD_CSA<br />#define CSB_H() IO0SET = LCD_CSB<br />#define CSB_L() IO0CLR = LCD_CSB<br />#define RST_H() IO0SET = LCD_RST<br />#define RST_L() IO0CLR = LCD_RST<br /> <br />extern void LCD_Init(void);<br />extern void LCD_CLR(uint8 dat);<br />extern void LCD_Delay(uint32 dly);<br />extern void SendData(uint8 data);<br />extern void Write_Cmd_L(uint8 cmd);<br />extern void Write_Cmd_R(uint8 cmd);<br />extern void Write_Dat_L(uint8 dat);<br />extern void Write_Dat_R(uint8 dat); <br />extern void write_data(uint8 xpos,uint8 ypos,uint8 lcddata);<br />extern void lcd_putchar8x8( uint8 x,uint8 y,uint8 ch );<br /><br />#endif<br />#include "config.h"<br />#include "zifu8_8.h"<br /><br />/*********LCD初始化*****************/<br />void LCD_Init(void)<br />{<br /> uint32 i;<br /> PINSEL0=0x00000000;<br /> LCD_ALL_DIR();<br /> LCD_ALL_CLR();<br /> RST_L(); <br /> for(i=0; i<10000; i++);<br /> RST_H(); <br /> for(i=0; i<10000; i++); <br /> CSA_H();<br /> CSB_H();<br /> LCD_Delay(30);<br /> Write_Cmd_L(0x3e); //关显示<br /> Write_Cmd_R(0x3e);<br /> Write_Cmd_L(0xc0); //起始行<br /> Write_Cmd_R(0xc0); <br /> Write_Cmd_L(0x3f); //开显示<br /> Write_Cmd_R(0x3f);<br /> LCD_CLR(0x00);<br /> LCD_Delay(2000);<br />}<br />/***********************************/<br />/***********************************/<br />void LCD_CLR(uint8 dat)<br />{ <br /> uint8 i,j,page;<br /> for( i = 0; i < 8; i++ )<br /> {<br /> page = i;<br /> page |= 0xb8;<br /> Write_Cmd_L( page );<br /> LCD_Delay(10);<br /> Write_Cmd_L( 0x40 );<br /> for( j = 0; j < 64; j++ ){<br /> Write_Dat_L(dat);<br /> LCD_Delay(10);}<br /> Write_Cmd_R( page );<br /> LCD_Delay(10);<br /> Write_Cmd_R( 0x40 );<br /> for( j = 0; j < 64; j++ ){<br /> Write_Dat_R(dat);<br /> LCD_Delay(10);}<br /> } <br />}<br /><br />/***********************************/<br /><br />/***********延时********************/<br />void LCD_Delay(uint32 dly)<br />{<br /> uint16 i;<br /> for(i=0;i<dly;i++); <br />}<br />/***********************************/<br /><br />/**********命令数据写出**************/<br />void SendData(uint8 dat)<br />{<br /> IO0CLR = 0xff; //先清零,在送数据<br /> IO0SET = dat&0xff;<br />}<br />/***********************************/<br /><br />/**********写左命令*****************/<br />void Write_Cmd_L(uint8 cmd)<br />{ <br /> uint32 bak;<br /> CSB_H();<br /> CSA_L();<br /> RW_H();<br /> DI_L();<br /> IO0DIR = 0x00003f00 ; <br /> LCD_Delay(10);<br /> do{<br /> E_H(); <br /> LCD_Delay(100);<br /> bak = IO0PIN;<br /> E_L();<br /> }while(bak&LCD_BUSY);<br /> IO0DIR = 0x00003fff;<br /> LCD_Delay(10);<br /> RW_L();<br /> LCD_Delay(10);<br /> SendData(cmd);<br /> LCD_Delay(100);<br /> E_H(); <br /> LCD_Delay(100);<br /> E_L(); <br />}<br />/************************************/<br /><br />/**********写右命令*****************/<br />void Write_Cmd_R(uint8 cmd)<br />{<br /> uint32 bak;<br /> CSB_L();<br /> CSA_H();<br /> RW_H();<br /> DI_L();<br /> IO0DIR = 0x00003f00 ;//定义数据口为输入方式<br /> LCD_Delay(10);<br /> do{<br /> E_H(); <br /> LCD_Delay(100);<br /> bak = IO0PIN;<br /> E_L();<br /> }while(bak&LCD_BUSY);<br /> IO0DIR = 0x00003fff;//定义数据口为输出方式<br /> LCD_Delay(10);<br /> RW_L();<br /> LCD_Delay(10);<br /> SendData(cmd);<br /> LCD_Delay(100);<br /> E_H(); <br /> LCD_Delay(100);<br /> E_L();<br />}<br />/************************************/<br /><br />/**********写左数据*****************/<br />void Write_Dat_L(uint8 dat)<br />{<br /> uint32 bak;<br /> CSB_H();<br /> CSA_L();<br /> RW_H();<br /> DI_L();<br /> IO0DIR = 0x00003f00 ;<br /> LCD_Delay(10);<br /> do{<br /> E_H(); <br /> LCD_Delay(100);<br /> bak = IO0PIN;<br /> E_L();<br /> }while(bak&LCD_BUSY);<br /> IO0DIR = 0x00003fff ;<br /> LCD_Delay(10);<br /> DI_H();<br /> LCD_Delay(10);<br /> RW_L();<br /> LCD_Delay(10);<br /> SendData(dat);<br /> RW_H();<br /> E_H(); <br /> LCD_Delay(100);<br /> E_L();<br />}<br />/************************************/<br /><br />/**********写右数据*****************/<br />void Write_Dat_R(uint8 dat)<br />{<br /> uint32 bak;<br /> CSB_L();<br /> CSA_H();<br /> RW_H();<br /> DI_L();<br /> IO0DIR = 0x00003f00 ;<br /> LCD_Delay(10);<br /> do{<br /> E_H(); <br /> LCD_Delay(100);<br /> bak = IO0PIN;<br /> E_L();<br /> }while(bak&LCD_BUSY);<br /> IO0DIR = 0x00003fff ;<br /> LCD_Delay(10);<br /> DI_H();<br /> LCD_Delay(10);<br /> RW_L();<br /> LCD_Delay(10);<br /> SendData(dat);<br /> LCD_Delay(100);<br /> E_H(); <br /> LCD_Delay(100);<br /> E_L();<br />}<br />/************************************/<br /><br />/************写数据*****************/<br />void write_data(uint8 xpos,uint8 ypos,uint8 lcddata)<br />{ if(xpos<128)<br /> {<br /> if( ( xpos & 0xc0 )== 0 )<br /> {<br /> Write_Cmd_L( 0xb8 | ypos ); //写页命令<br /> LCD_Delay(10);<br /> Write_Cmd_L( 0x40 | xpos); //写行命令<br /> LCD_Delay(10);<br /> Write_Dat_L( lcddata ); //写左边数据<br /> LCD_Delay(10); <br /> }<br /> else if( ( xpos & 0xc0 )== 0x40 )<br /> {<br /> Write_Cmd_R( 0xb8 | ypos ); <br /> LCD_Delay(10);<br /> Write_Cmd_R( 0x40 | xpos ); <br /> LCD_Delay(10);<br /> Write_Dat_R( lcddata );<br /> LCD_Delay(10);<br /> }<br /> } <br />}<br />/************************************/<br />/************显示一个字符************/<br />void lcd_putchar8x8( uint8 x,uint8 y,uint8 ch )<br />{<br /> uint8 i;<br /> for( i = 0; i < 8; i ++ )<br /> {<br /> write_data( x+i, y, zifu[(ch - 0x20)*8 + i] );<br /> LCD_Delay(10);<br /> } <br />}<br /> |
|