最近在EASY2200上调液晶,用自带得液晶跑得通,项目需要,换了款基于1335控制器得液晶,用得是总线方式,调了好久也没弄通,程序如下:<br />程序说明:程序中有些中间调试过程,看了不少帖子,说是加延时或读忙状态,都还是不行<br /><br />其中BCFG3 = 0x1000FFEF都不行<br /><br />还有个很奇怪得问题:把CS直接接地,液晶就能初始化成功,但显示得乱七八糟得,想想可能和RAM访问有关(程序在RAM中运行得)<br />还有接线得时候偷懒了一下,直接就基本上接在以前得液晶接口上得,只是调节了一下线得位置,兼容性好像还不赖<br /><br />各位帮帮忙哈~~~~~<br /><br />#include "config.h"<br /><br />TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8]; // 声明GUI显示缓冲区<br /><br />/* 定义LCM地址 */<br />#define TG240128_COM (*((volatile unsigned short *) 0x83000002))<br />#define TG240128_DAT (*((volatile unsigned short *) 0x83000000))<br /><br /><br />#define Busy 0x40<br /><br /><br />#define Wait_For_Busy() while (LCD_ReadState()& Busy);<br />#define delay(x) {unsigned char i=x; while(i--);}<br />/**********************************************************************<br />* 名称:LCD_ReadState()<br />* 功能:读取状态字子程序。<br />* 入口参数:无<br />* 出口参数:返回值即为读出的状态字<br />* 说明:函数会设置LCD数据总线为输入方式<br />***********************************************************************/<br />#define LCD_ReadState() TG240128_COM<br />/**********************************************************************<br />* 名称:LCD_WriteCommand()<br />* 功能:写命令子程序。(发送命令前,不检查液晶模块的状态)<br />* 入口参数:command 要写入LCD的命令字<br />* 出口参数:无<br />* 说明:函数会设置LCD数据总线为输出方式<br />***********************************************************************/<br />#define LCD_WriteCommand(command) {/*Wait_For_Busy();*/TG240128_COM = (unsigned short)(command);/* delay(15);*/ }<br />/**********************************************************************<br />* 名称:LCD_WriteData()<br />* 功能:写数据子程序。(发送数据前,不检查液晶模块的状态)<br />* 入口参数:dat 要写入LCD的数据<br />* 出口参数:无<br />* 说明:函数会设置LCD数据总线为输出方式<br />***********************************************************************/<br />#define LCD_WriteData(dat) {/*Wait_For_Busy();*/TG240128_DAT = (unsigned short)(dat);/*delay(100);*/}<br /><br /><br />/* SED1335 命令定义 */<br />#define LCD_SYS_SET 0x40 /* 初始化,显示窗口设置 参数8个 */<br />#define LCD_SLEEP_IN 0x53 /* 空闲操作 参数0个 */<br /><br />#define LCD_DIS_ON 0x59 /* 显示开 参数1个 */<br />#define LCD_DIS_OFF 0x58 /* 显示关 参数1个 */<br />#define LCD_SCR_OLL 0x44 /* 设置显示区域,卷动 参数10个 */<br />#define LCD_CSR_FOM 0x5D /* 设置光标形状 参数2个 */<br />#define LCD_CGR_ADD 0x50 /* 设置CGRAM起始地址 参数2个 */<br />#define LCD_CSR_DIR 0x4C /* 设置光标移动方向 参数0个 */<br />#define LCD_DOT_DIR 0x5A /* 设置点单元卷动位置 参数1个 */<br />#define LCD_DIS_OVR 0x5B /* 设置合成显示方式 参数1个 */<br /><br />#define LCD_CSR_WR 0x46 /* 设置光标位置 参数2个 */<br />#define LCD_CSR_RD 0x47 /* 读出光标位置 参数2个 */<br /><br />#define LCD_MEM_WR 0x42 /* 写入显示缓冲区 */<br />#define LCD_MEM_RD 0x43 /* 从显示缓冲区读出 */<br /><br />#define GET_LOW_BYTE(DAT) ((unsigned short)((DAT)&0xff)) /*取DAT的低8位*/<br />#define GET_HIG_BYTE(DAT) ((unsigned short)((DAT)>>8)) /*取DAT的高8位*/<br /><br />unsigned char DCB_HEX_TAB[8] = {0x80, 0x40, 0x20, 0x10, 0x08,0x04, 0x02, 0x01};<br />unsigned char SYS_INIT_DAT[8] = {0x30, 0x87, 0x07, 0x27, 0x42,0xef, 0x28, 0x00};//{0x30, 0x87, 0x07, 0x27, 0x2F,0xef, 0x28, 0x00};<br />unsigned char SCROLL_DAT[10] = {0x00, 0x00, 0xf0, 0x80, 0x25, 0xF0, 0x80, 0x50,0x00,0x60};//{0x00, 0x00, 0xF0, 0xb0, 0x04, 0xf0, 0x80, 0x50,0x00,0x60};<br /><br />/****************************************************************************<br />* 名称:DelayNS()<br />* 功能:长软件延时<br />* 入口参数:dly 延时参数,值越大,延时越久<br />* 出口参数:无<br />****************************************************************************/<br />void DelayS(uint16 dly)<br />{ uint32 ii;<br /> for(ii=0; ii<dly; ii++);<br />}<br /><br />void GUI_Initialize(void)<br />{ <br /> unsigned char i;<br /> LCD_WriteCommand(LCD_SYS_SET); // <br /> DelayS(15);<br /> for(i=0 ; i < 8 ; i++)<br /> {LCD_WriteData(SYS_INIT_DAT);<br /> DelayS(15);<br /> }<br /><br /> LCD_WriteCommand(LCD_SCR_OLL); DelayS(15); // <br /> for(i=0 ; i < 10 ; i++)<br /> {LCD_WriteData(SCROLL_DAT);DelayS(15);}<br /> <br /> LCD_WriteCommand(LCD_DOT_DIR);DelayS(15); // <br /> LCD_WriteData(0x00); DelayS(15);<br /> LCD_WriteCommand(LCD_DIS_OVR); DelayS(15); // <br /> LCD_WriteData(0x0C); DelayS(15);<br /> LCD_WriteCommand(LCD_DIS_ON); DelayS(15); // <br /> LCD_WriteData(0x04);DelayS(15);<br /> LCD_WriteCommand(LCD_CSR_WR); // <br /> LCD_WriteData(0x00); <br /> LCD_WriteData(0x00);<br /> LCD_WriteCommand(LCD_CSR_DIR); // <br /> LCD_FillAll(0);<br /> <br />}<br /> |
|