Newhaven 320x240 LCD

Dependencies:   mbed

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);
+}