|
|||||||||||
| 技術(shù)交流 | 電路欣賞 | 工控天地 | 數(shù)字廣電 | 通信技術(shù) | 電源技術(shù) | 測(cè)控之家 | EMC技術(shù) | ARM技術(shù) | EDA技術(shù) | PCB技術(shù) | 嵌入式系統(tǒng) 驅(qū)動(dòng)編程 | 集成電路 | 器件替換 | 模擬技術(shù) | 新手園地 | 單 片 機(jī) | DSP技術(shù) | MCU技術(shù) | IC 設(shè)計(jì) | IC 產(chǎn)業(yè) | CAN-bus/DeviceNe |
困繞了我一周:初學(xué)LCD,關(guān)于at_指令于LCD的控制。關(guān)系到能否漲薪呀? |
| 作者:feng993032 欄目:技術(shù)交流 |
這段時(shí)間在學(xué)LCD控制?戳撕芏嗟难菔境绦,也查了很多的資料,也問了一些人。但始終對(duì)程序中關(guān)于_at_指令和總線不懂。 比如: KS0070(44780) 16x2 字符液晶屏驅(qū)動(dòng)演示程序總線方式 曉奇 ============================================================================= 連接線圖: LCM-------51 LCM-------51 LCM--------51 DB0-----P0.0 DB4-----P0.4 RW-------P2.0 DB1-----P0.1 DB5-----P0.5 RS-------P2.1 DB2-----P0.2 DB6-----P0.6 E-------P2.7=>74LS00+wr+rd DB3-----P0.3 DB7-----P0.7 VLCD接1K2電阻到GND [注]:AT89C51的晶振頻率為12MHZ // ================= LCM1602A端口地址定義 ======================= CHAR xdata Lcd1602CmdPort _at_ 0x7cff; //E=1 RS=0 RW=0 CHAR xdata Lcd1602WdataPort _at_ 0x7eff; //E =1 RS=1 RW=0 CHAR xdata Lcd1602StatusPort _at_ 0x7dff; //E=1 RS=0 RW=1 。。。。。。。。。。。。。。。。。。。。。。。。。。。。 以上端口定義時(shí) 如 Lcd1602CmdPort _at_ 0x7cff 即P2=0x7c p0=0xff 是這樣嗎? 如果是 P2=0x7c p0=0xff 這樣定義 那就相當(dāng)于p2=01111100 即p20=0 p21=0 p27=0 (E=0 RS=0 RW=0)這與注釋//E=1 RS=0 RW=0 不相符呀? 如果有 Lcd1602CmdPort = 0x38; 請(qǐng)問單片機(jī)如何執(zhí)行?即每步 p0=? p2=? 謝謝。 ========================================= 我發(fā)現(xiàn)很多人和我一樣,初學(xué)LCD都不懂這個(gè)問題。請(qǐng)說明一下。 1、Lcd1602CmdPort _at_ 0x7cff 這句話到底意味著什么 我知道是分配一個(gè)外部地址。但是為什么是0x7cff,而不是其它,這是如何根據(jù)接線方式計(jì)算出的。就是說這句話到底做了什么事。 2、Lcd1602CmdPort = 0x38 這句話單片機(jī)做了什么事?單片機(jī)如何執(zhí)行? 關(guān)于這2個(gè)問題困繞了我一個(gè)多星期了,還是不明白。請(qǐng)各位大大指教。 * - 本貼最后修改時(shí)間:2006-6-28 14:16:43 修改者:feng993032 |
| 2樓: | >>參與討論 |
| 作者: imwangyi 于 2006/6/28 14:41:00 發(fā)布:
編譯后看看生成的lst文件一般可以看到的 應(yīng)該類似: mov dptr,#7cffH mov a,#38h movx @dptr,a |
|
| 3樓: | >>參與討論 |
| 作者: feng993032 于 2006/6/28 15:21:00 發(fā)布:
我知道你所說的。 我知道你所說的。把#38H賦值給 7cff單元。 問題是:把#38H賦值給7CFF單元時(shí),當(dāng)時(shí)。各個(gè)引腳的狀態(tài)。 各位大大還是先幫我解決下第1個(gè)問題。即,單片機(jī)如何根據(jù)LCD接線來確定變量的地址(Lcd1602CmdPort _at_ 0x7cff),7cff它是怎么算出來的。 有關(guān)的程序,還有很多。比如 CA12864 (KS0107 KS0108) 演示程序 Keil C51 連線表: RS=P2.0 R/W=P2.1 CS1=P2.7 CS2=P2.6 SysClock=12MHZ DB0-DB7=P0.0-P0.7 E=/(WR*RD) /Reset=InBoard CHAR xdata LcmWriteCmdPort1 _at_ 0x8000; //CS1=1 RW=0 RS=0 CHAR xdata LcmWriteCmdPort2 _at_ 0x4000; //CS2=1 RW=0 RS=0 CHAR xdata LcmWriteDataPort1 _at_ 0x8100; //CS1=1 RW=0 RS=1 CHAR xdata LcmWriteDataPort2 _at_ 0x4100; //CS2=1 RW=0 RS=1 CHAR xdata LcmReadStatusPort1 _at_ 0x8200; //CS1=1 RW=1 RS=0 CHAR xdata LcmReadStatusPort2 _at_ 0x4200; //CS2=1 RW=1 RS=0 這6個(gè)數(shù)據(jù)是怎樣計(jì)算出來的?? |
|
| 4樓: | >>參與討論 |
| 作者: xwj 于 2006/6/28 15:51:00 發(fā)布:
就是二進(jìn)制轉(zhuǎn)換成了十六進(jìn)制,你用計(jì)算器換算成二進(jìn)制就知道了 |
|
| 5樓: | >>參與討論 |
| 作者: feng993032 于 2006/6/29 9:13:00 發(fā)布:
RE四樓:我明白你的意思。 我知道這6個(gè)變量是對(duì)應(yīng) P2.7~P2.0 P0.7~P0.0 這16個(gè)IO口。 我想知道的是如何根據(jù)LCD與單片機(jī)的接線方式來確定這6個(gè)變量的地址的。 請(qǐng)各位一定要幫忙啊。 |
|
| 6樓: | >>參與討論 |
| 作者: xwj 于 2006/6/29 9:40:00 發(fā)布:
暈~~~~,LZ你也稍微動(dòng)那么一下腦筋啊 連線表: RS=P2.0 R/W=P2.1 CS1=P2.7 CS2=P2.6 SysClock=12MHZ 如這個(gè)端口: CHAR xdata LcmWriteCmdPort1 _at_ 0x8000; //CS1=1 RW=0 RS=0 把//CS1=1 RW=0 RS=0代進(jìn)連線表: RS=P2.0 R/W=P2.1 CS1=P2.7 那是不是P2應(yīng)該為二進(jìn)制1000 0000?換算成十六進(jìn)制不就是0x80? P2是高位,低8位地址沒連線可以為任意值,,因此LcmWriteCmdPort1 的地址就是0x80xx,x為任意值 長(zhǎng)了腦袋就是用來思考的,不要不想事啊 |
|
| 7樓: | >>參與討論 |
| 作者: feng993032 于 2006/6/29 11:13:00 發(fā)布:
嘿嘿,其實(shí)在我提問之前,已經(jīng)是將懂未懂的狀態(tài)。 我只是要確認(rèn)一下。先謝謝你了 xwj。 第1個(gè)問題,已解決,F(xiàn)在剩下第2問題了。 該程序里有這么句話。 /*檢查Busy */ /***************************/ void Busy1(void) { _nop_(); while(LcmReadStatusPort1 & 0x80); //Status Read Bit7 = BUSY _nop_(); }); 根據(jù)KS0108的資料。我只知道:當(dāng)RS=0,R/W=1時(shí),D7(P0.7)=1時(shí),LCD為BUSY狀態(tài)。 我的疑惑是:讀取或?qū)懭隠cmReadStatusPort1(等6個(gè)變量)時(shí)。RS,R/W,CS1/CS2。有無(wú)變化,是否一直不變。 總的來說,就是不明白LCD掛在單片機(jī)的總線上的工作方式,只要是P2口。 P0口,我已明白是地址/數(shù)據(jù)復(fù)用。 請(qǐng)高人解釋一下。再次感謝 xwj 的解答。 |
|
| 8樓: | >>參與討論 |
| 作者: xwj 于 2006/6/29 11:29:00 發(fā)布:
基本只是,自己去看書--總線時(shí)序 |
|
| 9樓: | >>參與討論 |
| 作者: hexiaoxiao 于 2006/6/29 11:44:00 發(fā)布:
無(wú)變化因?yàn)椴僮鲾?shù)據(jù)是使用的是低位字節(jié).P0口 至于怎么工作,就看你自己想讓LCD怎么工作哦!寫命令,你就用Lcd1602CmdPort)為寫命令方式.寫顯示數(shù)據(jù)用(Lcd1602WdataPort)為寫數(shù)據(jù)方式, 我不喜歡用這種方式來編程.可能是我以前習(xí)慣用匯編的原因吧 |
|
| 10樓: | >>參與討論 |
| 作者: xwj 于 2006/6/29 12:20:00 發(fā)布:
錯(cuò),有變化,因?yàn)閤data 實(shí)際調(diào)用的是MOVX,P2要送地址 |
|
| 11樓: | >>參與討論 |
| 作者: feng993032 于 2006/6/29 13:01:00 發(fā)布:
RE:xwj “錯(cuò),有變化,因?yàn)閤data 實(shí)際調(diào)用的是MOVX,P2要送地址” “自己去看書--總線時(shí)序” 我過許多人,基本上給我的都是上面2個(gè)答案,F(xiàn)在又是這個(gè)情況。哎~~~ 還要麻煩下 XWJ 。 我不明白的是P2的地址要送給誰(shuí)?因?yàn)長(zhǎng)CD不是外部RAM。對(duì)單片機(jī)來說 0X8000 或其它16位地址,沒意義啊。 PS:書我看了,但是不明白P2口和P0口的高,低位16位地址與LCD聯(lián)系的。 請(qǐng)指教。 |
|
| 12樓: | >>參與討論 |
| 作者: xwj 于 2006/6/29 13:42:00 發(fā)布:
暈。。。還要怎么說???自己去看書啊,把總線時(shí)序看懂再說! 叫你看書就去看書! 不要不懂腦筋瞎問啊! 沒見過這么不長(zhǎng)進(jìn)的了,在你看懂時(shí)序前不再回答你的問題,否則真的是害了你 |
|
| 13樓: | >>參與討論 |
| 作者: z_no1 于 2006/6/29 23:39:00 發(fā)布:
先把51的外部存儲(chǔ)器的讀寫波形搞懂吧, 玩51不明白這個(gè)就不是個(gè)硬件工程師。軟件的最基本的單位是匯編指令,硬件則是高低電平和時(shí)序。 |
|
| 14樓: | >>參與討論 |
| 作者: hexiaoxiao 于 2006/6/30 14:58:00 發(fā)布:
不好意思,我看錯(cuò)了 <<我的疑惑是:讀取或?qū)懭隠cmReadStatusPort1(等6個(gè)變量)時(shí)。RS,R/W,CS1/CS2。有無(wú)變化,是否一直不變。>>, 應(yīng)該是有變化的.因?yàn)?個(gè)變量代表LCM不同的工作方式.所以P2口做為L(zhǎng)CM的控制選址它是有變化的. 只要是單片機(jī)控制的外圍器件都應(yīng)該有個(gè)地址.不是僅僅RAM有. 比如(E-------P2.7=>74LS00+wr+rd)就是LCM的選通地址線.要使LCM工作,就必須用P2.7=1;或者P2,P0=0X8000. |
|
| 15樓: | >>參與討論 |
| 作者: feng993032 于 2006/6/30 16:45:00 發(fā)布:
看了一天的書。 好象懂了,又好象沒懂。其實(shí),這個(gè)問題我去年就碰到了,一直沒解決。 經(jīng)過這一周的問人,看書。好想明白了點(diǎn)。 我的理解是:當(dāng)單片機(jī)讀或?qū)懲獠康刂窌r(shí)。P2,P0口送出地址,然后從P0口送出或接收數(shù)據(jù)。當(dāng)P2口送出地址時(shí),口線有變化,具體什么變化,我還沒搞清楚。LCD與單片機(jī)的總線連接方式,就是利用了這種P2的口線變化。 其實(shí)如果不用這種總線方式的話,當(dāng)讀LCD狀態(tài)或?qū)慙CD數(shù)據(jù)/命令時(shí),直接操作 RS,R/W,CS1/CS2等就可以了,這樣更直接,更容易理解。(當(dāng)然是對(duì)我來說) 再次感謝各位的幫助。 |
|
| 16樓: | >>參與討論 |
| 作者: computer00 于 2006/6/30 16:50:00 發(fā)布:
P0,P2口上的變化當(dāng)然就是輸出給地的地址了 然后由RD或者WR信號(hào)將指定地址的數(shù)據(jù)讀出或者寫入。 |
|
|
|
| 免費(fèi)注冊(cè)為維庫(kù)電子開發(fā)網(wǎng)會(huì)員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號(hào) |