|
|||||||||||
| 技術(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 |
我是新手,現(xiàn)在想用AVR驅(qū)動液晶,咋就不行呢? |
| 作者:xsq 欄目:單片機(jī) |
12864液晶(控制器為ST7920),用M16驅(qū)動,winavr?qū)懗绦,串口方式,按照說明書上的時(shí)序?qū)懥艘恍《纬绦颍鋵?shí)就是想讓它在左上角顯示一個海字,咋也調(diào)不通,請各位幫幫我: #include"avr/io.h" #include"avr/eeprom.h" #include"avr/wdt.h" #include"avr/delay.h" #define uint unsigned int #define uCHAR unsigned CHAR void wrd(uCHAR a,uCHAR dat) {uCHAR i,j; PORTA&=0xfe; PORTA|=0x01;//CS置高,準(zhǔn)備接收數(shù)據(jù)或指令 for(i=0;i<5;i++) {PORTA|=0x02;//SID置高 PORTA&=0xfb;//拉低SCLK PORTA|=0x04;//置高SCLK PORTA|=0x04;//置高SCLK PORTA&=0xfb;//拉低SCLK }//輸出5個連續(xù)的高脈沖 if(a==0) j=0x0; else j=0x40;//如果是數(shù)據(jù)就按數(shù)據(jù)寫,如果是指令,就按指令寫 for(i=0;i<3;i++) {if((j&0x80)==0) PORTA&=0xfd; else PORTA|=0x02; PORTA&=0xfb;//拉低SCLK PORTA|=0x04;//置高SCLK PORTA|=0x04;//置高SCLK PORTA&=0xfb;//拉低SCLK j<<1; }//如是寫指令,輸出三個連續(xù)的0,如是寫數(shù)據(jù),輸出010 j=dat; j&=0xf0; for(i=0;i<8;i++) {if((j&0x80)==0) PORTA&=0xfd; else PORTA|=0x02; PORTA&=0xfb;//拉低SCLK PORTA|=0x04;//置高SCLK PORTA|=0x04;//置高SCLK PORTA&=0xfb;//拉低SCLK j<<1; }//寫高四位 j=dat<<4; for(i=0;i<8;i++) {if((j&0x80)==0) PORTA&=0xfd; else PORTA|=0x02; PORTA&=0xfb;//拉低SCLK PORTA|=0x04;//置高SCLK PORTA|=0x04;//置高SCLK PORTA&=0xfb;//拉低SCLK j<<1; }//寫低四位 }//寫入一個字節(jié)數(shù)據(jù)或命令 void main() { DDRB=DDRC=DDRD=0x0; PORTB=PORTC=PORTD=0xff; DDRA=0xe0; PORTA=0x1f; _delay_ms(60); wrd(0,0x30); _delay_ms(1); wrd(0,0x30); _delay_ms(1); wrd(0,0x0c); _delay_ms(1); wrd(0,0x01);_delay_ms(1); wrd(0,0x04);_delay_ms(1); wrd(0,0x80); wrd(1,0xba); wrd(1,0xa3);//寫入“! } |
| 2樓: | >>參與討論 |
| 作者: wudianjun 于 2005/11/17 19:24:00 發(fā)布:
我用過,很好、的啊 |
|
| 3樓: | >>參與討論 |
| 作者: hotpower 于 2005/11/17 20:26:00 發(fā)布:
HS12232-9帶漢字庫的2行7位半漢字LCD模塊WINAVR C++演示程序 12864和12232控制幾乎相同!!! 前者為4行8個漢字,后者為2行7位半漢字. http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=359142&bbs_page_no=1&bbs_id=1000 |
|
| 4樓: | >>參與討論 |
| 作者: xsq 于 2005/11/17 22:41:00 發(fā)布:
我初學(xué),連GCC都弄不懂,還C++呢,還是來點(diǎn)實(shí)惠的吧 各位老兄,還是把GCC程序貼出來吧,先謝了 |
|
| 5樓: | >>參與討論 |
| 作者: hotpower 于 2005/11/18 0:15:00 發(fā)布:
暈~~~思路與語言無關(guān) |
|
| 6樓: | >>參與討論 |
| 作者: computer00 于 2005/11/18 0:25:00 發(fā)布:
細(xì)節(jié)問題就會跟語言有關(guān)拉。。。 有時(shí),換語言時(shí),不得不換思路……………… |
|
| 7樓: | >>參與討論 |
| 作者: hotpower 于 2005/11/18 0:28:00 發(fā)布:
哈哈,他的順序編程思路你贊賞??? |
|
| 8樓: | >>參與討論 |
| 作者: computer00 于 2005/11/18 0:43:00 發(fā)布:
不,我沒看前面,只是針對你那一句來的^_^ “hotpower 發(fā)表于 2005-11-18 00:15 AVR 單片機(jī) ←返回版面 暈~~~思路與語言無關(guān) ” |
|
| 9樓: | >>參與討論 |
| 作者: hotpower 于 2005/11/18 1:29:00 發(fā)布:
我們這里叫"水盆大肉"---好吃 |
|
| 10樓: | >>參與討論 |
| 作者: xsq 于 2005/11/18 6:39:00 發(fā)布:
我來這兒就是想得到幫助的,各位老大誰能幫我一下? 水平太差,本來登不得大雅之堂的,讓大家見笑了,可我就是想來這兒學(xué)習(xí)的,不想?yún)s讓各位老大傷了和氣,我這兒給諸位賠罪了,諸位前輩,有人肯真心實(shí)意的幫幫我嗎?多謝了。 |
|
| 11樓: | >>參與討論 |
| 作者: computer00 于 2005/11/18 9:23:00 發(fā)布:
去看看hotpower給你介紹的那個吧,估計(jì)能看懂。然后自己改改 |
|
| 12樓: | >>參與討論 |
| 作者: javie 于 2005/11/18 12:45:00 發(fā)布:
發(fā)燒了,37.8 看不懂 |
|
| 13樓: | >>參與討論 |
| 作者: hotpower 于 2005/11/18 13:09:00 發(fā)布:
發(fā)燒了,暈 看不懂---眼燒紅了... |
|
| 14樓: | >>參與討論 |
| 作者: xsq 于 2005/11/18 23:59:00 發(fā)布:
已經(jīng)通過,你的程序真好,多謝了。 真高手也 |
|
| 15樓: | >>參與討論 |
| 作者: hotpower 于 2005/11/19 0:14:00 發(fā)布:
哈哈,仔細(xì)搜就行了---12232-9/12864通用程序 這里有一個純C的程序(http://www.ouravr.com/bbs/bbs_content.jsp?bbs_sn=208482&bbs_page_no=1&bbs_id=1000) /*------------------------------------------------------------ HS12232-9帶漢字庫的2行7位半漢字LCD模塊WINAVR演示程序 HotPower@126.com 2005.1.15 -------------------------------------------------------------*/ #include <inttypes.h> #include <avr/io.h> #include <avr/interrupt.h> #include <avr/signal.h> #include <avr/wdt.h> #include <avr/ina90.h> #include <avr/eeprom.h> //#include <stdio.h> #include <avr/delay.h> #define FREQ 8 //Meaga8L,8MHZ #define CS PB2//LCD片選(串行) 0:禁止 1:允許 #define SID PB3//LCD輸入串行數(shù)據(jù)(串行) #define CLK PB5//LCD輸入串行脈沖(串行) #define SS PB2//LCD片選(串行) 0:禁止 1:允許 #define MOSI PB3//LCD輸入串行數(shù)據(jù)(串行) #define SCK PB5//LCD輸入串行脈沖(串行) void PortIoInit(void) { DDRB = 0;//設(shè)置B口全為輸入 DDRC = 0;//設(shè)置C口全為輸入 DDRD = 0;//設(shè)置D口全為輸入 PORTB = 0xff;//設(shè)置B口全部上拉 PORTC = 0xff;//設(shè)置C口全部上拉 PORTD = 0xff;//設(shè)置D口全部上拉 } void SPI_MasterInit(void) { /* 設(shè)置MOSI 和SCK 及SS 為輸出,其他為輸入 */ DDRB = (1 << MOSI) | (1 << SCK) | (1 << SS); PORTB = (1 << MOSI) | (1 << SCK) | (1 << SS); // PORTB = 0xff; /* 使能SPI 主機(jī)模式,設(shè)置時(shí)鐘速率為fck/16 ,SPI方式0*/ // SPCR = (1 << SPE) | (1 << MSTR) | (1 << SPR0);//不支持!!! /* 使能SPI 主機(jī)模式,設(shè)置時(shí)鐘速率為fck/16 ,SPI方式1*/ // SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPHA) | (1 << SPR0);//支持!!! /* 使能SPI 主機(jī)模式,設(shè)置時(shí)鐘速率為fck/16 ,SPI方式2*/ // SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << SPR0);//不支持!!! /* 使能SPI 主機(jī)模式,設(shè)置時(shí)鐘速率為fck/16 ,SPI方式3*/ SPCR = (1 << SPE) | (1 << MSTR) | (1 << CPOL) | (1 << CPHA) | (1 << SPR0);//支持!!! } void SPI_MasterTransmit(unsigned CHAR cData) { /* 啟動數(shù)據(jù)傳輸 */ SPDR = cData; /* 等待傳輸結(jié)束 */ while(!(SPSR & (1 << SPIF))); } void DelayMs(unsigned int t) { unsigned int i; for(i = 0; i < t; i++) _delay_loop_2(250 * FREQ); } /*-------------------------------------------------------- 發(fā)送8位LCD控制命令 --------------------------------------------------------*/ void LcdSendCommand(unsigned CHAR cCommand) { /*-------------------------------------------------------- 發(fā)送同步脈沖11111 WR(0) RS(0) 0發(fā)送順序從左至右) --------------------------------------------------------*/ PORTB |= (1 << SS);//SS=1,啟動SPI SPI_MasterTransmit(0xf8);//發(fā)送LCD控制命令 SPI_MasterTransmit(cCommand & 0xf0);//發(fā)送高4位LCD控制命令 SPI_MasterTransmit(cCommand << 4);//發(fā)送低4位LCD控制命令 PORTB &= ~(1 << SS);//SS=0,關(guān)閉SPI if (cCommand == 0x01) _delay_loop_2(1600 * FREQ);//1.6mS else _delay_loop_2(72 * FREQ);//ST7920要求等待72uS } /*-------------------------------------------------------- 發(fā)送8位LCD顯示數(shù)據(jù) --------------------------------------------------------*/ void LcdSendData(unsigned CHAR cData) { /*-------------------------------------------------------- 發(fā)送同步脈沖11111 WR(0) RS(0) 0發(fā)送順序從左至右) --------------------------------------------------------*/ PORTB |= (1 << SS);//SS=1,啟動SPI SPI_MasterTransmit(0xfa);//發(fā)送LCD顯示數(shù)據(jù) SPI_MasterTransmit(cData & 0xf0);//發(fā)送高4位LCD顯示數(shù)據(jù) SPI_MasterTransmit(cData << 4);//發(fā)送低4位LCD顯示數(shù)據(jù) PORTB &= ~(1 << SS);//SS=0,關(guān)閉SPI _delay_loop_2(72 * FREQ);//ST7920要求等待延時(shí)72uS } /*--------------------------------------------------- LCD初始化設(shè)置 ----------------------------------------------------*/ void LcdInit(void) { /*--------------------------------------------------- LCD模塊上電等待延時(shí) ----------------------------------------------------*/ DelayMs(1000);//上電等待延時(shí)1000Ms SPI_MasterInit();//SPI初始化 LcdSendCommand(0b00100000);//發(fā)送4位控制命令 // LcdSendCommand(0b00110000);//發(fā)送8位控制命令//與8位4位無關(guān)!!! LcdSendCommand(0b00000010);//發(fā)送位址歸位命令,設(shè)定DDRAM位址計(jì)數(shù)器為0 LcdSendCommand(0b00000100);//發(fā)送進(jìn)入點(diǎn)命令 LcdSendCommand(0b00001100);//發(fā)送開顯示關(guān)光標(biāo)命令 LcdSendCommand(0b00000001);//發(fā)送清除顯示命令 LcdSendCommand(0b10000000);//發(fā)送設(shè)定DDRAM地址0x00命令 } unsigned CHAR SetLCDDISPLAYPos(unsigned CHAR row, unsigned CHAR col) { if ((row < 2) && (col < 8))//漢字字符為2行7.5列(漢字必須偶數(shù)對齊) { LcdSendCommand(0x80 + row * 16 + col);//發(fā)送設(shè)定DDRAM地址row * 16 + col命令 return 1;//成功返回 } else return 0;//失敗返回 } void LCDDISPLAY(unsigned CHAR row, unsigned CHAR col, unsigned CHAR * string) { if (SetLCDDISPLAYPos(row, col)) { LcdSendData(*string); } } void LCDDISPLAYString(unsigned CHAR * string) { while(*string) LcdSendData(*string ++); } //main程序 void main(void) { unsigned CHAR i = 0; PortIoInit(); LcdInit(); // sei(); for(;;) { DelayMs(1000);//上電等待延時(shí)1000Ms if ((i ++ & 0x01) == 0) LcdSendCommand(0b00000001);//發(fā)送清除顯示命令 else { SetLCDDISPLAYPos(0, 1);//漢字定位到上行左端 LCDDISPLAYString("漢字顯示演示"); SetLCDDISPLAYPos(1,0);//字符定位到下行左端 LCDDISPLAYString("123456789ABCDEF");//必須換行 SetLCDDISPLAYPos(1,3);//字符定位到下行左端 LCDDISPLAYString("漢字"); } DelayMs(1000);//上電等待延時(shí)1000Ms DelayMs(1000);//上電等待延時(shí)1000Ms DelayMs(1000);//上電等待延時(shí)1000Ms DelayMs(1000);//上電等待延時(shí)1000Ms } } * - 本貼最后修改時(shí)間:2005-11-19 0:53:31 修改者:hotpower |
|
| 16樓: | >>參與討論 |
| 作者: xsq 于 2005/11/19 6:52:00 發(fā)布:
前輩,還有一事不明啊 您的程序如何顯示一個變量。 這樣好像不行呢,滿屏的亂碼: unsigned CHAR p[]="鳥"; SetLcdDisplayPos(0, 0); LcdDisplayString(*p); 而不寫漢字,寫一個數(shù)字的話,什么也不顯: 而這樣寫,別管是漢字還是數(shù)字,一切OK SetLcdDisplayPos(0, 0); LcdDisplayString("鳥"); 我是剛學(xué),什么也不懂,讓您見笑了,請前輩指點(diǎn)迷經(jīng)啊! * - 本貼最后修改時(shí)間:2005-11-19 8:19:34 修改者:xsq |
|
| 17樓: | >>參與討論 |
| 作者: xsq 于 2005/11/19 9:31:00 發(fā)布:
已經(jīng)解決,謝謝 把這句 LcdDisplayString(*p); 該為 LcdDisplayString(&p); 即可,謝謝您了。 |
|
| 18樓: | >>參與討論 |
| 作者: xsq 于 2005/11/20 9:28:00 發(fā)布:
期待你的圖形驅(qū)動 您的漢字發(fā)送函數(shù)真是太簡潔了, void LcdDisplayString(unsigned CHAR * string) { while(*string) LcdSendData(*string ++); } 簡潔的讓人難以置信,難道AVR知道這款LCD的編碼方法嗎?請大師指點(diǎn)一二,另外,再請問一下,你有該LCD的圖形C源程序嗎?不好意思,我想要。 |
|
| 19樓: | >>參與討論 |
| 作者: hotpower 于 2005/11/20 11:53:00 發(fā)布:
注意指針和變量的不同 |
|
|
|
| 免費(fèi)注冊為維庫電子開發(fā)網(wǎng)會員,參與電子工程師社區(qū)討論,點(diǎn)此進(jìn)入 |
Copyright © 1998-2006 m.58mhw.cn 浙ICP證030469號 |