|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
問個(gè)笨笨的問題 |
| 作者:nevea 欄目:新手園地 |
點(diǎn)過液晶屏的人都知道,有些讀指令, 有些涉及到“讀狀態(tài)“指令,在讀狀態(tài)指令滿足一定要求,才能繼續(xù)下面的指令操作。比如,“讀狀態(tài)“指令執(zhí)行后我們要判斷,系統(tǒng)是否忙,是否已經(jīng)初始化完畢等等。 通常如果“讀狀態(tài)“指令返回的值表明系統(tǒng)正忙,我們需要等待,然后再讀這個(gè)“讀狀態(tài)“指令,直到系統(tǒng)能夠繼續(xù)執(zhí)行下面的指令。我想問的是:我們每次讀出來的這個(gè)“讀狀態(tài)“指令的值是否是不一樣的?為什么我的程序就只是在那里死循環(huán),一直在讀“讀狀態(tài)“指令,一直在判斷,然后再讀。 我不明白這是這么回事,查寄存器的值也是不變的。 |
| 2樓: | >>參與討論 |
| 作者: 1121 于 2006/4/15 19:12:00 發(fā)布:
或許是你的時(shí)序配合的不對。 |
|
| 3樓: | >>參與討論 |
| 作者: mohanwei 于 2006/4/15 21:00:00 發(fā)布:
我是這樣做的: 做一個(gè)循環(huán),讀10000次(跟具體的模塊有關(guān)),有一次正確就返回返回成功標(biāo)志1,如果循環(huán)結(jié)束了就返回失敗標(biāo)記0。返回后再進(jìn)行出錯處理。 這也是由于碰到了液晶模塊排線有時(shí)候壓得不好接觸不良造成系統(tǒng)不正常才改進(jìn)的^_^ |
|
| 4樓: | >>參與討論 |
| 作者: nevea 于 2006/4/16 18:24:00 發(fā)布:
可是..... 可是每次讀出來的數(shù)據(jù)都是一樣的啊,因?yàn)樵谶@里,單片機(jī)io口作為輸入口,你認(rèn)為:液晶屏能傳數(shù)據(jù)給單片機(jī)的io口么?其實(shí)我的疑問也就在這里:難道液晶屏自己本身也在作內(nèi)部的“運(yùn)動”,?致使每次傳出來的數(shù)據(jù)是不一樣的?我不明白液晶屏能像單片機(jī)一樣可以自己進(jìn)行內(nèi)部操作? 呵呵,很白癡的問題! |
|
| 5樓: | >>參與討論 |
| 作者: maychang 于 2006/4/16 20:31:00 發(fā)布:
液晶可以自己進(jìn)行內(nèi)部操作 單片機(jī)讀液晶狀態(tài)字節(jié),這一次讀和過一會兒讀可能不一樣。 你讀出的總是一樣,可能是硬件故障,也可能是時(shí)序不對。 |
|
| 6樓: | >>參與討論 |
| 作者: iC921 于 2006/4/16 21:19:00 發(fā)布:
呵呵,很白癡的問題! nevea 發(fā)表于 2006-4-16 18:24 新手園地 ←返回版面 可是..... 可是每次讀出來的數(shù)據(jù)都是一樣的啊,因?yàn)樵谶@里,單片機(jī)io口作為輸入口,你認(rèn)為:液晶屏能傳數(shù)據(jù)給單片機(jī)的io口么?其實(shí)我的疑問也就在這里:難道液晶屏自己本身也在作內(nèi)部的“運(yùn)動”,?致使每次傳出來的數(shù)據(jù)是不一樣的?我不明白液晶屏能像單片機(jī)一樣可以自己進(jìn)行內(nèi)部操作? 呵呵,很白癡的問題! ------------- 說誰。 ……每次都一樣,可是是什么呢?告訴大家。 想不到這玩意有這么難,不知道哪有專門的或特長的網(wǎng)站?如果可能,咱也要惡補(bǔ)一下 |
|
| 7樓: | >>參與討論 |
| 作者: nevea 于 2006/4/17 9:32:00 發(fā)布:
程序 #include "SPCE061V004.H" #define Bit0 0x0001 #define Bit1 0x0002 #define Bit2 0x0004 #define Bit3 0x0008 #define Bit4 0x0010 #define Bit5 0x0020 #define Bit6 0x0040 #define Bit7 0x0080 #define Bit8 0x0100 #define Bit9 0x0200 #define Bit10 0x0400 #define Bit11 0x0800 #define Bit12 0x1000 #define Bit13 0x2000 #define Bit14 0x4000 #define Bit15 0x8000 void Delay0() { unsigned CHAR i; for(i=0;i<1;i++); } void Delay1() { unsigned CHAR i; for(i=0;i<2;i++); } void Delay2() {unsigned CHAR i; for(i=0;i<3;i++) ; } void Init_IOA_Low8bit_Output() //// 設(shè)置A口低八位為輸出狀態(tài) { *P_IOA_Dir=0x00ff; *P_IOA_Attrib=0x00ff; *P_IOA_Data=0x00ff; } void Init_IOA_Low8bit_Input() ////設(shè)置A口低八位為輸入狀態(tài) { *P_IOA_Dir=0xff00; *P_IOA_Attrib=0xff00; *P_IOA_Data=0xff00; } void Init_IOB_Low5bit_Output() ///設(shè)置B口低五位為輸出狀態(tài) { *P_IOB_Dir=0x001f; *P_IOB_Attrib=0x001f; *P_IOB_Data=0x001f; } void Write_Command(unsigned CHAR data) ///寫指令函數(shù) { Init_IOB_Low5bit_Output() ; Init_IOA_Low8bit_Output(); *P_IOB_Data&=~(Bit1+Bit2+Bit3+Bit4); //置低R/W,D/I,CSA,CSB;寫指令,片選 Delay1(); *P_IOB_Data|=Bit0; //使能端E置位 *P_IOA_Data=data; //向A口送數(shù)據(jù) Delay2(); *P_IOB_Data&=~Bit0; //使能端E復(fù)位 Delay0(); *P_IOB_Data|=(Bit1+Bit2+Bit3+Bit4); //置位R/W,D/I,CSA,CSB } void Write_Data(unsigned CHAR data) ///寫數(shù)據(jù)函數(shù) { Init_IOB_Low5bit_Output() ; Init_IOA_Low8bit_Output(); *P_IOB_Data&=~(Bit1+Bit3+Bit4); *P_IOB_Data|=Bit2; Delay1(); *P_IOB_Data|=Bit0; *P_IOA_Data=data; Delay2(); *P_IOB_Data&=~Bit0; Delay0(); *P_IOB_Data|=(Bit1+Bit3+Bit4); *P_IOB_Data&=~Bit2; } unsigned CHAR Status_Read() ///讀系統(tǒng)狀態(tài)函數(shù) { unsigned CHAR data; Init_IOB_Low5bit_Output(); Init_IOA_Low8bit_Input() ; *P_IOB_Data&=~Bit0; //使能端E復(fù)位 *P_IOB_Data|=Bit1; //置位R/W *P_IOB_Data&=~(Bit2+Bit3+Bit4); //置低D/I,CSA,CSB Delay2(); *P_IOB_Data|=Bit0; //置位E Delay1(); *P_IOB_Data&=~Bit0; //復(fù)位E data=*P_IOA_Data; //從A口讀數(shù)據(jù)*******在這之前是不是液晶屏早已將數(shù)據(jù)送上單片機(jī)A口了?**************** Delay0(); *P_IOB_Data&=~Bit1; //復(fù)位R/W *P_IOB_Data|=(Bit2+Bit3+Bit4); //置位D/I,CSA,CSB return data; //返回狀態(tài)字?jǐn)?shù)據(jù) } void DISPLAY_On() ///開顯示函數(shù) { Write_Command(0x007c);} void DISPLAY_Start_Line() ///設(shè)置起始線函數(shù) {Write_Command(0x0003);} void Set_Page_Address() ///設(shè)置起始頁函數(shù) {Write_Command(0x001d);} void Set_Y_Address() ///設(shè)置起始Y地址函數(shù) {Write_Command(0x0002);} void Clear_Screen() ///清屏函數(shù),向第一片屏寫入全零 {unsigned CHAR i; *P_IOB_Data&=~Bit0; for(i=0;i<512;i++) { Write_Data(0x0000);} } void Write_DISPLAY_Data()///向DISPLAY RAM里面寫數(shù)據(jù) {unsigned CHAR i; *P_IOB_Data&=~Bit0; for(i=0;i<512;i++) { Write_Data(0x00ff);} } void main() { u |
|
| 8樓: | >>參與討論 |
| 作者: nevea 于 2006/4/17 9:43:00 發(fā)布:
跳不出while循環(huán) 無論怎樣我的程序就是退不出while 循環(huán),硬件電路是按照要求的搭的,確認(rèn)沒有問題,不知道是什么原因,希望哪位大俠能幫我看看,。非常感謝了! 我試過,不加這個(gè)while 循環(huán),也就是不執(zhí)行Status_Read();,液晶屏反倒有顯示,但是顯示的內(nèi)容并不是我想要的,而且全速運(yùn)行還一直閃不停! 這是我第一次編程調(diào)屏。我相信在我的程序里面一定存在好多問題,甚至有些是很致命的錯誤,希望大俠能不厭其煩為我指明! 入門總是很難的,一個(gè)很簡單的問題,我的理解可能相差十萬八千里,最后當(dāng)然導(dǎo)致沒有預(yù)期效果。 希望能得到有力的幫助! 這是屏的資料:http://blog.21ic.com/uploadfile-/200641218353435.pdf * - 本貼最后修改時(shí)間:2006-4-17 9:47:02 修改者:nevea |
|
| 9樓: | >>參與討論 |
| 作者: iC921 于 2006/4/17 11:45:00 發(fā)布:
到這一步,應(yīng)該說不難了 只要有一定的實(shí)戰(zhàn)經(jīng)驗(yàn) 最怕象踢死豬一樣沒有反應(yīng)。 * - 本貼最后修改時(shí)間:2006-4-17 12:41:29 修改者:iC921 |
|
| 10樓: | >>參與討論 |
| 作者: nevea 于 2006/4/17 14:07:00 發(fā)布:
看來這個(gè)帖子... 21IC里面的能人應(yīng)該很多啊,不會再一次讓我這個(gè)帖子沉了吧? 雖然我問的問題很簡單,我自己也清楚,甚至基礎(chǔ)得幾乎無法回答,但是,每個(gè)老手都是經(jīng)歷過做新手的階段的,難道你們就忘了自己當(dāng)年是怎么過來的了嗎? 希望有心人能幫忙解答一下!-------------------------------新手的難題。 |
|
| 11樓: | >>參與討論 |
| 作者: nevea 于 2006/4/17 18:01:00 發(fā)布:
為什么閱讀次數(shù)有增,卻沒有回貼... 相信會遇到有能幫忙解決問題的人!這已經(jīng)是這個(gè)問題的第二個(gè)貼了,我不想再沉下去了! 焦急地等待中.................. 明天來看貼!期望能有收獲! |
|
| 12樓: | >>參與討論 |
| 作者: tjjack 于 2006/4/18 8:45:00 發(fā)布:
俺老漢再說一說 樓主你的屏還沒有搞定嗎? 我操作的時(shí)候一般不處理判斷是否"忙",我一般就加一點(diǎn)延時(shí), 判斷"忙"有時(shí)是很麻煩的,死活不對,尤其是第一次調(diào)試這東西. 我建議你加一點(diǎn)延時(shí)再判斷(或者不判斷),執(zhí)行下面的操作就可以了. 等你把它控制好了,一切你想怎么控制就怎么控制 |
|
| 13樓: | >>參與討論 |
| 作者: nevea 于 2006/4/18 9:02:00 發(fā)布:
To tjjack 呵呵,還沒有呢! 依你的意思,如果不判斷“忙”,還要不要調(diào)用Status_Read();,你說的延時(shí)在該函數(shù)的前面還是后面,大約延時(shí)多長時(shí)間? 請你看我上面“跳不出while循環(huán)”的內(nèi)容,你遇到過類似的問題嗎?即使我關(guān)了顯示,他依然有顯示線,即使我清了屏,他依然有顯示線,我覺得問題很嚴(yán)重... 現(xiàn)在如果哪個(gè)專家肯給我說一下:你的資料給的不全,不足以驅(qū)動該屏,或是你的屏本身存在問題。 這樣我也就釋然了,呵呵 但是希望知道問題出在哪里。 |
|
| 14樓: | >>參與討論 |
| 作者: computer00 于 2006/4/18 9:16:00 發(fā)布:
讀狀態(tài)時(shí),為何是a=(Status_Read())&0x001d;? 而不是a=(Status_Read())&0x0080;呢? 另外,在寫數(shù)據(jù)和寫指令兩個(gè)函數(shù)中, *P_IOB_Data&=~(Bit1+Bit2+Bit3+Bit4); 前面似乎應(yīng)該加上一句 *P_IOB_Data&=~Bit0; //復(fù)位E 請仔細(xì)看時(shí)序圖,一定要弄對,時(shí)序錯一點(diǎn),就全錯了。 |
|
| 15樓: | >>參與討論 |
| 作者: nevea 于 2006/4/18 9:57:00 發(fā)布:
To 00 非常感謝: 1。屏的1--8pin對應(yīng)著DB7---DB0,而我的接法也是pin1--8對應(yīng)著MCU的IOA0--IOA7;Status_Read()不僅要判斷Busy還要判斷ON/OFF 和RESET;這里的ON/OFF和DisplayOn有什么區(qū)別我也不清楚。 2,寫數(shù)據(jù)和寫指令函數(shù)中,像你說的那樣,之前我也加上了*P_IOB_Data&=~Bit0; //復(fù)位E 但是效果同現(xiàn)在一樣,因?yàn)榭紤]到在Status_Read()函數(shù)里面,在最后已經(jīng)復(fù)位E了,所以這樣改掉了。 * - 本貼最后修改時(shí)間:2006-4-18 10:05:48 修改者:nevea |
|
| 16樓: | >>參與討論 |
| 作者: computer00 于 2006/4/18 10:43:00 發(fā)布:
暈……那你只好改成延時(shí)試試了。 將讀狀態(tài)判斷忙的程序,暫時(shí)先改成延時(shí)1mS的程序,再來調(diào)試顯示部分。等顯示正常后,再回來調(diào)讀忙狀態(tài)的函數(shù)。 |
|
| 17樓: | >>參與討論 |
| 作者: nevea 于 2006/4/18 11:47:00 發(fā)布:
依然不行! 我猜是不是液晶屏給的指令不正確!或者是液晶屏需要什么初始化指令而資料里面沒給出!開關(guān)顯示指令居然不起作用! |
|
| 18樓: | >>參與討論 |
| 作者: iC921 于 2006/4/18 12:35:00 發(fā)布:
數(shù)據(jù)先要簡單,不要變看看 |
|
| 19樓: | >>參與討論 |
| 作者: tjjack 于 2006/4/18 14:45:00 發(fā)布:
re a=(Status_Read())&0x001d;? 是什么意思?我不明白,你的編程風(fēng)格和我的不同.看你的程序有點(diǎn)不習(xí)慣!! 圖中的是那三個(gè)位的作用,你不能跳出循環(huán)肯定是這三個(gè)位不是你所想的那樣!
|
|
| 20樓: | >>參與討論 |
| 作者: 夏蟲 于 2006/4/18 14:53:00 發(fā)布:
為什么要判斷ON/OFF?? 只需要判斷BUSY位就可以了 |
|
| 21樓: | >>參與討論 |
| 作者: nevea 于 2006/4/18 15:02:00 發(fā)布:
非常感謝 非常感謝: 屏的1--8pin對應(yīng)著DB7---DB0,而我的接法也是pin1--8對應(yīng)著MCU的IOA0--IOA7;Status_Read()不僅要判斷Busy還要判斷ON/OFF 和RESET;這里的ON/OFF和DISPLAYOn有什么區(qū)別我也不清楚。 也許你說得是對的,我可能理解得不正確! 對啊,麻煩你再看看你截的這個(gè)圖,DB0-0,DB1-0,DB2-0,DB3/DB4-RESET,DB5--ON/OFF,DB6--0,DB7--BUSY RESET: 1:RESET 0:NORMAL ON/OFF: 1:DISPLAY OFF 0:DISPLAY ON BUSY: 1:INTERNAL OPERATION 0:READY 目的是要判斷DB7--DB0是否為10111000,但是單片機(jī)IOA0--IOA7與他們是一一對應(yīng)的,故反過來判斷,為00011101,即0x001d(凌陽單片機(jī)16位,我用低8位),只要這8位里面有一位為1,就再去判斷,直到8位全部為0。 再請你幫我看看,順便幫忙解釋一下此處的ON/OFF,與那個(gè)DISPLAY On/Off 有什么不同,我才學(xué)編程哪里有什么風(fēng)格呵!程序亂了點(diǎn),見諒。呵呵! |
|
| 22樓: | >>參與討論 |
| 作者: iC921 于 2006/4/19 3:18:00 發(fā)布:
好象你沒有認(rèn)真閱讀和整理手冊 對啊,麻煩你再看看你截的這個(gè)圖,DB0-0,DB1-0,DB2-0,DB3/DB4-RESET,DB5--ON/OFF,DB6--0,DB7--BUSY RESET: 1:RESET 0:NORMAL ON/OFF: 1:DISPLAY OFF 0:DISPLAY ON BUSY: 1:INTERNAL OPERATION 0:READY 目的是要判斷DB7--DB0是否為10111000 ←最少根據(jù)文件的第14頁的描述(本頁開頭),DB3=0(截圖部分排版有問題要澄清:REST0,一時(shí)說不清是什么意思,文件中也沒有RESET0這玩意做command)。另外,根據(jù)同頁的 “RESET: RESET=1 shows that the SYSTEM is being initialized. In this condition, no instructions except status read can be accepted. RESET=0 shows that initializing has finished and the SYSTEM is in the usual operation condition.” 描述,DB4-RESET也應(yīng)該為0而不為1。表面上RESET=1也可以讀,但都已經(jīng)初始化了,還讀什么呢?我看,就是能讀出來好象也已經(jīng)不是你需要的了。 你看看是不是這樣?不要太急著想程序,而要先弄清楚手冊才是根本。想來這個(gè)事也許不怪你,因?yàn)槲募拇_實(shí)不敢恭維,太容易讓人誤解了。 最后,DB7-busy到底是取1還是取0都要掂量掂量…… --------- 沒系統(tǒng)了解,僅供參考。 * - 本貼最后修改時(shí)間:2006-4-19 3:21:44 修改者:iC921 |
|
| 23樓: | >>參與討論 |
| 作者: 夏蟲 于 2006/4/19 10:41:00 發(fā)布:
RE ON/OFF用于控制液晶屏是否顯示內(nèi)容,這里是要控制而不是來讀取判斷的,你要做的只是讀BUSY是否是READY狀態(tài),其他的位都只是液晶屏當(dāng)前狀態(tài),自己知道就行了 |
|
| 24樓: | >>參與討論 |
| 作者: computer00 于 2006/4/19 11:15:00 發(fā)布:
先將這個(gè)寄存器的內(nèi)容讀回來,然后看看它的內(nèi)容到底是什么 如果是全1或者全0,那就說明可能程序出了問題,根本沒有讀到它的值。 調(diào)試要一步步來的,下一步的運(yùn)行,要建立在上一步正確運(yùn)行的基礎(chǔ)上。 只有確認(rèn)前面的程序100% OK之后,才能繼續(xù)往下調(diào),否則一切都是白費(fèi)。 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |