|
|||||||||||
| 技術交流 | 電路欣賞 | 工控天地 | 數字廣電 | 通信技術 | 電源技術 | 測控之家 | 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.qxvs.cn 浙ICP證030469號 |