|
技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
液晶驱动问题 |
作者:yh830921 栏目:ARM技术 |
谁能帮我看看我的SED1335的液晶驱动有什么问题?我一开始用的是EasyARM2200开发板上的配套液晶,现在因为需要,要换SED1335的液晶,驱动程序已经改成SED1335的驱动了,但是就不能显示,谁能帮我看看这个驱动程序哪有问题,谢谢! #define LCD_SYSTEM_SET 0x40 //初始化设置 #define LCD_SCROLL 0x44 //显示域设置 #define LCD_SLEEP_IN 0x53 //休闲模式 #define LCD_DISP_ON 0x59 //显示状态开 #define LCD_DISP_OFF 0x58 //显示状态关 #define LCD_OVLAY 0x5B //显示合成设置 #define LCD_HDOT_SCR 0x5A //点位移设置 #define LCD_CSRRFORM 0x5D //光标形状设置 #define LCD_CGRAM_ADR 0x5C //CGRAM首地址设置 #define LCD_CSRDIR_R 0x4C //光标向右移动 #define LCD_CSRDIR_L 0x4D //光标向左移动 #define LCD_CSRDIR_U 0x4E //光标向上移动 #define LCD_CSRDIR_D 0x4F //光标向下移动 #define LCD_CSRW 0x46 //光标指针设置 #define LCD_CSRR 0x47 //读取光标指针 #define LCD_MWRITE 0x42 //数据写入设置 #define LCD_MREAD 0x43 //数据读出设置 //#define LCD_READ_FLUG #define paraP9 0x28 extern uint8 LCD_WriteTCommand1(uint8 command); extern uint8 LCD_WriteTData1(uint8 dat); void LCD_Initialize(void) { uint8 count1; uint8 SYSTAB[]={0x30,0x87,0x07,0x27,0x42,0xf0,0x28,0x00}; #define BasePart1 0x00 #define BasePart2 0x40 #define BasePart3 0x80 #define BasePart4 0x00 uint8 SCRTAB[]={0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4}; LCD_WriteTCommand1(LCD_SYSTEM_SET); for(count1=0;count1<8;count1++) { LCD_WriteTData1(SYSTAB[count1]); } LCD_WriteTCommand1(LCD_SCROLL); for(count1=0;count1<10;count1++) { LCD_WriteTData1(SCRTAB[count1]); } LCD_WriteTCommand1(LCD_HDOT_SCR); LCD_WriteTData1(0); LCD_WriteTCommand1(LCD_OVLAY); LCD_WriteTData1(4); LCD_WriteTCommand1(LCD_DISP_ON); LCD_WriteTData1(0x54); } void LCD_FillAll(void) { uint16 count2,count3; LCD_WriteTCommand1(LCD_CSRDIR_R); LCD_WriteTCommand1(LCD_CSRW); LCD_WriteTData1(0); LCD_WriteTData1(0); LCD_WriteTCommand1(LCD_MWRITE); for(count2=32768;count2>=0;count2--) { LCD_WriteTData1(0); } // for(count3=256;count3>0;count3--) // { // LCD_WriteTData1(0); // } } void LCD_UpdatePoint(uint32 x, uint32 y) { // uint32 addr; /* 找出目标地址 */ // addr = y*(GUI_LCM_XMAX>>3) + (x>>3); // LCD_WriteTCommand3(LCD_ADR_POS, addr&0xFF, addr>>8); // 置地址指针 /* 输出数据 */ // LCD_WriteTCommand2(LCD_INC_WR, gui_disp_buf[y][x>>3]); uint32 tempPtr; uint32 tempD,tempP; tempPtr = y * paraP9 + (x & 0x7fff)/8; // 去除最高位(显示属性) LCD_WriteCommand( LCD_CSRDIR_D ); // CSRDIR 代码(光标自动下移) LCD_WriteCommand( LCD_CSRW ); // 设置光标地址 LCD_WriteData( (tempPtr & 0xff) ); LCD_WriteData( (tempPtr /256) ); LCD_WriteCommand( LCD_MREAD ); // 读显示ram指令 tempD = LCD_ReadData(); // 读取当前显示数据 tempP = 1<<(7-x & 0x0007); // 根据预定属性决定写点或擦 |
2楼: | >>参与讨论 |
作者: 电子老兄 于 2006/12/5 16:58:00 发布:
同病相怜啊,我也在EasyARM2200调SED1335驱动没成功 我同样的代码,跑1335液晶,在AVR中显示正常,在LPC2210就不会显示 AVR我是用模拟IO控制的,LPC2210我是总线控制的 |
3楼: | >>参与讨论 |
作者: foyyof 于 2006/12/5 20:21:00 发布:
re SED1335挂LPC2xxx的总线,调不通过。原因主要是连续两次写命令/数据之间的延迟太短问题! * - 本贴最后修改时间:2006-12-5 20:40:45 修改者:foyyof |
4楼: | >>参与讨论 |
作者: yh830921 于 2006/12/6 10:03:00 发布:
谢谢 可是我加了延时以后,还是不行啊,我调的都郁闷死了 |
5楼: | >>参与讨论 |
作者: 电子老兄 于 2006/12/6 14:18:00 发布:
我也加延时了,还是不行!谁有总线控制的1335驱动啊?? 帮我看看我的代码: #include "config.h" //宏定义// #define P_LED 0x10 //红灯(PG口) #define PARAP9 0x28 // 相对于320 X 240 #define BasePart1 0x00 #define BasePart2 0x40 #define BasePart3 0x80 #define BasePart4 0x00 #define SYSETEM_SET 0x40 #define SCROLL 0x44 #define DISPON 0x59 #define DISPOff 0x58 #define OVLAY 0x5b #define HDOT_SCR 0x5a #define CsrForm 0x5d #define CgramAdr 0x5c #define CSRDIR_RIGHT 0x4c #define CsrDirL 0x4d #define CsrDirU 0x4e #define CSRDIRD 0x4f #define CSRW 0x46 #define CSRR 0x47 #define MWRITE 0x42 #define MREAD 0x43 #define LEDCON 0x00080000 /* P1.19引脚控制LED,低电平亮 */ /* 定义LCM地址 */ #define SED1335_COM (*((volatile unsigned SHORT *) 0x83000002)) #define SED1335_DAT (*((volatile unsigned SHORT *) 0x83000000)) #define SED1335_write_data(dat) SED1335_DAT = (uint8)dat #define SED1335_write_command(command) SED1335_COM = (uint8)command /**************************************************************************** * 名称:DelayNS() * 功能:长软件延时 * 入口参数:dly 延时参数,值越大,延时越久 * 出口参数:无 ****************************************************************************/ void DelayNS(uint16 dly) { uint32 ii; for(ii=0; ii<dly; ii++); } /*======================== 清显示 32K RAM区(清屏)子程序 ======================*/ void SED1335_clear_text_layer(void) { uint32 j; DelayNS(20); SED1335_write_command(CSRDIR_RIGHT); DelayNS(20); SED1335_write_command(CSRW); DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_command(MWRITE); for( j=0; j<32768; j++ ) { DelayNS(20); SED1335_write_data(0x00); // space DelayNS(20); } } //液晶初始化// void LcmInition( void ) { DelayNS(2000); SED1335_write_command(SYSETEM_SET); DelayNS(20); SED1335_write_data(0x30); DelayNS(20); SED1335_write_data(0x87); DelayNS(20); SED1335_write_data(0x07); DelayNS(20); SED1335_write_data(0x27); DelayNS(20); SED1335_write_data(0x42); DelayNS(20); SED1335_write_data(0xf0); DelayNS(20); SED1335_write_data(0x28); DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_command(SCROLL); //设置显示起始地址,和区域 //SAD1显示1区首地址。SAD1确定了第1显示区的起始地址。 //他由双字节组成.本区为显示主区间,占用8K空间 DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_data(0xf0); //SAD2显示2区首地址。SAD2确定了第2显示区的起始地址。 //他由双字节组成。本参数表定义这个区占用8K空间 DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_data(0x40); DelayNS(20); SED1335_write_data(0xf0); DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_command(HDOT_SCR); //以点为单位的显示画面水平移动量 DelayNS(20); SED1335_write_data(0x00); DelayNS(20); SED1335_write_command(OVLAY); //画面重叠显示的合成方式 DelayNS(20); SED1335_write_data(0x0c); //OR方式 DelayNS(2000); SED1335_clear_text_layer(); DelayNS(20); SED1335_write_command(DISPON); DelayNS(20); SED1335_write_data(0x15); // 画面显示但不闪烁,光标显示但不闪烁 DelayNS(20); } void DispHz_S( uint16 x1, uint8 y1, const uint8 *pz, uint8 Len) { uint16 Optr; const uint8 *pzz; uint8 Count1,Count2; uint8 i; for(i=0;i<Len;i++) //sum { pzz = pz + ( 0x20 * i ); //( i<<4 ) Optr = (uint16)y1 * PARAP9 + x1; |
6楼: | >>参与讨论 |
作者: 电子老兄 于 2006/12/6 14:28:00 发布:
我的硬件和start up 硬件:EASYARM220 ARM芯片:LPC2210 LCD接口:原EASYARM220LCD接口(电路保证对) startup :存储器接口Bank3总线配置: LDR R0, =BCFG3 ; 设置BCFG3寄存器 LDR R1, =0x10002CA0 ;1100,1010,0000 STR R1, [R0] |
7楼: | >>参与讨论 |
作者: dracoduan 于 2006/12/6 14:40:00 发布:
驱动SED1335没问题的 我换了2块屏,都可以正常操作的。 感觉外部总线速度并不是问题,因为本来就不快。 我用的是ucosii,读写语句之间也没有用程序延时,都是连续操作的。调试时只要能够操作成功一个寄存器,硬件设置就因该正确了。 |
8楼: | >>参与讨论 |
作者: 电子老兄 于 2006/12/6 14:50:00 发布:
7楼,能不能上传代码参考参考,我已调了5天了,我没成功 原写了一大串代码,最后怕什么影响,多删除,光跑1335程序,多不行,再把代码移回到AVR-ATMEGAL64中,是能正常运行的,LPC2210就是不行 |
9楼: | >>参与讨论 |
作者: yh830921 于 2006/12/6 15:45:00 发布:
我也调试了好几天了 我的显示屏初始化的时候,屏幕会闪一下,有时候还会在屏幕上显示一条直线,看了老半天,也不知道到底问题出在哪,我的驱动还要和ZLG-GUI相联系,郁闷的来,求高手来帮帮忙!! |
10楼: | >>参与讨论 |
作者: xxqarm 于 2006/12/6 16:10:00 发布:
re:看过信号时序吗 用示波器看看信号时序和电平再说吧,"外部总线速度"还是不要感觉的好. |
11楼: | >>参与讨论 |
作者: yh830921 于 2006/12/8 8:14:00 发布:
看了信号时序以后怎么办呢? |
12楼: | >>参与讨论 |
作者: zlgarm 于 2006/12/8 10:11:00 发布:
可能是总线速度配置的问题 LPC2200的总线速度过大,可能LCD读写速度跟不上,请重新配置一下BCFG。 建议先将其配置成1000FFEF,调试成功后再根据需要将其配置成其它值,提高总线的读写速度。 |
13楼: | >>参与讨论 |
作者: yh830921 于 2006/12/8 11:13:00 发布:
改过了 改过了BCFG,我把所有的BCFG都改成1000FFEF了,可是屏幕上还是什么都没有,救命啊!!! |
14楼: | >>参与讨论 |
作者: xxqarm 于 2006/12/8 11:18:00 发布:
时序满足要求吗? 如果时序不能满足要求,调整延时时间呀. |
15楼: | >>参与讨论 |
作者: yh830921 于 2006/12/9 14:12:00 发布:
改过了 延时时间改过了 可是还是不行啊? 我想问一下,这个不能显示,与连接显示屏和实验板之间的数据线的长度有没有关系的?是不是之间线的长度长了,就不能显示啊??? |
16楼: | >>参与讨论 |
作者: cjj3543 于 2006/12/9 15:30:00 发布:
Fcclk 太高了 |
17楼: | >>参与讨论 |
作者: yh830921 于 2006/12/9 15:57:00 发布:
呵呵 我是菜鸟 不好意思,我刚开始学这个,请问Fcclk是什么啊?还有,这个显示屏能否显示和线的长度有没有关系啊??? |
18楼: | >>参与讨论 |
作者: cjj3543 于 2006/12/11 10:26:00 发布:
我的是这样配置的,19264的液晶和LPC2138相连,已经调试完了 /* SYSTEM configuration .Fosc、Fcclk、Fcco、Fpclk must be defined */ /* 系统设置, Fosc、Fcclk、Fcco、Fpclk必须定义*/ #define Fosc 11059200 //CRYSTAL frequence,10MHZ~25MHZ,should be the same as actual status. //应当与实际一至晶振频率,10MHZ~25MHZ,应当与实际一至 #define Fcclk (Fosc * 3) //SYSTEM frequence,should be (1~32)multiples of Fosc,and should be equal or less than 60MHZ.html">60MHZ. //系统频率,必须为Fosc的整数倍(1~32),且<=60MHZ #define Fcco (Fcclk * 8) //CCO frequence,should be 2、4、8、16 multiples of Fcclk, ranged from 156MHz to 320MHz. //CCO频率,必须为Fcclk的2、4、8、16倍,范围为156MHz~320MHz #define Fpclk (Fcclk / 4) * 1 //VPB clock frequence , must be 1、2、4 multiples of (Fcclk / 4). //VPB时钟频率,只能为(Fcclk / 4)的1、2、4倍 |
|
|
免费注册为维库电子开发网会员,参与电子工程师社区讨论,点此进入 |
Copyright © 1998-2006 www.dzsc.com 浙ICP证030469号 |