上排屏幕和下排屏幕重復(fù)我就不說了。字體難看我就不說了。這個(gè)液晶真是煩人啊,引腳定義都是反的……唉………先放個(gè)程序。發(fā)現(xiàn)如何setpage,set到0、1沒問題,2、3就顯示不出了。真不知道是我的錯(cuò)還是液晶的錯(cuò)。無論是左還是右都一樣。
這個(gè)是模擬8080時(shí)序的,比6800稍微簡(jiǎn)單。在STC89C52 @ 11.0592下通過。
這塊液晶最后還讓我用串口進(jìn)行調(diào)試了,暈。
好吧。附上真正的引腳定義(淘寶賣家那個(gè)害死我了):
GND VCC Vo A0 CS1 CS2 CLK(2KHZ的時(shí)鐘輸入) RD WR DB0~DB7 RST LED+ LED-
注意在5V系統(tǒng)上用的時(shí)候LED+需要串個(gè)20~47R的電阻。要不然會(huì)嚴(yán)重發(fā)熱。
CLK不能直接接單片機(jī)的ALE腳,否則不會(huì)有任何顯示(那個(gè)是2M)
RESET無法拉高所以6800時(shí)序沒法用。只能用8080時(shí)序。
貌似上下兩排顯示公用一個(gè)VRAM。我現(xiàn)在還沒找到解決顯示重復(fù)的辦法……
順帶提醒一下,這個(gè)液晶的視角很窄,所以更加建議使用3塊錢紫晶的。更便宜更好用,資料也比較齊全。
全部的完整源代碼從http://www.zg4o1577.cn/f/12232ces.rar 這里下載
/*------ *FILE main.c * 測(cè)試驅(qū)動(dòng)12232 * 萬致遠(yuǎn)@rwzy.co.cc */ #include <at89x52.h> #include <type-def.h> #include <stdio.h> /*-----DEVICE IO Pin map. * NMTB-S000389FGHSAY-A * 死馬當(dāng)活馬醫(yī)吧!!! * 時(shí)序68 series */ //仿二進(jìn)制賦值 #define HEX__(n) 0x##n##UL #define B8__(x) ( (x & 0x0000000FUL) ? 1:0 )\ +( (x & 0x000000F0UL) ? 2:0 )\ +( (x & 0x00000F00UL) ? 4:0 )\ +( (x & 0x0000F000UL) ? 8:0 )\ +( (x & 0x000F0000UL) ? 16:0 )\ +( (x & 0x00F00000UL) ? 32:0 )\ +( (x & 0x0F000000UL) ? 64:0 )\ +( (x & 0xF0000000UL) ? 128:0 ) #define B8(x) ((unsigned char)B8__(HEX__(x))) #define B16(x_msb,x_lsb) (((unsigned int)B8(x_msb)<<8) + B8(x_lsb)) #define B32(x_msb,x_2,x_3,x_lsb) (((unsigned long)B8(x_msb)<<24) + ((unsigned long)B8(x_2)<<16) + ((unsigned long)B8(x_3)<<8) + B8(x_lsb)) #define TH 0xFE #define TL 0x40//2K定時(shí)器值 #define LCD_RESET 0xE2 //復(fù)位 #define LCD_DISPLAY_ON 0xAF //顯示開 #define LCD_DISPLAY_OFF 0xAE //顯示關(guān) #define LCD_PS_ON 0xA5 //節(jié)電驅(qū)動(dòng) #define LCD_PS_OFF 0xA4 //正常驅(qū)動(dòng) #define LCD_DUTY16 0xA8 //占空比1/16 #define LCD_DUTY32 0xA9 //占空比1/32 #define LCD_END 0xEE #define LCD_RWMODE 0xE0 #define LCD_LINE0 0xC0 //開始行 #define LCD_PAGE0 0xB8 //開始頁 #define LCD_COLUMN0 0x00 //開始列 #define Both_Write_Cmd(cmd) LCD_Write(0,0,cmd);LCD_Write(1,0,cmd) #define Both_Write_Data(dat) LCD_Write(0,1,dat);LCD_Write(1,1,dat) #define CLK P1_3 #define RESET P1_6 #define A0 P1_0 #define E1 P1_2 #define E2 P1_1 #define LCD_RD P1_4 #define LCD_WR P1_5 #define DATA P0 //渣字庫,從16x8轉(zhuǎn)到8x8 unsigned char __code ASCII[][8]={ {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, {0x0,0x0,0xE,0xFF,0xFF,0xE,0x0,0x0}, {0x0,0x3,0x7,0x0,0x0,0x7,0x3,0x0}, {0x8,0xFE,0xFE,0x8,0xFE,0xFE,0x8,0x0}, {0xE,0x9F,0x91,0x91,0x91,0xF3,0x66,0x0}, {0x8C,0xC,0x40,0x60,0x30,0x98,0x8C,0x0}, {0x60,0xF6,0x9F,0xB9,0x6F,0xF6,0x90,0x0}, {0x0,0x4,0x7,0x3,0x0,0x0,0x0,0x0}, {0x0,0x0,0x7C,0x7E,0x83,0x81,0x0,0x0}, {0x0,0x0,0x81,0x83,0x7E,0x7C,0x0,0x0}, {0x20,0x28,0x78,0x70,0x70,0x78,0x28,0x20}, {0x0,0x20,0x20,0x78,0x78,0x20,0x20,0x0}, {0x0,0x0,0x0,0x80,0x80,0x0,0x0,0x0}, {0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x0}, {0x0,0x0,0x0,0x80,0x80,0x0,0x0,0x0}, {0x80,0x0,0x40,0x60,0x30,0x18,0xC,0x0}, {0x7C,0x7E,0x83,0xB1,0x83,0x7E,0x7C,0x0}, {0x0,0x84,0x86,0xFF,0xFF,0x80,0x80,0x0}, {0x82,0xC3,0xE1,0xB1,0x99,0x8F,0x86,0x0}, {0x2,0x83,0x91,0x91,0x91,0xFF,0x6E,0x0}, {0x30,0x38,0x2C,0xA6,0xFF,0xFF,0xA0,0x0}, {0x1F,0x9F,0x91,0x91,0x91,0xF1,0x61,0x0}, {0x7C,0xFE,0x93,0x91,0x91,0xF0,0x60,0x0}, {0x3,0x3,0xC1,0xE1,0x31,0x1F,0xF,0x0}, {0x6E,0xFF,0x91,0x91,0x91,0xFF,0x6E,0x0}, {0xE,0x9F,0x91,0x91,0x91,0x7F,0x7E,0x0}, {0x0,0x0,0x0,0xC,0xC,0x0,0x0,0x0}, {0x0,0x0,0x80,0x8C,0xC,0x0,0x0,0x0}, {0x0,0x20,0x70,0x58,0xC,0x86,0x82,0x0}, {0x0,0x48,0x48,0x48,0x48,0x48,0x48,0x0}, {0x0,0x82,0x86,0xC,0x58,0x70,0x20,0x0}, {0x6,0x7,0x1,0xF1,0xF9,0xF,0x6,0x0}, {0x7C,0xFE,0x82,0xF2,0xF2,0xFE,0x7C,0x0}, {0xF8,0xFC,0x26,0x23,0x26,0xFC,0xF8,0x0}, {0x81,0xFF,0xFF,0x91,0x91,0xFF,0x6E,0x0}, {0x7C,0x7E,0x83,0x81,0x81,0x83,0x6,0x0}, {0x81,0xFF,0xFF,0x81,0x83,0x7E,0x7C,0x0}, {0x81,0xFF,0xFF,0x91,0xB9,0x83,0x87,0x0}, {0x81,0xFF,0xFF,0x91,0x39,0x3,0x7,0x0}, {0x7C,0x7E,0x83,0xA1,0xA1,0x63,0xE6,0x0}, {0xFF,0xFF,0x10,0x10,0x10,0xFF,0xFF,0x0}, {0x0,0x0,0x81,0xFF,0xFF,0x81,0x0,0x0}, {0x40,0xC0,0x80,0x81,0xFF,0x7F,0x1,0x0}, {0x81,0xFF,0xFF,0x30,0x78,0xCF,0x87,0x0}, {0x81,0xFF,0xFF,0x81,0x80,0x80,0x80,0x0}, {0xFF,0xFF,0xE,0x1C,0xE,0xFF,0xFF,0x0}, {0xFF,0xFF,0xE,0x1C,0x38,0xFF,0xFF,0x0}, {0x7E,0xFF,0x81,0x81,0x81,0xFF,0x7E,0x0}, {0x81,0xFF,0xFF,0x91,0x11,0x1F,0xE,0x0}, {0x7E,0xFF,0x81,0x81,0x81,0xFF,0x7E,0x0}, {0x81,0xFF,0xFF,0x11,0x31,0xFF,0xCE,0x0}, {0x6,0x8F,0x99,0x91,0xB1,0xE7,0x46,0x0}, {0x0,0x7,0x83,0xFF,0xFF,0x83,0x7,0x0}, {0x7F,0xFF,0x80,0x80,0x80,0xFF,0x7F,0x0}, {0x7F,0x7F,0x0,0x80,0x0,0x7F,0x7F,0x0}, {0x7F,0xFF,0x80,0x70,0x80,0xFF,0x7F,0x0}, {0x83,0xCF,0x7C,0x78,0x7C,0xCF,0x83,0x0}, {0x0,0xF,0x9F,0xF0,0xF0,0x9F,0xF,0x0}, {0x87,0xC3,0xE1,0xB1,0x99,0x8F,0x87,0x0}, {0x0,0x0,0xFF,0xFF,0x81,0x81,0x0,0x0}, {0xE,0x1C,0x38,0x70,0x60,0x40,0x80,0x0}, {0x0,0x0,0x81,0x81,0xFF,0xFF,0x0,0x0}, {0x2,0x3,0x1,0x0,0x1,0x3,0x2,0x0}, {0x0,0x0,0x0,0x0,0x0,0x0,0x0,0x0}, {0x0,0x0,0x0,0x1,0x1,0x0,0x0,0x0}, {0x40,0xE8,0xA8,0xA8,0x78,0xF0,0x80,0x0}, {0x1,0xFF,0xFF,0x88,0x98,0xF0,0x60,0x0}, {0x70,0xF8,0x88,0x88,0x88,0x98,0x10,0x0}, {0x60,0xF0,0x98,0x89,0x7F,0xFF,0x80,0x0}, {0x70,0xF8,0xA8,0xA8,0xA8,0xB8,0x30,0x0}, {0x90,0xFE,0xFF,0x91,0x3,0x6,0x0,0x0}, {0x70,0xF8,0x88,0x88,0xF0,0xF8,0x8,0x0}, {0x81,0xFF,0xFF,0x10,0x8,0xF8,0xF0,0x0}, {0x0,0x0,0x88,0xFB,0xFB,0x80,0x0,0x0}, {0x0,0x0,0x0,0x0,0x8,0xFB,0xFB,0x0}, {0x81,0xFF,0xFF,0x60,0x70,0x98,0x88,0x0}, {0x0,0x0,0x81,0xFF,0xFF,0x80,0x0,0x0}, {0xF8,0xF8,0x18,0x70,0x18,0xF8,0xF0,0x0}, {0x8,0xF8,0xF0,0x8,0x8,0xF8,0xF0,0x0}, {0x70,0xF8,0x88,0x88,0x88,0xF8,0x70,0x0}, {0x8,0xF8,0xF0,0x88,0x88,0xF8,0x70,0x0}, {0x70,0xF8,0x88,0x88,0xF0,0xF8,0x8,0x0}, {0x88,0xF8,0xF0,0x98,0x8,0x38,0x30,0x0}, {0x10,0xB8,0xE8,0xC8,0xC8,0x98,0x10,0x0}, {0x8,0x8,0x7E,0xFF,0x88,0x88,0x0,0x0}, {0x78,0xF8,0x80,0x80,0x78,0xF8,0x80,0x0}, {0x0,0x78,0x78,0x80,0x80,0x78,0x78,0x0}, {0x78,0xF8,0x80,0x60,0x80,0xF8,0x78,0x0}, {0x88,0x98,0x70,0x60,0x70,0x98,0x88,0x0}, {0x78,0xF8,0x80,0x80,0x80,0xF8,0xF8,0x0}, {0x98,0x98,0xC8,0xE8,0xB8,0x98,0x88,0x0}, {0x0,0x10,0x10,0x7E,0xEF,0x81,0x81,0x0}, {0x0,0x0,0x0,0xEF,0xEF,0x0,0x0,0x0}, {0x0,0x81,0x81,0xEF,0x7E,0x10,0x10,0x0}, {0x2,0x3,0x1,0x3,0x2,0x3,0x1,0x0} }; void OutCLK() __interrupt 1 __using 1//CLK out 2kHz { TF0=0;//CLR TR0=0; EA=0; TH0=TH;TL0=TL; CLK=!CLK; TR0=1; EA=1; } void Delay_ms(UINT x) { UINT y; while(x--) { for(y=0;y<600;y++); } } void Init_Timer() { TMOD=0x21;//T0計(jì)數(shù)器模式,T1八位重載模式 TH0=TH; TL0=TL; TR0=1; ET0=1; SCON = 0x50; TH1 = 0xFF; //57600 TL1 = 0xFF; TR1 = 1; PCON=PCON|0x80;//波特率加倍 EA=1; } void putchar(char s) { SBUF=s; while(!TI); TI=0; } BYTE Read_Status(BOOL right) { BYTE tData; DATA=0xff; LCD_WR=1; LCD_RD=0; A0=0; if(right) { E1=0; } else { E2=0; } tData=DATA; if(right) { E1=1; } else { E2=1; } LCD_RD=1; A0=1; return tData; } void LCD_Write(BOOL right,BOOL disp,BYTE Data) {//模擬8080 /*BYTE rTemp=0xff; while(rTemp & 0x7F) { rTemp=Read_Status(right); }*/ if(right) { E1=0; } else { E2=0; } A0=disp;//disp=1數(shù)據(jù),disp=0顯示 P0=Data; LCD_RD=1; LCD_WR=0; __asm NOP __endasm; LCD_WR=1; if(right) { E1=1; } else { E2=1; } __asm NOP NOP NOP NOP NOP __endasm; } BYTE LCD_Read(BOOL right) {//模擬8080 BYTE tData; if(right) { E1=0; } else { E2=0; } P0=0xFF; LCD_WR=1; LCD_RD=0; tData=P0; LCD_RD=1; if(right) { E1=1; } else { E2=1; } return tData; } void SetPage(BYTE page0,BYTE page1) { LCD_Write(0,0,0xB8|page1); LCD_Write(1,0,0xB8|page0); } void SetAddress(BYTE address0,BYTE address1) { LCD_Write(0,0,address1); LCD_Write(1,0,address0); } void clrscr(void) { BYTE i; BYTE page; for (page=0;page<4;page++) { SetPage(page,page); SetAddress(0,0); for (i=0;i<61;i++) { Both_Write_Data(0x00); } } } void Init_LCD() { RESET=1; RESET=0;//8080時(shí)序 printf("Status(Chip1):0x%X\n",Read_Status(0)); printf("Status(Chip2):0x%X\n",Read_Status(1)); Both_Write_Cmd(LCD_RESET);//軟復(fù)位 printf("Status(Chip1):0x%X\n",Read_Status(0)); printf("Status(Chip2):0x%X\n",Read_Status(1)); Both_Write_Cmd(LCD_PS_OFF);//正常驅(qū)動(dòng) Both_Write_Cmd(LCD_DISPLAY_ON);//開顯示 Both_Write_Cmd(LCD_DUTY16);//32%占空比 printf("Status(Chip1):0x%X\n",Read_Status(0)); printf("Status(Chip2):0x%X\n",Read_Status(1)); } /* * CODE: A0 /RD /WR D7 D6 D5 D4 D3 D2 D1 D0 L L H BUSY ADC ON/OFF RESET LLLL */ void Draw8(BOOL right,BYTE Asc) { BYTE i; for(i=0;i<8;i++) { LCD_Write(right,1,ASCII[Asc-32][i]); } } void printstr(BOOL right,BYTE *str) { while(*str!='\0') { Draw8(right,*str); str++; } } void main() { BYTE i; BYTE page; Init_Timer();//啟動(dòng)定時(shí)器 printf("System started.\n"); Init_LCD(); //Set_xyPos_LCD(0,0); //LCD_Write(0,1,0xff); //printstr("THELL"); clrscr(); page=0; SetPage(page,page); SetAddress(0,0); /*for (i=0;i<61;i++) { Both_Write_Data(0xFF); }*/ printstr(0,"Hello"); page=1; SetPage(page,page); SetAddress(0,0); printstr(0,"world!"); page=2; SetPage(page,page); SetAddress(0,0); printstr(0,"are you?"); while(1) { } }