Newhaven 320x240 LCD

Dependencies:   mbed

Committer:
pbevans89
Date:
Sun Feb 27 23:30:14 2011 +0000
Revision:
3:1cf3ec6c70d7
Parent:
2:2058e2f79157
Child:
4:aa6dc362b462

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
pbevans89 3:1cf3ec6c70d7 1 /* mbed Newhaven LCD Library
pbevans89 3:1cf3ec6c70d7 2 * Copywrite (c) 2011, Paul Evans
pbevans89 3:1cf3ec6c70d7 3 */
pbevans89 3:1cf3ec6c70d7 4
pbevans89 3:1cf3ec6c70d7 5 #include "mbed.h"
pbevans89 3:1cf3ec6c70d7 6 #include "newhaven.h"
pbevans89 3:1cf3ec6c70d7 7
pbevans89 3:1cf3ec6c70d7 8 NHLCD::NHLCD(PinName PIN_E,PinName PIN_RW,PinName PIN_A0,PinName PIN_CS,PinName PIN_RST, BusInOut *BUSLCD)
pbevans89 3:1cf3ec6c70d7 9 : E(PIN_E),RW(PIN_RW),A0(PIN_A0),CS(PIN_CS),RST(PIN_RST){
pbevans89 3:1cf3ec6c70d7 10 LCD_PORT = BUSLCD;
pbevans89 3:1cf3ec6c70d7 11 }
pbevans89 3:1cf3ec6c70d7 12
pbevans89 3:1cf3ec6c70d7 13 void delay(unsigned int n){
pbevans89 3:1cf3ec6c70d7 14 unsigned int i,j;
pbevans89 3:1cf3ec6c70d7 15 for (i=0;i<n;i++)
pbevans89 3:1cf3ec6c70d7 16 for (j=0;j<350;j++)
pbevans89 3:1cf3ec6c70d7 17 {;}
pbevans89 3:1cf3ec6c70d7 18 }
pbevans89 3:1cf3ec6c70d7 19
pbevans89 3:1cf3ec6c70d7 20 void delay1(unsigned int i){
pbevans89 3:1cf3ec6c70d7 21 while(i--);
pbevans89 3:1cf3ec6c70d7 22 }
pbevans89 3:1cf3ec6c70d7 23
pbevans89 3:1cf3ec6c70d7 24 // send commands to the LCD
pbevans89 3:1cf3ec6c70d7 25 void NHLCD::comm_out(unsigned char j){
pbevans89 3:1cf3ec6c70d7 26 LCD_PORT->output(); // sets the buffer to output data
pbevans89 3:1cf3ec6c70d7 27 A0 = 1; // set for a command output
pbevans89 3:1cf3ec6c70d7 28 LCD_PORT->write(j); // send the data in the buffer
pbevans89 3:1cf3ec6c70d7 29 CS = 0; // active LOW chip select
pbevans89 3:1cf3ec6c70d7 30 RW = 0; // set to 0 for write operation
pbevans89 3:1cf3ec6c70d7 31 E = 1; // operation enable
pbevans89 3:1cf3ec6c70d7 32 delay(1); // wait for operation to complete
pbevans89 3:1cf3ec6c70d7 33 E = 0; // reset values
pbevans89 3:1cf3ec6c70d7 34 RW = 1;
pbevans89 3:1cf3ec6c70d7 35 CS = 1;
pbevans89 3:1cf3ec6c70d7 36 }
pbevans89 3:1cf3ec6c70d7 37
pbevans89 3:1cf3ec6c70d7 38 // send data to the LCD
pbevans89 3:1cf3ec6c70d7 39 void NHLCD::data_out(unsigned char j){
pbevans89 3:1cf3ec6c70d7 40 LCD_PORT->output(); // sets the buffer to output data
pbevans89 3:1cf3ec6c70d7 41 A0 = 0; // set for a data output
pbevans89 3:1cf3ec6c70d7 42 LCD_PORT->write(j); // send the data in the buffer
pbevans89 3:1cf3ec6c70d7 43 CS = 0; // active LOW chip select
pbevans89 3:1cf3ec6c70d7 44 RW = 0; // set to 0 for write operation
pbevans89 3:1cf3ec6c70d7 45 E = 1; // operation enable
pbevans89 3:1cf3ec6c70d7 46 delay(1); // wait for operation to complete
pbevans89 3:1cf3ec6c70d7 47 E = 0; // reset values
pbevans89 3:1cf3ec6c70d7 48 RW = 1;
pbevans89 3:1cf3ec6c70d7 49 CS = 1;
pbevans89 3:1cf3ec6c70d7 50 }
pbevans89 3:1cf3ec6c70d7 51
pbevans89 3:1cf3ec6c70d7 52 // clears the entire screen
pbevans89 3:1cf3ec6c70d7 53 void NHLCD::clearScreen(){
pbevans89 3:1cf3ec6c70d7 54 int n;
pbevans89 3:1cf3ec6c70d7 55 comm_out(0x46); // command to set cursor location
pbevans89 3:1cf3ec6c70d7 56 data_out(0x00); // 0x00 is the start of text screen
pbevans89 3:1cf3ec6c70d7 57 data_out(0x00);
pbevans89 3:1cf3ec6c70d7 58 comm_out(0x42); // command to write data
pbevans89 3:1cf3ec6c70d7 59 for(n=0;n<1200;n++){ // 1200 locations on the screen
pbevans89 3:1cf3ec6c70d7 60 data_out(0x20); // fill each with a blank
pbevans89 3:1cf3ec6c70d7 61 }
pbevans89 3:1cf3ec6c70d7 62 comm_out(0x46); // command to set cursor location
pbevans89 3:1cf3ec6c70d7 63 data_out(0xB0); // 0x4B0 is the start of drawing screen
pbevans89 3:1cf3ec6c70d7 64 data_out(0x04);
pbevans89 3:1cf3ec6c70d7 65 comm_out(0x42); // command to write data
pbevans89 3:1cf3ec6c70d7 66 for(n=0;n<9600;n++){ // 9600 total byte locations
pbevans89 3:1cf3ec6c70d7 67 data_out(0x00); // set each to 0
pbevans89 3:1cf3ec6c70d7 68 }
pbevans89 3:1cf3ec6c70d7 69 }
pbevans89 3:1cf3ec6c70d7 70
pbevans89 3:1cf3ec6c70d7 71 // write text on the screen
pbevans89 3:1cf3ec6c70d7 72 void NHLCD::text(char *text, char row, char col){
pbevans89 3:1cf3ec6c70d7 73 int c = row*40+col; // gets the correct address for the cursor
pbevans89 3:1cf3ec6c70d7 74 comm_out(0x46); // command to set cursor location
pbevans89 3:1cf3ec6c70d7 75 data_out((unsigned char)(c&0xFF)); // lower 8 bits of address
pbevans89 3:1cf3ec6c70d7 76 data_out((unsigned char)((c&0xFF00)>>8)); // upper 8 bits of address
pbevans89 3:1cf3ec6c70d7 77 comm_out(0x42); // command to write data to screen
pbevans89 3:1cf3ec6c70d7 78 while(*text != 0) { // write until you hit a null terminator
pbevans89 3:1cf3ec6c70d7 79 data_out(*text); // write the current character to the screen
pbevans89 3:1cf3ec6c70d7 80 text++; // move to the next character
pbevans89 3:1cf3ec6c70d7 81 }
pbevans89 3:1cf3ec6c70d7 82 }
pbevans89 3:1cf3ec6c70d7 83
pbevans89 3:1cf3ec6c70d7 84 /* set an individual pixel on the screen.
pbevans89 3:1cf3ec6c70d7 85 * pixels are grouped in bytes, so you must isolate a particular pixel.
pbevans89 3:1cf3ec6c70d7 86 */
pbevans89 3:1cf3ec6c70d7 87 void NHLCD::setPixel(int row, int col){
pbevans89 3:1cf3ec6c70d7 88 int loc = (0x04<<8)|(0xB0); //sets location to the top left corner of drawing screen
pbevans89 3:1cf3ec6c70d7 89 int c = loc+row*40+(col/8); // gets address of the correct byte
pbevans89 3:1cf3ec6c70d7 90 comm_out(0x46); // command to set cursor location
pbevans89 3:1cf3ec6c70d7 91 data_out((unsigned char)(c&0xFF)); // lower 8 bits of address
pbevans89 3:1cf3ec6c70d7 92 data_out((unsigned char)((c&0xFF00)>>8)); // upper 8 bits of address
pbevans89 3:1cf3ec6c70d7 93 comm_out(0x43); // command to read the byte
pbevans89 3:1cf3ec6c70d7 94 LCD_PORT->input(); // sets the buffer to input data
pbevans89 3:1cf3ec6c70d7 95 unsigned char buffer = LCD_PORT->read(); // stores byte in buffer
pbevans89 3:1cf3ec6c70d7 96 buffer = buffer|(1<<(7-((row*320+col)%8))); // sets the particular pixel on the byte
pbevans89 3:1cf3ec6c70d7 97 LCD_PORT->output(); // sets the buffer to output data
pbevans89 3:1cf3ec6c70d7 98
pbevans89 3:1cf3ec6c70d7 99 comm_out(0x46); //command to set cursor location
pbevans89 3:1cf3ec6c70d7 100 data_out((unsigned char)(c&0xFF)); // lower 8 bits of address
pbevans89 3:1cf3ec6c70d7 101 data_out((unsigned char)((c&0xFF00)>>8)); // upper 8 bits of address
pbevans89 3:1cf3ec6c70d7 102 comm_out(0x42); // command to write to the screen
pbevans89 3:1cf3ec6c70d7 103 data_out(buffer); // write buffer to the screen
pbevans89 3:1cf3ec6c70d7 104 }
pbevans89 3:1cf3ec6c70d7 105
pbevans89 3:1cf3ec6c70d7 106 // initialize the LCD
pbevans89 3:1cf3ec6c70d7 107 void NHLCD::Init(void){
pbevans89 3:1cf3ec6c70d7 108 /* reset the device */
pbevans89 3:1cf3ec6c70d7 109 RST = 0;
pbevans89 3:1cf3ec6c70d7 110 delay(5);
pbevans89 3:1cf3ec6c70d7 111 RST = 1;
pbevans89 3:1cf3ec6c70d7 112 delay(10);
pbevans89 3:1cf3ec6c70d7 113
pbevans89 3:1cf3ec6c70d7 114 comm_out(0x40); // system set command
pbevans89 3:1cf3ec6c70d7 115 delay(5);
pbevans89 3:1cf3ec6c70d7 116 data_out(0x30); // parameters
pbevans89 3:1cf3ec6c70d7 117 data_out(0x87); // horizontal character size (0x80 = 1) MUST BE MULTIPLE OF 320
pbevans89 3:1cf3ec6c70d7 118 data_out(0x07); // vertical character size (0x00 = 1) MUST BE MULTIPLE OF 240
pbevans89 3:1cf3ec6c70d7 119 data_out(40); // addresses per line
pbevans89 3:1cf3ec6c70d7 120 data_out(80); // bytes per line
pbevans89 3:1cf3ec6c70d7 121 data_out(0xEF); // 240 displace lines
pbevans89 3:1cf3ec6c70d7 122 data_out(0x28); // virtual address 1
pbevans89 3:1cf3ec6c70d7 123 data_out(0x00); // virtual address 2
pbevans89 3:1cf3ec6c70d7 124
pbevans89 3:1cf3ec6c70d7 125 comm_out(0x44); // scroll
pbevans89 3:1cf3ec6c70d7 126 data_out(0x00); // start address 1
pbevans89 3:1cf3ec6c70d7 127 data_out(0x00); // start address 2
pbevans89 3:1cf3ec6c70d7 128 data_out(0xEF); // 240 lines
pbevans89 3:1cf3ec6c70d7 129 data_out(0xB0); // 2nd screen start1
pbevans89 3:1cf3ec6c70d7 130 data_out(0x04); // 2nd screen start2
pbevans89 3:1cf3ec6c70d7 131 data_out(0xEF); // 2nd screen 240 lines
pbevans89 3:1cf3ec6c70d7 132 data_out(0x00); // 3rd screen address1
pbevans89 3:1cf3ec6c70d7 133 data_out(0x00); // 3rd screen address2
pbevans89 3:1cf3ec6c70d7 134 data_out(0x00); // 4th screen address1
pbevans89 3:1cf3ec6c70d7 135 data_out(0x00); // 4th screen address2
pbevans89 3:1cf3ec6c70d7 136
pbevans89 3:1cf3ec6c70d7 137 comm_out(0x5A); // hdot scr
pbevans89 3:1cf3ec6c70d7 138 data_out(0x00); // horizontal pixel shift = 0
pbevans89 3:1cf3ec6c70d7 139
pbevans89 3:1cf3ec6c70d7 140 comm_out(0x5B); // overlay
pbevans89 3:1cf3ec6c70d7 141 data_out(0x00); // OR
pbevans89 3:1cf3ec6c70d7 142
pbevans89 3:1cf3ec6c70d7 143 comm_out(0x58); // set display
pbevans89 3:1cf3ec6c70d7 144 data_out(0x56);
pbevans89 3:1cf3ec6c70d7 145
pbevans89 3:1cf3ec6c70d7 146 comm_out(0x5D); // cursor form
pbevans89 3:1cf3ec6c70d7 147 data_out(0x04); // 5 pixels wide
pbevans89 3:1cf3ec6c70d7 148 data_out(0x86); // 7 pixels tall
pbevans89 3:1cf3ec6c70d7 149
pbevans89 3:1cf3ec6c70d7 150 comm_out(0x4C); // cursor direction = right
pbevans89 3:1cf3ec6c70d7 151
pbevans89 3:1cf3ec6c70d7 152 comm_out(0x59); // disp on/off
pbevans89 3:1cf3ec6c70d7 153 data_out(0x16); // on
pbevans89 3:1cf3ec6c70d7 154 wait_ms(5);
pbevans89 3:1cf3ec6c70d7 155 }