m128的特點是io口很多,所以我們可以用并行的方式來驅(qū)動此液晶屏,增加總線的速度,此程序是是網(wǎng)上整理收集而來,但已經(jīng)通過本人驗證可以使用,故在此發(fā)表.大家在應(yīng)用的時候只需更改相應(yīng)的io就行了.
軟件:GCC V4.20 --------------------------------------------------------------- 實驗內(nèi)容:寫Lcd12864_ST7920。 --------------------------------------------------------------- 硬件連接: LCD12864_ST7920 ATmega128 1.GND -------- GND 2.VCC -------- VCC 3.V0 -------- NC 4.RS(CS) -------- PD7 5.R/W(SID) -------- PG0 6.E(SCLK) -------- PG1 7.D0 -------- PC0 8.D1 -------- PC1 9.D2 -------- PC2 10.D3 -------- PC3 11.D4 -------- PC4 12.D5 -------- PC5 13.D6 -------- PC6 14.D7 -------- PC7 15.PSB -------- VCC 16.NC -------- NC 17.RST -------- VCC 18.NC -------- NC 19.LED+ -------- VCC 20.LED- -------- GND 以下是程序源代碼: ---------------------------------------------------------------*/ #include <avr/io.h> #include<avr/pgmspace.h> #include <util/delay.h> #define E_set PORTG|=_BV(PG1) //液晶使能 #define E_clear PORTG&=~_BV(PG1) #define RW_set PORTG|=_BV(PG0) //液晶讀寫 #define RW_clear PORTG&=~_BV(PG0) #define RS_set PORTD|=_BV(PD7) //液晶數(shù)據(jù) #define RS_clear PORTD&=~_BV(PD7) //液晶指令 unsigned char j=0; unsigned char yb=0x80; unsigned char name00[] PROGMEM={"飛射白鹿雪連天,"}; unsigned char name01[] PROGMEM={"笑書神俠倚碧鴛。"}; unsigned char name02[] PROGMEM={"自古英雄多奇逸,"}; unsigned char name03[] PROGMEM={"金老揮毫盡使然。"}; unsigned char name10[] PROGMEM={"李白乘舟將欲行,"}; unsigned char name11[] PROGMEM={"忽聞岸上踏歌聲。"}; unsigned char name12[] PROGMEM={"桃花潭水深千尺,"}; unsigned char name13[] PROGMEM={"不及汪倫送我情。"}; unsigned char name20[] PROGMEM={"this is a 12864 "}; unsigned char name21[] PROGMEM={"display program,"}; unsigned char name22[] PROGMEM={"welcome to commu"}; unsigned char name23[] PROGMEM={"nicate with me! "}; void wr_com(unsigned char); void wr_data(unsigned char); void reset (void); void outChinese(unsigned char,unsigned char,unsigned char *point); void ydgb(void); void outchar(unsigned char,unsigned char,unsigned char *point); void wr_com(unsigned char value)//寫指令,寫指令時必須為RS=0;RW=0; { E_clear; RS_clear; RW_clear; _delay_ms(1); PORTC=value; //并入字符數(shù)據(jù) E_set; _delay_ms(2); //如果沒有延時就必須要加查忙指令 E_clear; } void wr_data(unsigned char sj)//寫數(shù)據(jù),寫數(shù)據(jù)時必須為 RS=1;RW=0; { E_clear; RS_set; RW_clear; _delay_ms(1); PORTC=sj; E_set; _delay_ms(1);//如果沒有延時就必須要加查忙指令 E_clear; } void reset (void) { wr_com(0x01);//清屏 wr_com(0x08);//關(guān)顯示 wr_com(0x03);//歸位 wr_com(0x30);//功能設(shè)置 wr_com(0x0f);//開顯示 wr_com(0x01);//清屏 } //**************** //outChinese 為函數(shù)名 //place 為顯示地址的首地址 //unit 字符長度 //charcode[] 要顯示數(shù)據(jù)的內(nèi)容 void outChinese(unsigned char place,unsigned char unit,unsigned char *point) { unsigned char i,progdata; wr_com(place); for(i=0;i<unit*2;i++)//一個漢字為兩個字符 { progdata=pgm_read_byte(point+i); wr_data(progdata); } } void outchar(unsigned char place,unsigned char unit,unsigned char *point) { unsigned char i,progdata; wr_com(place); for(i=0;i<unit;i++) { progdata=pgm_read_byte(point+i); wr_data(progdata); } } void ydgb(void) { wr_com(yb);//顯示光標位置 yb=yb+0x01; if(yb==0x88){yb=0x90;} if(yb==0x97){yb=0x88;} if(yb==0x8f){yb=0x98;} if(yb==0xa0){yb=0x80;} } void display1(void) { ydgb(); outChinese(0x80,8,name00);//第一行:80-87H outChinese(0x90,8,name01);//第二行:90-97H outChinese(0x88,8,name02);//第三行:88-8FH outChinese(0x98,8,name03);//第四行:98-9FH //outchar(0x9f,2,name4); } void display2(void) { ydgb(); outChinese(0x80,8,name10); outChinese(0x90,8,name11); outChinese(0x88,8,name12); outChinese(0x98,8,name13); } void display3(void) { ydgb(); outchar(0x80,16,name20); outchar(0x90,16,name21); outchar(0x88,16,name22); outchar(0x98,16,name23); } int main(void) { DDRC=0xff; //數(shù)據(jù) PORTC=0x00; DDRG=0xff; //命令 PORTG=0xff; DDRD=0xff; //命令 PORTD=0xff; reset(); while(1) { ydgb(); j++; ydgb(); wr_com(0x01);//清屏 if(j==3)j=0; switch(j) { case 0:display1();break; case 1:display2();break; case 2:display3();break; } _delay_ms(3000); } }