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.

Dependencies:   mbed

SG12864A.cpp

Committer:
y_notsu
Date:
2011-01-09
Revision:
0:d0cd5139479f

File content as of revision 0:d0cd5139479f:

//
//
//

#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‚«ŒvŽZ	
	deltay = abs(y1 - y0);
	error = 0;
	y = y0;
	/// ŒX‚«‚ŃXƒeƒbƒv‚̐³•‰‚ðØ‚è‘Ö‚¦
	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);
    }
}