|
|||||||||||
| 技术交流 | 电路欣赏 | 工控天地 | 数字广电 | 通信技术 | 电源技术 | 测控之家 | EMC技术 | ARM技术 | EDA技术 | PCB技术 | 嵌入式系统 驱动编程 | 集成电路 | 器件替换 | 模拟技术 | 新手园地 | 单 片 机 | DSP技术 | MCU技术 | IC 设计 | IC 产业 | CAN-bus/DeviceNe |
请教:Atmega128总线方式驱动SED1330 320×240液晶 初始化问题? |
| 作者:geniusboy 栏目:单片机 |
大家好, 我是一个新手,最近在做一个液晶显示的项目,用的ATMEGA128,总线方式,液晶模块是SED1330控制带32K RAM。我写的程序在下面,希望大家能看看,帮我解答一下,搞了几天了就是显示不出来。 主要想问一问: (1)128的初初始化问题?(因为不太会看时序图,看1330时序要求WR宽度最小220ns,所以为了保险起见,我让128在RD WR后面插入了两个等待周期,不知道这样对不对,我把时序图也传上来) (2)我用的是128内部8M晶振,熔丝位设置位SUT:10 CKSEL:0100 CKOPT:1 不知道是否正确? (3)关于地址总线的使用?不知道我定义是否正确? (4)SED1330初始化的问题?不知道我初始化参数是否正确? (5)程序中的错误 先谢谢大家了! // Target : M128 // CRYSTAL: 8.0000Mhz #include <iom128v.h> #include <macros.h> #include <stdio.h> // 直接访问方式地址定义 PA0~7接DB0~7 // PC0~CS PC1~A0 //CS=0 A0=0 写数据口 #define LcmWdataPort (*(volatile unsigned CHAR *)0xFC00) //CS=0 A0=1 写命令口 #define LcmCmdPort (*(volatile unsigned CHAR *)0xFE00) //CS=0 A0=1 读数据口 #define LcmRdataPort LcmCmdPort //CS=0 A0=0 读忙状态标志口 #define LcmStatusPort LcmWdataPort void port_init(void) // I/O端口初始化函数{ { DDRG = 0xFF;; //PG3设定为输出(液晶RESET复位端) PORTG = 0xFF; //PG3输出高电平1(液晶低电平复位) PORTA = 0xff; } void init_devices(void) //调用初始化函数以及外部存储器初始化 { //stop errant interrupts until set up CLI(); //disable all interrupts XMCRA = 0x0A; // 外部存储器地址不分区,在RD、WR后插入2个等待周期 XMCRB = 0x00; //不使能总线保持功能,不释放地址线 port_init(); //I/O口初始化 MCUCR = 0x80; //使能外部存储器,并与XMCRA配合设定了插入2个等待周期 SEI(); //re-enable interrupts //all peripherals are now initialised } // 变量类型标识的宏定义 #define UCHAR unsigned CHAR #define Uint unsigned int // 时序要求:/WR=0;/RD=1 #define SystemSet 0x40 // P1-P8参数 UCHAR ParaSysTable[8]= {0x30,0x87,0x07,0x27,0x42,0xF0,0x30,0x00}; /* P1=0x30 : 顶天无边界,单屏结构驱动,内部CGROM+CGRAM1(8×8点阵) P2=0x87 : B形驱动波形,字符体宽度8列 P3=0x07 : C形驱动波形,字符体高度8行 P4=0x27 : C/R 有效显示窗口参数 320/8 = 40 = 0x27 P5=0x42 : 驱动频率时间常数 TC/R >= C/R+4 Fosc >= 9*TC/R*L/F*FR FR=70Hz P6=0xF0 : L/F 扫描的行数 240行 = 0xF0 P7,P8 : 设定分配给每一行的显示存储空间0x30=48字节 */ /*******************显示域设置。后续10字节参数串ParaScrTableA[]****************/ // 时序要求:/WR=0;/RD=1 #define Scroll 0x44 #define BasePart1 0x00 #define BasePart2 0x40 #define BasePart3 0x80 #define BasePart4 0x00 UCHAR ParaScrTableA[10]={0x00,BasePart1,0xF0,0x00,BasePart2,0xF0,0x00,BasePart3,0x00,BasePart4 }; /*****************************休闲模式设置。后续参数:无*********************************/ #define SleepIn 0x53 /*****************************显示状态设置。后续参数1字节.*****************************/ #define DispOn 0x59 #define DispOff 0x58 //设定光标闪烁,4个显示区均显示但不闪烁。 #define DispOnP1 0x56 /***************************显示合成方式设置。后续参数1字节。**************************/ #define Ovlay 0x5b //设定1、3显示区为文本显示,2显示区为图形。L1、L2、L3简单或合成 #define OvlayP1 0x00 /*****************************点位移设置。后续参数1字********************************/ #define HdotScr 0x5A //设定点位移为1 #define HdotScrP1 0x00 /***********************光标形状设置。后续参数2字节*********************************/ #define CsrForm 0x5D //设定光标占8列 #define CsrFormP1 0x07 //设定光标为块状,占8行 #define CsrFormP2 0x87 /*********************Cgram首地址设置。后续参数2字节*********************************/ #define CgramAdr 0x5C //定义外部CGROM开始地址为8000H #define CgramAdrP1 0x00 #define CgramAdrP2 0x80 /************************光标移动方向设置。后续参数:无****************************/ //光标右移 #define CsrDirR 0x4c //光标左移 #define CsrDirL 0x4d //光标上移 #define CsrDirU 0x4e //光标下移 #define CsrDirD 0x4f /************************光标指针设置。后续参数2字节*****************************/ #define CsrW 0x46 /************************读取光标指针。后续参数2字节****************************/ #define CsrR 0x47 /**************************数据写入设置。后续参数N字节************************/ #define mWrite 0x42 /**************************数据读取设置。后续参数N字节***********************/ #define mRead 0x43 /*******************************程序参数定义***************************/ // 忙状态标志位0b0100 0000 #define Busy 0x40 // 相对于320 X 240 液晶屏 #define AP 0x30 /*____________________________微妙延时程序_,8M晶振______________________________*/ void delay_1us() { asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); asm("nop"); } void delay_us(UCHAR n) { while(n--) { delay_1us();} } /*___________________________毫秒延时程序_______________________________*/ void delay_ms(UCHAR m) { while(m--) {delay_us(1000);} } /*___________________________判断忙标志BF子程序________________________*/ void WaitForBusy(void) { while(LcmStatusPort & Busy); } /*_________ |
| 2楼: | >>参与讨论 |
| 作者: chuandaoxy 于 2006/8/17 16:02:00 发布:
把硬件图贴出来 |
|
| 3楼: | >>参与讨论 |
| 作者: geniusboy 于 2006/8/17 16:09:00 发布:
附上硬件原理图 chuandaoxy我把硬件原理图发上来了,多谢啊!
|
|
| 4楼: | >>参与讨论 |
| 作者: forest_j 于 2006/8/17 16:30:00 发布:
sed系列有个毛病,容易偏屏 上电后,显示内容有时候会偏到一边几个像素.跟电源的上掉电顺序有关系. |
|
| 5楼: | >>参与讨论 |
| 作者: geniusboy 于 2006/8/17 16:47:00 发布:
forest_j您好 感谢forest_j您的回复。我不知道有这个问题,但是我也想过怕LCD先上电,AVR后,会出现问题,所以我在我的LCD初始化程序里,加了几个语句,用128先让LCDreset端置低电平500us让它复位,在开始写指令,初始化。 您能在看看可能是有别的问题吗?我等下改一下指针地址,在烧一次看看,非常感谢! |
|
| 6楼: | >>参与讨论 |
| 作者: forest_j 于 2006/8/17 16:59:00 发布:
是这样的 先复位一下再初始化,要有一定的延迟时间.如果你的板将来出现偏屏问题,可以试下用单片机控制负电源的接通. 先确认一下是否正确初始化,如果硬件连接错误或指令不对没有初始化,屏幕应该是上下滚动的横条. |
|
| 7楼: | >>参与讨论 |
| 作者: geniusboy 于 2006/8/17 17:47:00 发布:
回复forest_j 谢谢,我发现了一个错误,就是 WriteCommand(DispOn); //写入LCM开显示屏幕指令 WriteCommand(DispOnP1); //写入P1参数,光标闪烁,1,2,3,4区显示 第二个语句应该是WriteData(DispOnP1); 我改了这个语句,还是没有显示。 此外我在复位后加了50ms延迟,不知道这个时间够不够。另外控制负电源接通,我会试试的,感谢您! |
|
| 8楼: | >>参与讨论 |
| 作者: geniusboy 于 2006/8/17 17:50:00 发布:
补充 我现在照上面的程序烧进去后,上电后,屏幕只有背光亮着,其他什么都没有显示,也没有滚动条纹,没有亮条纹!希望还有哪位能帮忙分析一下,哦,forest_j我想再问一下,如何确定是否正确初始化呢了? |
|
| 9楼: | >>参与讨论 |
| 作者: geniusboy 于 2006/8/18 16:24:00 发布:
自己再顶一下:) 高手们再帮帮忙啊,又一天又要过了,还是没有进展,郁闷疯了! |
|
|
|
Copyright © 1998-2006 www.j71x6.cn 浙ICP证030469号 |