This program is for SG12864A(128 x 64 mono-LCD display) with Starboard Orange. Many of source code is referred from below website(in Japanese). (http://www.picfun.com/PIC24H/app24H01.html) Connection between SG12864A and mbed: (these connection are defined in SG12864A.h) pin1(VSS) pin2(VDD) : 5V pin3(V0) : pin4(DI) : p23 pin5(RW): p22 pin6(E): p21 pin7(DB0):p20 pin8(DB1):p19 pin9(DB2):p14 pin10(DB3):p13 pin11(DB4):p12 pin12(DB5):p11 pin13(DB6):p10 pin14(DB7):p9 pin15(CS1):p17 pin16(CS2):p16 pin17(RST):p15 pin18:VOUT pin19:LED Anode pin20:LED Cathode Note: lcd_Line function is not correct(maybe)... Other function is correctly working.
Diff: SG12864A.cpp
- Revision:
- 0:d0cd5139479f
diff -r 000000000000 -r d0cd5139479f SG12864A.cpp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/SG12864A.cpp Sun Jan 09 11:44:15 2011 +0000 @@ -0,0 +1,276 @@ +// +// +// + +#include "SG12864A.h" +#include "font.h" + + + SG12864A::SG12864A() : DI_OUT(DI), RW_OUT(RW), E_OUT(E), DB_OUT(DB0,DB1,DB2,DB3,DB4,DB5,DB6,DB7), + CS1_OUT(CS1),CS2_OUT(CS2),RST_OUT(RST) + { DI_OUT = 0x01;RW_OUT = 0x01; E_OUT = 0x00; + DB_OUT = 0x00; + DB_OUT.output(); + CS1_OUT= 0x01; CS2_OUT=0x01; RST_OUT=0x01; + //t.attach( this, &SG12864A::display, ReflashRate ); + } +//Data output function +void SG12864A::lcd_Write(char cs, char code, char DIflag){ + int data; + DB_OUT.output(); + RW_OUT = 0; + if(cs==1) + CS1_OUT=0; + else + CS2_OUT=0; + data = (int)code; + //DB_OUT = (DB_OUT & 0x00FF) | ((data<<8) & 0xFF00); + DB_OUT = data & 0x00FF; + if(DIflag == 0) + DI_OUT = 1; + else + DI_OUT = 0; + wait_us(1); + E_OUT = 1; + wait_us(1); + E_OUT = 0; + CS1_OUT = 1; + CS2_OUT = 1; + RW_OUT = 1; + wait_us(5); + } + + // Data Read Function + char SG12864A::lcd_Read(char cs){ + int data; + DB_OUT.input(); + RW_OUT = 1; + if(cs==1) + CS1_OUT = 0; + else + CS2_OUT = 0; + DI_OUT = 1; + wait_us(1); + E_OUT = 1; + wait_us(1); + E_OUT = 0; + wait_us(3); + //data = (DB_OUT >>8 ) & 0x00FF; + data = DB_OUT & 0x00FF; + wait_us(1); + CS1_OUT = 1; + CS2_OUT = 1; + DB_OUT.output(); + return((char)data); + } + + // Data Read Function + char SG12864A::lcd_StatusRead(char cs){ + int data; + DB_OUT.input(); + RW_OUT = 1; + if(cs==1) + CS1_OUT = 0; + else + CS2_OUT = 0; + DI_OUT = 0; + wait_us(1); + E_OUT = 1; + wait_us(1); + E_OUT = 0; + wait_us(3); + data = DB_OUT & 0x00FF; + wait_us(1); + CS1_OUT = 1; + CS2_OUT = 1; + DB_OUT.output(); + return((char)data); + } + + // Screen Clear Function +void SG12864A::lcd_Clear(char data){ + char page, colum; + + for(page=0; page<8;page++){ //repeat 8 page + lcd_Write(1,0xB8+page,1); //page set + lcd_Write(1,0x40,1); //column reset + lcd_Write(2,0xB8+page,1); //page set + lcd_Write(2,0x40,1); //column reset + for(colum=0;colum<64;colum++){ //repeat 64column + lcd_Write(1,data,0); //fill data + lcd_Write(2,data,0); //fill data + } + } + + lcd_Write(1,0xC0,1); //reset start line + lcd_Write(2,0xC0,1); +} + +// Initialize Function +void SG12864A::lcd_Init(void){ + RST_OUT = 0; + wait_ms(1000); + RST_OUT = 1; + wait_ms(10); + lcd_Write(1, 0x3F, 1); // Display On + lcd_Write(2, 0x3F, 1); // Display On + lcd_Clear(0); +} + +// Draw Pixel Function + void SG12864A::lcd_Pixel(int Xpos, int Ypos, char On){ + char cs, data, page, pos, count, i; + + /* if colum >127 then do nothing */ + if(Xpos<128){ + if(Xpos>63){ // 64=<colum<=127? + Xpos = Xpos-64; // shift 64 dot + cs = 1; + } + else + cs = 2; + page = (char)(7-Ypos/8); // set page + lcd_Write(cs, 0xB8+page, 1); + lcd_Write(cs, 0x40+Xpos, 1); // set colum + data = lcd_Read(cs); // get current data + lcd_Write(cs, 0x40+Xpos, 1); // set colum ???? + data = lcd_Read(cs); // get current data ???? + pos =1; // set bit position + count = (char)(7-Ypos%8); // set bit + for(i=0; i<count; i++) // caluculate 2^n + pos *= 2; + lcd_Write(cs, 0x40+Xpos, 1); // back address + if(On==1) // set or reset bit + lcd_Write(cs, data | pos, 0); // set 1 + else + lcd_Write(cs, data & ~pos, 0); // set 0 + } +} + +//Draw Straight line Function +#define abs(a) (((a)>0) ? (a) : -(a)) +void SG12864A::lcd_Line(int x0, int y0, int x1, int y1) +{ + + int steep, t; + int deltax, deltay, error; + int x, y; + int ystep; + + /// ·ªÌå«¢Ù¤ðßé + steep = (abs(y1 - y0) > abs(x1 - x0)); + /// AÌüêÖ¦ + if(steep){ + t = x0; x0 = y0; y0 = t; + t = x1; x1 = y1; y1 = t; + } + if(x0 > x1) { + t = x0; x0 = x1; x1 = t; + t = y0; y0 = y1; y1 = t; + } + deltax = x1 - x0; // X«vZ + deltay = abs(y1 - y0); + error = 0; + y = y0; + /// X«ÅXebv̳ðØèÖ¦ + if(y0 < y1) ystep = 1; else ystep = -1; + /// ¼üð_Å`æ + for(x=x0; x<x1; x++) { + if(steep) lcd_Pixel(y,x,1); else lcd_Pixel(x,y,1); + error += deltay; + if((error << 1) >= deltax) { + y += ystep; + error -= deltax; + } + } +} + + +//Display Character Function +void SG12864A::lcd_Char(char line, char colum, int letter){ + char cs, i; + int pos; + + if(colum < 16){ + if(colum >7){ + pos = (colum-8)*8; + cs = 1; + } + else{ + pos = colum*8; + cs = 2; + } + lcd_Write(cs, 0xB8+line,1); + lcd_Write(cs, 0x40+pos,1); + for(i=0; i<5; i++) + lcd_Write(cs,Font[letter-0x20][i],0); + lcd_Write(cs,0,0); + lcd_Write(cs,0,0); + lcd_Write(cs,0,0); + } +} + +// Display Character Function2 +void SG12864A::lcd_Char1(char line, char colum, int letter){ + char cs, i; + int pos; + + if(colum < 18){ + if(colum > 8){ + pos = (colum- 9) * 7; + cs = 1; + } + else{ + pos = colum * 7; + cs = 2; + } + lcd_Write(cs, 0xB8+line, 1); // set page + lcd_Write(cs, 0x40+pos, 1); // set colum + for(i=0; i<5; i++) + lcd_Write(cs, Font[letter-0x20][i], 0); + lcd_Write(cs, 0, 0); + lcd_Write(cs, 0, 0); + } +} + +// Display Char Srings Function +void SG12864A::lcd_Str(char line, char colum, char *s) +{ + while(*s) + SG12864A::lcd_Char1(line, colum++, *s++); +} + +// Display Image Function +void SG12864A::lcd_Image(char *ptr) +{ + char cs, Xpos; + int page, colum; + + for(page=0; page<8; page++){ + for(colum=0; colum<128; colum++){ + if(colum > 63){ + Xpos=colum-64; + cs = 1; + } + else{ + Xpos = colum; + cs = 2; + } + lcd_Write(cs, 0xB8+page, 1); + lcd_Write(cs, 0x40+Xpos, 1); + lcd_Write(cs, *ptr++, 0); + } + } +} + +//Scroll Function +void SG12864A::lcd_Scroll(int delay){ + int i; + + for(i=0; i<64; i++){ + lcd_Write(1, 0xC0+i,1); + lcd_Write(2, 0xC0+i,1); + wait_ms(delay); + } +} + \ No newline at end of file