上排屏幕和下排屏幕重復我就不說了。字體難看我就不說了。這個液晶真是煩人啊,引腳定義都是反的……唉………先放個程序。發現如何setpage,set到0、1沒問題,2、3就顯示不出了。真不知道是我的錯還是液晶的錯。無論是左還是右都一樣。
這個是模擬8080時序的,比6800稍微簡單。在STC89C52 @ 11.0592下通過。
這塊液晶最后還讓我用串口進行調試了,暈。
好吧。附上真正的引腳定義(淘寶賣家那個害死我了):
GND VCC Vo A0 CS1 CS2 CLK(2KHZ的時鐘輸入) RD WR DB0~DB7 RST LED+ LED-
注意在5V系統上用的時候LED+需要串個20~47R的電阻。要不然會嚴重發熱。
CLK不能直接接單片機的ALE腳,否則不會有任何顯示(那個是2M)
RESET無法拉高所以6800時序沒法用。只能用8080時序。
貌似上下兩排顯示公用一個VRAM。我現在還沒找到解決顯示重復的辦法……
順帶提醒一下,這個液晶的視角很窄,所以更加建議使用3塊錢紫晶的。更便宜更好用,資料也比較齊全。
全部的完整源代碼從http://www.zg4o1577.cn/f/12232ces.rar 這里下載
/*------ *FILE main.c * 測試驅動12232 * 萬致遠@rwzy.co.cc */ #include <at89x52.h> #include <type-def.h> #include <stdio.h> /*-----DEVICE IO Pin map. * NMTB-S000389FGHSAY-A * 死馬當活馬醫吧。! * 時序68 series */ //仿二進制賦值 #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定時器值 #define LCD_RESET 0xE2 //復位 #define LCD_DISPLAY_ON 0xAF //顯示開 #define LCD_DISPLAY_OFF 0xAE //顯示關 #define LCD_PS_ON 0xA5 //節電驅動 #define LCD_PS_OFF 0xA4 //正常驅動 #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轉到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計數器模式,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數據,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時序 printf("Status(Chip1):0x%X\n",Read_Status(0)); printf("Status(Chip2):0x%X\n",Read_Status(1)); Both_Write_Cmd(LCD_RESET);//軟復位 printf("Status(Chip1):0x%X\n",Read_Status(0)); printf("Status(Chip2):0x%X\n",Read_Status(1)); Both_Write_Cmd(LCD_PS_OFF);//正常驅動 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();//啟動定時器 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) { } }