ks0713 SPI library. This library includes a small 5x5 ascii font and line function.
Diff: ks0713_spi.cpp
- Revision:
- 1:408627d73aa8
- Parent:
- 0:7b044b89e49c
--- a/ks0713_spi.cpp Sun Feb 26 15:52:10 2012 +0000 +++ b/ks0713_spi.cpp Sun Feb 26 16:01:29 2012 +0000 @@ -8,8 +8,7 @@ } -void KS0713_SPI::init() -{ +void KS0713_SPI::init() { _cs1b=0; _rs =0; _rstb=0; @@ -19,204 +18,185 @@ wait(0.015); // wait for power up (reset low term must be greater than 900[ns]) - + _rstb=1; // de-assert resetb - - + + writeCommand(0xA2); // LCD BIAS selection (1/65duty, 1/9bias) writeCommand(0xA1); // ADC selection (SEG128->SEG0) writeCommand(0xC0); // SHL selection (COM0->COM64) wait_ms(1); - /*Power control - Displaytech screen uses built-in power circuits - Switch on in order as specified in data sheet - wait 1ms between each command - 1st - Voltage converter ON = 0x2C - 2nd - Voltage regulator ON = 0x2E - 3rd - Voltage follower ON = 0x2F */ - writeCommand(0x2C); //0x2C = Voltage converter ON - wait_ms(1); - writeCommand(0x2E); //0x2E = Voltage regulator ON - wait_ms(1); - writeCommand(0x2F); //0x2F = Voltage follower ON - - - // Regulator Resistor Selection - /*Regulator resistor select - Sets the internal resistance ratio used in the internal voltage regulator - Refer to datasheet p.42 - This works as a corse contrast control - 0x20 = 1.9 - 0x21 = 2.19 - 0x22 = 2.55 - 0x23 = 3.02 - 0x24 = 3.61 - 0x25 = 4.35 - 0x26 = 5.29 - 0x27 = 6.48 */ - writeCommand(0x23); + /*Power control + Displaytech screen uses built-in power circuits + Switch on in order as specified in data sheet + wait 1ms between each command + 1st - Voltage converter ON = 0x2C + 2nd - Voltage regulator ON = 0x2E + 3rd - Voltage follower ON = 0x2F */ + writeCommand(0x2C); //0x2C = Voltage converter ON + wait_ms(1); + writeCommand(0x2E); //0x2E = Voltage regulator ON + wait_ms(1); + writeCommand(0x2F); //0x2F = Voltage follower ON + - /*Set reference voltage register - Used as a fine contrast control - 0x81 = Enter voltage register set mode - 0x00 to 0x3F = 0 to 63 */ - writeCommand(0x81); //0x81 = Enter voltage register set mode - writeCommand(0x20); //0x20 = Set ref voltage to 20 - - /*Initial display line - Specify DDRAM line for COM1 - 0x40 + display line */ - writeCommand(0x40); //Set initial line to 0 + // Regulator Resistor Selection + /*Regulator resistor select + Sets the internal resistance ratio used in the internal voltage regulator + Refer to datasheet p.42 + This works as a corse contrast control + 0x20 = 1.9 + 0x21 = 2.19 + 0x22 = 2.55 + 0x23 = 3.02 + 0x24 = 3.61 + 0x25 = 4.35 + 0x26 = 5.29 + 0x27 = 6.48 */ + writeCommand(0x23); + + /*Set reference voltage register + Used as a fine contrast control + 0x81 = Enter voltage register set mode + 0x00 to 0x3F = 0 to 63 */ + writeCommand(0x81); //0x81 = Enter voltage register set mode + writeCommand(0x20); //0x20 = Set ref voltage to 20 + + /*Initial display line + Specify DDRAM line for COM1 + 0x40 + display line */ + writeCommand(0x40); //Set initial line to 0 - /*Set page address - Sets the initial page address to write to - 0xB0 + page address 0 to 8 */ - writeCommand(0xB0); //Initial page set to 0 - - /*Set column address - Sets the initial column to write to - for LSB (b3-b0) 0x00 + first nibble - for MSB (b7-b4) 0x10 + second nibble - 0x00 to 0x83 = column 0 to 131 */ - writeCommand(0x00); //Sets LSB to 0 - writeCommand(0x10); //Sets MSB to 0 - column is now set to 0 - - /*Reverse display - Selects either a normal display or a reverse display - 0xA6 = normal - 0xA7 = reverse */ - writeCommand(0xA6); //Sets display to normal - - /*Set static indicator - Sets up a static indicator on the display - See datasheet p.42 - This is a 2 instruction cycle - 0xAC = static indicator ON - 0xAD = static indicator OFF - Next instruction to set indicator type: - 0x00 = OFF - 0x01 = ON - 1 second blinking - 0x02 = ON - 0.5 second blinking - 0x03 = ON - always ON */ - writeCommand(0xAD); //Static indicator OFF - writeCommand(0x00); //OFF - 0.5 second blinking - - /*Display ON/OFF - Switched the display to on or off - 0xAE = Display OFF - 0xAF = Display ON */ - writeCommand(0xAF); - - clear(); - update(); - + /*Set page address + Sets the initial page address to write to + 0xB0 + page address 0 to 8 */ + writeCommand(0xB0); //Initial page set to 0 + + /*Set column address + Sets the initial column to write to + for LSB (b3-b0) 0x00 + first nibble + for MSB (b7-b4) 0x10 + second nibble + 0x00 to 0x83 = column 0 to 131 */ + writeCommand(0x00); //Sets LSB to 0 + writeCommand(0x10); //Sets MSB to 0 - column is now set to 0 + + /*Reverse display + Selects either a normal display or a reverse display + 0xA6 = normal + 0xA7 = reverse */ + writeCommand(0xA6); //Sets display to normal + + /*Set static indicator + Sets up a static indicator on the display + See datasheet p.42 + This is a 2 instruction cycle + 0xAC = static indicator ON + 0xAD = static indicator OFF + Next instruction to set indicator type: + 0x00 = OFF + 0x01 = ON - 1 second blinking + 0x02 = ON - 0.5 second blinking + 0x03 = ON - always ON */ + writeCommand(0xAD); //Static indicator OFF + writeCommand(0x00); //OFF - 0.5 second blinking + + /*Display ON/OFF + Switched the display to on or off + 0xAE = Display OFF + 0xAF = Display ON */ + writeCommand(0xAF); + + clear(); + update(); + _x=0; _y=0; } -void KS0713_SPI::writeCommand(unsigned char data) -{ +void KS0713_SPI::writeCommand(unsigned char data) { _cs1b=0; _rs =0; wait_us(1); // setup 55[ns] - _spi.write(data); + _spi.write(data); wait_us(1); // hold 180[ns] _cs1b=1; } -void KS0713_SPI::writeData(unsigned char data) -{ +void KS0713_SPI::writeData(unsigned char data) { _cs1b=0; _rs =1; wait_us(1); // setup 55[ns] - _spi.write(data); + _spi.write(data); wait_us(1); // hold 180[ns] _cs1b=1; } -void KS0713_SPI::clear() -{ - for (int page=0;page<MBED_KS0713_SPI_HEIGHT/8;page++) - { - for (int column=0;column<MBED_KS0713_SPI_WIDTH;column++) - { +void KS0713_SPI::clear() { + for (int page=0; page<MBED_KS0713_SPI_HEIGHT/8; page++) { + for (int column=0; column<MBED_KS0713_SPI_WIDTH; column++) { vram[column][page]=0x00; - } + } } } -void KS0713_SPI::fill() -{ - for (int page=0;page<MBED_KS0713_SPI_HEIGHT/8;page++) - { - for (int column=0;column<MBED_KS0713_SPI_WIDTH;column++) - { +void KS0713_SPI::fill() { + for (int page=0; page<MBED_KS0713_SPI_HEIGHT/8; page++) { + for (int column=0; column<MBED_KS0713_SPI_WIDTH; column++) { vram[column][page]=0xFF; - } + } } } -void KS0713_SPI::update() -{ - for (int page=0;page<MBED_KS0713_SPI_HEIGHT/8;page++) - { +void KS0713_SPI::update() { + for (int page=0; page<MBED_KS0713_SPI_HEIGHT/8; page++) { writeCommand(0xB0+page); writeCommand(0x10); writeCommand(0x00); - for (int column=0;column<100;column++) - { + for (int column=0; column<100; column++) { writeData(vram[column][page]); - } + } } } -void KS0713_SPI::locate(int x,int y) -{ +void KS0713_SPI::locate(int x,int y) { _x=x; _y=y; } -void KS0713_SPI::line(int x1, int y1, int x2, int y2) -{ +void KS0713_SPI::line(int x1, int y1, int x2, int y2) { int dist_x; int dist_y; int calc_point; - if(x2>x1) { + if (x2>x1) { dist_x = x2-x1; - } else - { + } else { dist_x = x1-x2; } - if(y2>y1) { + if (y2>y1) { dist_y = y2-y1; - } else - { + } else { dist_y = y1-y2; } - + - if(dist_x>dist_y) - { + if (dist_x>dist_y) { // x direction - if(x1>x2) - // step -1 + if (x1>x2) + // step -1 { - for (int x=x1;x>=x2;x--) - { + for (int x=x1; x>=x2; x--) { if (x<0) break; calc_point = y1+ ( (y2-y1) * (x-x1) / (x2-x1) ); if (calc_point>=0 && calc_point<MBED_KS0713_SPI_HEIGHT) - vram[x][(calc_point>>3)] |= ( 0x1 <<(calc_point&0x7)); + vram[x][(calc_point>>3)] |= ( 0x1 <<(calc_point&0x7)); } - } - else - // step ++ + } else + // step ++ { // point 1 -> point 2 - for (int x=x1;x<=x2;x++) - { + for (int x=x1; x<=x2; x++) { if (x>=MBED_KS0713_SPI_WIDTH) break; calc_point = y1+( (y2-y1) * (x-x1) / (x2-x1) ); @@ -225,68 +205,61 @@ } } - } - else - { + } else { // y direction - if(y1>y2) - // step -1 + if (y1>y2) + // step -1 { - for (int y=y1;y>=y2;y--) - { + for (int y=y1; y>=y2; y--) { if (y<0) break; calc_point = x1+( (x2-x1) * (y-y1) / (y2-y1) ); if (calc_point>=0 && calc_point<MBED_KS0713_SPI_WIDTH) - vram[calc_point][y>>3] |= ( 0x1 <<(y&0x7)); + vram[calc_point][y>>3] |= ( 0x1 <<(y&0x7)); } - } - else - // step ++ + } else + // step ++ { // point 1 -> point 2 - for (int y=y1;y<=y2;y++) - { + for (int y=y1; y<=y2; y++) { if (y>=MBED_KS0713_SPI_HEIGHT) break; calc_point = x1+( (x2-x1) * (y-y1) / (y2-y1) ); if (calc_point>=0 && calc_point<MBED_KS0713_SPI_WIDTH) - vram[calc_point][y>>3] |= ( 0x1 <<(y&0x7)); + vram[calc_point][y>>3] |= ( 0x1 <<(y&0x7)); } } - } + } } -int KS0713_SPI::_putc(int value) -{ +int KS0713_SPI::_putc(int value) { unsigned char fontdata; - for(int cx=0;cx<5;cx++){ - if( _x+cx>=MBED_KS0713_SPI_WIDTH ){ + for (int cx=0; cx<5; cx++) { + if ( _x+cx>=MBED_KS0713_SPI_WIDTH ) { break; } fontdata = font5x5[value-' '][cx]; - for (int cy=0;cy<5;cy++){ + for (int cy=0; cy<5; cy++) { if (_y+cy>=MBED_KS0713_SPI_HEIGHT) { break ; } if (fontdata & 0x1) { - vram[_x+cx][(_y+cy)>>3] |= ( 0x1 <<((_y+cy)&0x7)); + vram[_x+cx][(_y+cy)>>3] |= ( 0x1 <<((_y+cy)&0x7)); } else { - vram[_x+cx][(_y+cy)>>3] &= ~( 0x1 <<((_y+cy)&0x7)); - + vram[_x+cx][(_y+cy)>>3] &= ~( 0x1 <<((_y+cy)&0x7)); + } fontdata=fontdata>>1; } } - + _x+=6; return value; } -int KS0713_SPI::_getc() -{ +int KS0713_SPI::_getc() { return -1; }