Paul Evans
/
Newhaven_LCD
Newhaven 320x240 LCD
Diff: newhaven.cpp
- Revision:
- 3:1cf3ec6c70d7
- Parent:
- 2:2058e2f79157
- Child:
- 4:aa6dc362b462
--- a/newhaven.cpp Sun Feb 27 21:40:59 2011 +0000 +++ b/newhaven.cpp Sun Feb 27 23:30:14 2011 +0000 @@ -1,156 +1,155 @@ -/* mbed Newhaven LCD Library - * Copywrite (c) 2011, Paul Evans - */ - -#include "mbed.h" -#include "newhaven.h" - -NHLCD::NHLCD(PinName PIN_E,PinName PIN_RW,PinName PIN_A0,PinName PIN_CS,PinName PIN_RST, BusInOut *BUSLCD) - : E(PIN_E),RW(PIN_RW),A0(PIN_A0),CS(PIN_CS),RST(PIN_RST){ - LCD_PORT = BUSLCD; -} - -void delay(unsigned int n) -{ - unsigned int i,j; - for (i=0;i<n;i++) - for (j=0;j<350;j++) - {;} -} -void delay1(unsigned int i) -{ - while(i--); -} - -// send commands to the LCD -void NHLCD::comm_out(unsigned char j){ - LCD_PORT->output(); - A0 = 1; - LCD_PORT->write(j); - CS = 0; - RW = 0; - E = 1; - delay(1); - E = 0; - RW = 1; - CS = 1; -} - -// send data to the LCD -void NHLCD::data_out(unsigned char j){ - LCD_PORT->output(); - A0 = 0; - LCD_PORT->write(j); - CS = 0; - RW = 0; - E = 1; - delay(1); - E = 0; - RW = 1; - CS = 1; -} - -// clears the entire screen -void NHLCD::clearScreen(){ - int n; - comm_out(0x46); // command to set cursor location - data_out(0x00); // 0x00 is the start of text screen - data_out(0x00); - comm_out(0x42); // command to write data - for(n=0;n<1200;n++){ // 1200 locations on the screen - data_out(0x20); // fill each with a blank - } - comm_out(0x46); // command to set cursor location - data_out(0xB0); // 0x4B0 is the start of drawing screen - data_out(0x04); - comm_out(0x42); // command to write data - for(n=0;n<9600;n++){ // 9600 total byte locations - data_out(0x00); // set each to 0 - } -} - -// write text on the screen -void NHLCD::text(char *text, char row, char col){ - int c = row*40+col; // gets the correct address for the cursor - comm_out(0x46); // command to set cursor location - data_out((unsigned char)(c&0xFF)); // lower 8 bits of address - data_out((unsigned char)((c&0xFF00)>>8)); // upper 8 bits of address - comm_out(0x42); // command to write data to screen - while(*text != 0) { // write until you hit a null terminator - data_out(*text); // write the current character to the screen - text++; // move to the next character - } -} - -/* set an individual pixel on the screen. - * pixels are grouped in bytes, so you must isolate a particular pixel. - */ -void NHLCD::setPixel(int row, int col){ - int loc = (0x04<<8)|(0xB0); //sets location to the top left corner of drawing screen - int c = loc+row*40+(col/8); // gets address of the correct byte - comm_out(0x46); // command to set cursor location - data_out((unsigned char)(c&0xFF)); // lower 8 bits of address - data_out((unsigned char)((c&0xFF00)>>8)); // upper 8 bits of address - comm_out(0x43); // command to read the byte - LCD_PORT->input(); // sets the buffer to input data - unsigned char buffer = LCD_PORT->read(); // stores byte in buffer - buffer = buffer|(1<<(7-((row*320+col)%8))); // sets the particular pixel on the byte - LCD_PORT->output(); // sets the buffer to output data - - comm_out(0x46); //command to set cursor location - data_out((unsigned char)(c&0xFF)); // lower 8 bits of address - data_out((unsigned char)((c&0xFF00)>>8)); // upper 8 bits of address - comm_out(0x42); // command to write to the screen - data_out(buffer); // write buffer to the screen -} - -// initialize the LCD -void NHLCD::Init(void){ - /* reset the device */ - RST = 0; - delay(5); - RST = 1; - delay(10); - - comm_out(0x40); // system set command - delay(5); - data_out(0x30); // parameters - data_out(0x87); // horizontal character size (0x80 = 1) MUST BE MULTIPLE OF 320 - data_out(0x07); // vertical character size (0x00 = 1) MUST BE MULTIPLE OF 240 - data_out(40); // addresses per line - data_out(80); // bytes per line - data_out(0xEF); // 240 displace lines - data_out(0x28); // virtual address 1 - data_out(0x00); // virtual address 2 - - comm_out(0x44); // scroll - data_out(0x00); // start address 1 - data_out(0x00); // start address 2 - data_out(0xEF); // 240 lines - data_out(0xB0); // 2nd screen start1 - data_out(0x04); // 2nd screen start2 - data_out(0xEF); // 2nd screen 240 lines - data_out(0x00); // 3rd screen address1 - data_out(0x00); // 3rd screen address2 - data_out(0x00); // 4th screen address1 - data_out(0x00); // 4th screen address2 - - comm_out(0x5A); // hdot scr - data_out(0x00); // horizontal pixel shift = 0 - - comm_out(0x5B); // overlay - data_out(0x00); // OR - - comm_out(0x58); // set display - data_out(0x56); - - comm_out(0x5D); // cursor form - data_out(0x04); // 5 pixels wide - data_out(0x86); // 7 pixels tall - - comm_out(0x4C); // cursor direction = right - - comm_out(0x59); // disp on/off - data_out(0x16); // on - wait_ms(5); -} +/* mbed Newhaven LCD Library + * Copywrite (c) 2011, Paul Evans + */ + +#include "mbed.h" +#include "newhaven.h" + +NHLCD::NHLCD(PinName PIN_E,PinName PIN_RW,PinName PIN_A0,PinName PIN_CS,PinName PIN_RST, BusInOut *BUSLCD) + : E(PIN_E),RW(PIN_RW),A0(PIN_A0),CS(PIN_CS),RST(PIN_RST){ + LCD_PORT = BUSLCD; +} + +void delay(unsigned int n){ + unsigned int i,j; + for (i=0;i<n;i++) + for (j=0;j<350;j++) + {;} +} + +void delay1(unsigned int i){ + while(i--); +} + +// send commands to the LCD +void NHLCD::comm_out(unsigned char j){ + LCD_PORT->output(); // sets the buffer to output data + A0 = 1; // set for a command output + LCD_PORT->write(j); // send the data in the buffer + CS = 0; // active LOW chip select + RW = 0; // set to 0 for write operation + E = 1; // operation enable + delay(1); // wait for operation to complete + E = 0; // reset values + RW = 1; + CS = 1; +} + +// send data to the LCD +void NHLCD::data_out(unsigned char j){ + LCD_PORT->output(); // sets the buffer to output data + A0 = 0; // set for a data output + LCD_PORT->write(j); // send the data in the buffer + CS = 0; // active LOW chip select + RW = 0; // set to 0 for write operation + E = 1; // operation enable + delay(1); // wait for operation to complete + E = 0; // reset values + RW = 1; + CS = 1; +} + +// clears the entire screen +void NHLCD::clearScreen(){ + int n; + comm_out(0x46); // command to set cursor location + data_out(0x00); // 0x00 is the start of text screen + data_out(0x00); + comm_out(0x42); // command to write data + for(n=0;n<1200;n++){ // 1200 locations on the screen + data_out(0x20); // fill each with a blank + } + comm_out(0x46); // command to set cursor location + data_out(0xB0); // 0x4B0 is the start of drawing screen + data_out(0x04); + comm_out(0x42); // command to write data + for(n=0;n<9600;n++){ // 9600 total byte locations + data_out(0x00); // set each to 0 + } +} + +// write text on the screen +void NHLCD::text(char *text, char row, char col){ + int c = row*40+col; // gets the correct address for the cursor + comm_out(0x46); // command to set cursor location + data_out((unsigned char)(c&0xFF)); // lower 8 bits of address + data_out((unsigned char)((c&0xFF00)>>8)); // upper 8 bits of address + comm_out(0x42); // command to write data to screen + while(*text != 0) { // write until you hit a null terminator + data_out(*text); // write the current character to the screen + text++; // move to the next character + } +} + +/* set an individual pixel on the screen. + * pixels are grouped in bytes, so you must isolate a particular pixel. + */ +void NHLCD::setPixel(int row, int col){ + int loc = (0x04<<8)|(0xB0); //sets location to the top left corner of drawing screen + int c = loc+row*40+(col/8); // gets address of the correct byte + comm_out(0x46); // command to set cursor location + data_out((unsigned char)(c&0xFF)); // lower 8 bits of address + data_out((unsigned char)((c&0xFF00)>>8)); // upper 8 bits of address + comm_out(0x43); // command to read the byte + LCD_PORT->input(); // sets the buffer to input data + unsigned char buffer = LCD_PORT->read(); // stores byte in buffer + buffer = buffer|(1<<(7-((row*320+col)%8))); // sets the particular pixel on the byte + LCD_PORT->output(); // sets the buffer to output data + + comm_out(0x46); //command to set cursor location + data_out((unsigned char)(c&0xFF)); // lower 8 bits of address + data_out((unsigned char)((c&0xFF00)>>8)); // upper 8 bits of address + comm_out(0x42); // command to write to the screen + data_out(buffer); // write buffer to the screen +} + +// initialize the LCD +void NHLCD::Init(void){ + /* reset the device */ + RST = 0; + delay(5); + RST = 1; + delay(10); + + comm_out(0x40); // system set command + delay(5); + data_out(0x30); // parameters + data_out(0x87); // horizontal character size (0x80 = 1) MUST BE MULTIPLE OF 320 + data_out(0x07); // vertical character size (0x00 = 1) MUST BE MULTIPLE OF 240 + data_out(40); // addresses per line + data_out(80); // bytes per line + data_out(0xEF); // 240 displace lines + data_out(0x28); // virtual address 1 + data_out(0x00); // virtual address 2 + + comm_out(0x44); // scroll + data_out(0x00); // start address 1 + data_out(0x00); // start address 2 + data_out(0xEF); // 240 lines + data_out(0xB0); // 2nd screen start1 + data_out(0x04); // 2nd screen start2 + data_out(0xEF); // 2nd screen 240 lines + data_out(0x00); // 3rd screen address1 + data_out(0x00); // 3rd screen address2 + data_out(0x00); // 4th screen address1 + data_out(0x00); // 4th screen address2 + + comm_out(0x5A); // hdot scr + data_out(0x00); // horizontal pixel shift = 0 + + comm_out(0x5B); // overlay + data_out(0x00); // OR + + comm_out(0x58); // set display + data_out(0x56); + + comm_out(0x5D); // cursor form + data_out(0x04); // 5 pixels wide + data_out(0x86); // 7 pixels tall + + comm_out(0x4C); // cursor direction = right + + comm_out(0x59); // disp on/off + data_out(0x16); // on + wait_ms(5); +}