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

Committer:
y_notsu
Date:
Sun Jan 09 11:44:15 2011 +0000
Revision:
0:d0cd5139479f
0.1(first release)

Who changed what in which revision?

UserRevisionLine numberNew contents of line
y_notsu 0:d0cd5139479f 1 //
y_notsu 0:d0cd5139479f 2 //
y_notsu 0:d0cd5139479f 3 //
y_notsu 0:d0cd5139479f 4
y_notsu 0:d0cd5139479f 5 #include "SG12864A.h"
y_notsu 0:d0cd5139479f 6 #include "font.h"
y_notsu 0:d0cd5139479f 7
y_notsu 0:d0cd5139479f 8
y_notsu 0:d0cd5139479f 9 SG12864A::SG12864A() : DI_OUT(DI), RW_OUT(RW), E_OUT(E), DB_OUT(DB0,DB1,DB2,DB3,DB4,DB5,DB6,DB7),
y_notsu 0:d0cd5139479f 10 CS1_OUT(CS1),CS2_OUT(CS2),RST_OUT(RST)
y_notsu 0:d0cd5139479f 11 { DI_OUT = 0x01;RW_OUT = 0x01; E_OUT = 0x00;
y_notsu 0:d0cd5139479f 12 DB_OUT = 0x00;
y_notsu 0:d0cd5139479f 13 DB_OUT.output();
y_notsu 0:d0cd5139479f 14 CS1_OUT= 0x01; CS2_OUT=0x01; RST_OUT=0x01;
y_notsu 0:d0cd5139479f 15 //t.attach( this, &SG12864A::display, ReflashRate );
y_notsu 0:d0cd5139479f 16 }
y_notsu 0:d0cd5139479f 17 //Data output function
y_notsu 0:d0cd5139479f 18 void SG12864A::lcd_Write(char cs, char code, char DIflag){
y_notsu 0:d0cd5139479f 19 int data;
y_notsu 0:d0cd5139479f 20 DB_OUT.output();
y_notsu 0:d0cd5139479f 21 RW_OUT = 0;
y_notsu 0:d0cd5139479f 22 if(cs==1)
y_notsu 0:d0cd5139479f 23 CS1_OUT=0;
y_notsu 0:d0cd5139479f 24 else
y_notsu 0:d0cd5139479f 25 CS2_OUT=0;
y_notsu 0:d0cd5139479f 26 data = (int)code;
y_notsu 0:d0cd5139479f 27 //DB_OUT = (DB_OUT & 0x00FF) | ((data<<8) & 0xFF00);
y_notsu 0:d0cd5139479f 28 DB_OUT = data & 0x00FF;
y_notsu 0:d0cd5139479f 29 if(DIflag == 0)
y_notsu 0:d0cd5139479f 30 DI_OUT = 1;
y_notsu 0:d0cd5139479f 31 else
y_notsu 0:d0cd5139479f 32 DI_OUT = 0;
y_notsu 0:d0cd5139479f 33 wait_us(1);
y_notsu 0:d0cd5139479f 34 E_OUT = 1;
y_notsu 0:d0cd5139479f 35 wait_us(1);
y_notsu 0:d0cd5139479f 36 E_OUT = 0;
y_notsu 0:d0cd5139479f 37 CS1_OUT = 1;
y_notsu 0:d0cd5139479f 38 CS2_OUT = 1;
y_notsu 0:d0cd5139479f 39 RW_OUT = 1;
y_notsu 0:d0cd5139479f 40 wait_us(5);
y_notsu 0:d0cd5139479f 41 }
y_notsu 0:d0cd5139479f 42
y_notsu 0:d0cd5139479f 43 // Data Read Function
y_notsu 0:d0cd5139479f 44 char SG12864A::lcd_Read(char cs){
y_notsu 0:d0cd5139479f 45 int data;
y_notsu 0:d0cd5139479f 46 DB_OUT.input();
y_notsu 0:d0cd5139479f 47 RW_OUT = 1;
y_notsu 0:d0cd5139479f 48 if(cs==1)
y_notsu 0:d0cd5139479f 49 CS1_OUT = 0;
y_notsu 0:d0cd5139479f 50 else
y_notsu 0:d0cd5139479f 51 CS2_OUT = 0;
y_notsu 0:d0cd5139479f 52 DI_OUT = 1;
y_notsu 0:d0cd5139479f 53 wait_us(1);
y_notsu 0:d0cd5139479f 54 E_OUT = 1;
y_notsu 0:d0cd5139479f 55 wait_us(1);
y_notsu 0:d0cd5139479f 56 E_OUT = 0;
y_notsu 0:d0cd5139479f 57 wait_us(3);
y_notsu 0:d0cd5139479f 58 //data = (DB_OUT >>8 ) & 0x00FF;
y_notsu 0:d0cd5139479f 59 data = DB_OUT & 0x00FF;
y_notsu 0:d0cd5139479f 60 wait_us(1);
y_notsu 0:d0cd5139479f 61 CS1_OUT = 1;
y_notsu 0:d0cd5139479f 62 CS2_OUT = 1;
y_notsu 0:d0cd5139479f 63 DB_OUT.output();
y_notsu 0:d0cd5139479f 64 return((char)data);
y_notsu 0:d0cd5139479f 65 }
y_notsu 0:d0cd5139479f 66
y_notsu 0:d0cd5139479f 67 // Data Read Function
y_notsu 0:d0cd5139479f 68 char SG12864A::lcd_StatusRead(char cs){
y_notsu 0:d0cd5139479f 69 int data;
y_notsu 0:d0cd5139479f 70 DB_OUT.input();
y_notsu 0:d0cd5139479f 71 RW_OUT = 1;
y_notsu 0:d0cd5139479f 72 if(cs==1)
y_notsu 0:d0cd5139479f 73 CS1_OUT = 0;
y_notsu 0:d0cd5139479f 74 else
y_notsu 0:d0cd5139479f 75 CS2_OUT = 0;
y_notsu 0:d0cd5139479f 76 DI_OUT = 0;
y_notsu 0:d0cd5139479f 77 wait_us(1);
y_notsu 0:d0cd5139479f 78 E_OUT = 1;
y_notsu 0:d0cd5139479f 79 wait_us(1);
y_notsu 0:d0cd5139479f 80 E_OUT = 0;
y_notsu 0:d0cd5139479f 81 wait_us(3);
y_notsu 0:d0cd5139479f 82 data = DB_OUT & 0x00FF;
y_notsu 0:d0cd5139479f 83 wait_us(1);
y_notsu 0:d0cd5139479f 84 CS1_OUT = 1;
y_notsu 0:d0cd5139479f 85 CS2_OUT = 1;
y_notsu 0:d0cd5139479f 86 DB_OUT.output();
y_notsu 0:d0cd5139479f 87 return((char)data);
y_notsu 0:d0cd5139479f 88 }
y_notsu 0:d0cd5139479f 89
y_notsu 0:d0cd5139479f 90 // Screen Clear Function
y_notsu 0:d0cd5139479f 91 void SG12864A::lcd_Clear(char data){
y_notsu 0:d0cd5139479f 92 char page, colum;
y_notsu 0:d0cd5139479f 93
y_notsu 0:d0cd5139479f 94 for(page=0; page<8;page++){ //repeat 8 page
y_notsu 0:d0cd5139479f 95 lcd_Write(1,0xB8+page,1); //page set
y_notsu 0:d0cd5139479f 96 lcd_Write(1,0x40,1); //column reset
y_notsu 0:d0cd5139479f 97 lcd_Write(2,0xB8+page,1); //page set
y_notsu 0:d0cd5139479f 98 lcd_Write(2,0x40,1); //column reset
y_notsu 0:d0cd5139479f 99 for(colum=0;colum<64;colum++){ //repeat 64column
y_notsu 0:d0cd5139479f 100 lcd_Write(1,data,0); //fill data
y_notsu 0:d0cd5139479f 101 lcd_Write(2,data,0); //fill data
y_notsu 0:d0cd5139479f 102 }
y_notsu 0:d0cd5139479f 103 }
y_notsu 0:d0cd5139479f 104
y_notsu 0:d0cd5139479f 105 lcd_Write(1,0xC0,1); //reset start line
y_notsu 0:d0cd5139479f 106 lcd_Write(2,0xC0,1);
y_notsu 0:d0cd5139479f 107 }
y_notsu 0:d0cd5139479f 108
y_notsu 0:d0cd5139479f 109 // Initialize Function
y_notsu 0:d0cd5139479f 110 void SG12864A::lcd_Init(void){
y_notsu 0:d0cd5139479f 111 RST_OUT = 0;
y_notsu 0:d0cd5139479f 112 wait_ms(1000);
y_notsu 0:d0cd5139479f 113 RST_OUT = 1;
y_notsu 0:d0cd5139479f 114 wait_ms(10);
y_notsu 0:d0cd5139479f 115 lcd_Write(1, 0x3F, 1); // Display On
y_notsu 0:d0cd5139479f 116 lcd_Write(2, 0x3F, 1); // Display On
y_notsu 0:d0cd5139479f 117 lcd_Clear(0);
y_notsu 0:d0cd5139479f 118 }
y_notsu 0:d0cd5139479f 119
y_notsu 0:d0cd5139479f 120 // Draw Pixel Function
y_notsu 0:d0cd5139479f 121 void SG12864A::lcd_Pixel(int Xpos, int Ypos, char On){
y_notsu 0:d0cd5139479f 122 char cs, data, page, pos, count, i;
y_notsu 0:d0cd5139479f 123
y_notsu 0:d0cd5139479f 124 /* if colum >127 then do nothing */
y_notsu 0:d0cd5139479f 125 if(Xpos<128){
y_notsu 0:d0cd5139479f 126 if(Xpos>63){ // 64=<colum<=127?
y_notsu 0:d0cd5139479f 127 Xpos = Xpos-64; // shift 64 dot
y_notsu 0:d0cd5139479f 128 cs = 1;
y_notsu 0:d0cd5139479f 129 }
y_notsu 0:d0cd5139479f 130 else
y_notsu 0:d0cd5139479f 131 cs = 2;
y_notsu 0:d0cd5139479f 132 page = (char)(7-Ypos/8); // set page
y_notsu 0:d0cd5139479f 133 lcd_Write(cs, 0xB8+page, 1);
y_notsu 0:d0cd5139479f 134 lcd_Write(cs, 0x40+Xpos, 1); // set colum
y_notsu 0:d0cd5139479f 135 data = lcd_Read(cs); // get current data
y_notsu 0:d0cd5139479f 136 lcd_Write(cs, 0x40+Xpos, 1); // set colum ????
y_notsu 0:d0cd5139479f 137 data = lcd_Read(cs); // get current data ????
y_notsu 0:d0cd5139479f 138 pos =1; // set bit position
y_notsu 0:d0cd5139479f 139 count = (char)(7-Ypos%8); // set bit
y_notsu 0:d0cd5139479f 140 for(i=0; i<count; i++) // caluculate 2^n
y_notsu 0:d0cd5139479f 141 pos *= 2;
y_notsu 0:d0cd5139479f 142 lcd_Write(cs, 0x40+Xpos, 1); // back address
y_notsu 0:d0cd5139479f 143 if(On==1) // set or reset bit
y_notsu 0:d0cd5139479f 144 lcd_Write(cs, data | pos, 0); // set 1
y_notsu 0:d0cd5139479f 145 else
y_notsu 0:d0cd5139479f 146 lcd_Write(cs, data & ~pos, 0); // set 0
y_notsu 0:d0cd5139479f 147 }
y_notsu 0:d0cd5139479f 148 }
y_notsu 0:d0cd5139479f 149
y_notsu 0:d0cd5139479f 150 //Draw Straight line Function
y_notsu 0:d0cd5139479f 151 #define abs(a) (((a)>0) ? (a) : -(a))
y_notsu 0:d0cd5139479f 152 void SG12864A::lcd_Line(int x0, int y0, int x1, int y1)
y_notsu 0:d0cd5139479f 153 {
y_notsu 0:d0cd5139479f 154
y_notsu 0:d0cd5139479f 155 int steep, t;
y_notsu 0:d0cd5139479f 156 int deltax, deltay, error;
y_notsu 0:d0cd5139479f 157 int x, y;
y_notsu 0:d0cd5139479f 158 int ystep;
y_notsu 0:d0cd5139479f 159
y_notsu 0:d0cd5139479f 160 /// ·•ª‚Ì‘å‚«‚¢‚Ù‚¤‚ð‹‚ß‚é
y_notsu 0:d0cd5139479f 161 steep = (abs(y1 - y0) > abs(x1 - x0));
y_notsu 0:d0cd5139479f 162 /// ‚˜A‚™‚Ì“ü‚ê‘Ö‚¦
y_notsu 0:d0cd5139479f 163 if(steep){
y_notsu 0:d0cd5139479f 164 t = x0; x0 = y0; y0 = t;
y_notsu 0:d0cd5139479f 165 t = x1; x1 = y1; y1 = t;
y_notsu 0:d0cd5139479f 166 }
y_notsu 0:d0cd5139479f 167 if(x0 > x1) {
y_notsu 0:d0cd5139479f 168 t = x0; x0 = x1; x1 = t;
y_notsu 0:d0cd5139479f 169 t = y0; y0 = y1; y1 = t;
y_notsu 0:d0cd5139479f 170 }
y_notsu 0:d0cd5139479f 171 deltax = x1 - x0; // ŒX‚«ŒvŽZ
y_notsu 0:d0cd5139479f 172 deltay = abs(y1 - y0);
y_notsu 0:d0cd5139479f 173 error = 0;
y_notsu 0:d0cd5139479f 174 y = y0;
y_notsu 0:d0cd5139479f 175 /// ŒX‚«‚ŃXƒeƒbƒv‚̐³•‰‚ðØ‚è‘Ö‚¦
y_notsu 0:d0cd5139479f 176 if(y0 < y1) ystep = 1; else ystep = -1;
y_notsu 0:d0cd5139479f 177 /// ’¼ü‚ð“_‚Å•`‰æ
y_notsu 0:d0cd5139479f 178 for(x=x0; x<x1; x++) {
y_notsu 0:d0cd5139479f 179 if(steep) lcd_Pixel(y,x,1); else lcd_Pixel(x,y,1);
y_notsu 0:d0cd5139479f 180 error += deltay;
y_notsu 0:d0cd5139479f 181 if((error << 1) >= deltax) {
y_notsu 0:d0cd5139479f 182 y += ystep;
y_notsu 0:d0cd5139479f 183 error -= deltax;
y_notsu 0:d0cd5139479f 184 }
y_notsu 0:d0cd5139479f 185 }
y_notsu 0:d0cd5139479f 186 }
y_notsu 0:d0cd5139479f 187
y_notsu 0:d0cd5139479f 188
y_notsu 0:d0cd5139479f 189 //Display Character Function
y_notsu 0:d0cd5139479f 190 void SG12864A::lcd_Char(char line, char colum, int letter){
y_notsu 0:d0cd5139479f 191 char cs, i;
y_notsu 0:d0cd5139479f 192 int pos;
y_notsu 0:d0cd5139479f 193
y_notsu 0:d0cd5139479f 194 if(colum < 16){
y_notsu 0:d0cd5139479f 195 if(colum >7){
y_notsu 0:d0cd5139479f 196 pos = (colum-8)*8;
y_notsu 0:d0cd5139479f 197 cs = 1;
y_notsu 0:d0cd5139479f 198 }
y_notsu 0:d0cd5139479f 199 else{
y_notsu 0:d0cd5139479f 200 pos = colum*8;
y_notsu 0:d0cd5139479f 201 cs = 2;
y_notsu 0:d0cd5139479f 202 }
y_notsu 0:d0cd5139479f 203 lcd_Write(cs, 0xB8+line,1);
y_notsu 0:d0cd5139479f 204 lcd_Write(cs, 0x40+pos,1);
y_notsu 0:d0cd5139479f 205 for(i=0; i<5; i++)
y_notsu 0:d0cd5139479f 206 lcd_Write(cs,Font[letter-0x20][i],0);
y_notsu 0:d0cd5139479f 207 lcd_Write(cs,0,0);
y_notsu 0:d0cd5139479f 208 lcd_Write(cs,0,0);
y_notsu 0:d0cd5139479f 209 lcd_Write(cs,0,0);
y_notsu 0:d0cd5139479f 210 }
y_notsu 0:d0cd5139479f 211 }
y_notsu 0:d0cd5139479f 212
y_notsu 0:d0cd5139479f 213 // Display Character Function2
y_notsu 0:d0cd5139479f 214 void SG12864A::lcd_Char1(char line, char colum, int letter){
y_notsu 0:d0cd5139479f 215 char cs, i;
y_notsu 0:d0cd5139479f 216 int pos;
y_notsu 0:d0cd5139479f 217
y_notsu 0:d0cd5139479f 218 if(colum < 18){
y_notsu 0:d0cd5139479f 219 if(colum > 8){
y_notsu 0:d0cd5139479f 220 pos = (colum- 9) * 7;
y_notsu 0:d0cd5139479f 221 cs = 1;
y_notsu 0:d0cd5139479f 222 }
y_notsu 0:d0cd5139479f 223 else{
y_notsu 0:d0cd5139479f 224 pos = colum * 7;
y_notsu 0:d0cd5139479f 225 cs = 2;
y_notsu 0:d0cd5139479f 226 }
y_notsu 0:d0cd5139479f 227 lcd_Write(cs, 0xB8+line, 1); // set page
y_notsu 0:d0cd5139479f 228 lcd_Write(cs, 0x40+pos, 1); // set colum
y_notsu 0:d0cd5139479f 229 for(i=0; i<5; i++)
y_notsu 0:d0cd5139479f 230 lcd_Write(cs, Font[letter-0x20][i], 0);
y_notsu 0:d0cd5139479f 231 lcd_Write(cs, 0, 0);
y_notsu 0:d0cd5139479f 232 lcd_Write(cs, 0, 0);
y_notsu 0:d0cd5139479f 233 }
y_notsu 0:d0cd5139479f 234 }
y_notsu 0:d0cd5139479f 235
y_notsu 0:d0cd5139479f 236 // Display Char Srings Function
y_notsu 0:d0cd5139479f 237 void SG12864A::lcd_Str(char line, char colum, char *s)
y_notsu 0:d0cd5139479f 238 {
y_notsu 0:d0cd5139479f 239 while(*s)
y_notsu 0:d0cd5139479f 240 SG12864A::lcd_Char1(line, colum++, *s++);
y_notsu 0:d0cd5139479f 241 }
y_notsu 0:d0cd5139479f 242
y_notsu 0:d0cd5139479f 243 // Display Image Function
y_notsu 0:d0cd5139479f 244 void SG12864A::lcd_Image(char *ptr)
y_notsu 0:d0cd5139479f 245 {
y_notsu 0:d0cd5139479f 246 char cs, Xpos;
y_notsu 0:d0cd5139479f 247 int page, colum;
y_notsu 0:d0cd5139479f 248
y_notsu 0:d0cd5139479f 249 for(page=0; page<8; page++){
y_notsu 0:d0cd5139479f 250 for(colum=0; colum<128; colum++){
y_notsu 0:d0cd5139479f 251 if(colum > 63){
y_notsu 0:d0cd5139479f 252 Xpos=colum-64;
y_notsu 0:d0cd5139479f 253 cs = 1;
y_notsu 0:d0cd5139479f 254 }
y_notsu 0:d0cd5139479f 255 else{
y_notsu 0:d0cd5139479f 256 Xpos = colum;
y_notsu 0:d0cd5139479f 257 cs = 2;
y_notsu 0:d0cd5139479f 258 }
y_notsu 0:d0cd5139479f 259 lcd_Write(cs, 0xB8+page, 1);
y_notsu 0:d0cd5139479f 260 lcd_Write(cs, 0x40+Xpos, 1);
y_notsu 0:d0cd5139479f 261 lcd_Write(cs, *ptr++, 0);
y_notsu 0:d0cd5139479f 262 }
y_notsu 0:d0cd5139479f 263 }
y_notsu 0:d0cd5139479f 264 }
y_notsu 0:d0cd5139479f 265
y_notsu 0:d0cd5139479f 266 //Scroll Function
y_notsu 0:d0cd5139479f 267 void SG12864A::lcd_Scroll(int delay){
y_notsu 0:d0cd5139479f 268 int i;
y_notsu 0:d0cd5139479f 269
y_notsu 0:d0cd5139479f 270 for(i=0; i<64; i++){
y_notsu 0:d0cd5139479f 271 lcd_Write(1, 0xC0+i,1);
y_notsu 0:d0cd5139479f 272 lcd_Write(2, 0xC0+i,1);
y_notsu 0:d0cd5139479f 273 wait_ms(delay);
y_notsu 0:d0cd5139479f 274 }
y_notsu 0:d0cd5139479f 275 }
y_notsu 0:d0cd5139479f 276