
Newhaven 320x240 LCD
Revision 2:2058e2f79157, committed 2011-02-27
- Comitter:
- pbevans89
- Date:
- Sun Feb 27 21:40:59 2011 +0000
- Parent:
- 1:fa44aeffcfd6
- Child:
- 3:1cf3ec6c70d7
- Commit message:
Changed in this revision
newhaven.cpp | Show annotated file Show diff for this revision Revisions of this file |
newhaven.h | Show annotated file Show diff for this revision Revisions of this file |
--- a/newhaven.cpp Sun Feb 27 21:14:19 2011 +0000 +++ b/newhaven.cpp Sun Feb 27 21:40:59 2011 +0000 @@ -1,3 +1,7 @@ +/* mbed Newhaven LCD Library + * Copywrite (c) 2011, Paul Evans + */ + #include "mbed.h" #include "newhaven.h" @@ -8,17 +12,17 @@ void delay(unsigned int n) { - unsigned int i,j; - for (i=0;i<n;i++) - for (j=0;j<350;j++) - {;} + unsigned int i,j; + for (i=0;i<n;i++) + for (j=0;j<350;j++) + {;} } void delay1(unsigned int i) { - while(i--); + while(i--); } - +// send commands to the LCD void NHLCD::comm_out(unsigned char j){ LCD_PORT->output(); A0 = 1; @@ -32,6 +36,7 @@ CS = 1; } +// send data to the LCD void NHLCD::data_out(unsigned char j){ LCD_PORT->output(); A0 = 0; @@ -45,101 +50,107 @@ CS = 1; } +// clears the entire screen void NHLCD::clearScreen(){ int n; - comm_out(0x46); - data_out(0x00); - data_out(0x00); - comm_out(0x42); - for(n=0;n<1200;n++){ - data_out(0x20); - } - comm_out(0x46); - data_out(0xB0); - data_out(0x04); - comm_out(0x42); - for(n=0;n<9600;n++){ - data_out(0x00); - } -} - -void NHLCD::text(char *text, char row, char col){ - int c = row*40+col; - comm_out(0x46); - data_out((unsigned char)(c&0xFF)); - data_out((unsigned char)((c&0xFF00)>>8)); - comm_out(0x42); - while(*text != 0) { - data_out(*text); - text++; + 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); + 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); - data_out(0xEF); - data_out(0x28); - data_out(0x00); + 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); - data_out(0x00); - data_out(0x00); - data_out(0xEF); - data_out(0xB0); - data_out(0x04); - data_out(0xEF); - data_out(0x00); - data_out(0x00); - data_out(0x00); - data_out(0x00); + 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); - data_out(0x00); + comm_out(0x5A); // hdot scr + data_out(0x00); // horizontal pixel shift = 0 - comm_out(0x5B); - data_out(0x00); + comm_out(0x5B); // overlay + data_out(0x00); // OR - comm_out(0x58); - data_out(0x56); + comm_out(0x58); // set display + data_out(0x56); - comm_out(0x5D); - data_out(0x04); - data_out(0x86); + comm_out(0x5D); // cursor form + data_out(0x04); // 5 pixels wide + data_out(0x86); // 7 pixels tall - comm_out(0x4C); + comm_out(0x4C); // cursor direction = right - comm_out(0x59); - data_out(0x16); + comm_out(0x59); // disp on/off + data_out(0x16); // on wait_ms(5); } - -void NHLCD::setPixel(int row, int col){ - int loc = (0x04<<8)|(0xB0); - int c = loc+row*40+(col/8); - comm_out(0x46); - data_out((unsigned char)(c&0xFF)); - data_out((unsigned char)((c&0xFF00)>>8)); - comm_out(0x43); - LCD_PORT->input(); - unsigned char buffer = LCD_PORT->read(); - buffer = buffer|(1<<(7-((row*320+col)%8))); - LCD_PORT->output(); - - comm_out(0x46); - data_out((unsigned char)(c&0xFF)); - data_out((unsigned char)((c&0xFF00)>>8)); - comm_out(0x42); - data_out(buffer); -}
--- a/newhaven.h Sun Feb 27 21:14:19 2011 +0000 +++ b/newhaven.h Sun Feb 27 21:40:59 2011 +0000 @@ -34,11 +34,40 @@ * @param BUSLCD Bi-directional 8-bit data bus */ NHLCD(PinName PIN_E,PinName PIN_RW,PinName PIN_A0,PinName PIN_CS,PinName PIN_RST, BusInOut *BUSLCD); + + /* Initializes the LCD + */ void Init(); + + /* Outputs a command across the 8-bit bus to the LCD + * + * @param j hex-code of command + */ void comm_out(unsigned char j); + + /* Outputs data across the 8-bit bus to the LCD + * + * @param j data to send + */ void data_out(unsigned char j); + + /* Clears the entire screen of set pixels + */ void clearScreen(); + + /* Writes text to the LCD (with a resolution of 40x30 characters) + * + * @param text a string of text to write on the screen + * @param row the row of the first character + * @param col the column of the first character + */ void text(char* text, char row, char col); + + /* Sets an individual pixel on the LCD (with a resolution of 320x240 pixels) + * + * @param row the row of the pixel + * @param col the column of the pixel + */ void setPixel(int row, int col); private: