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.
SG12864A.cpp@0:d0cd5139479f, 2011-01-09 (annotated)
- 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?
User | Revision | Line number | New 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«vZ |
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«ÅXebv̳ðØèÖ¦ |
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 |