Paul Evans
/
Newhaven_LCD
Newhaven 320x240 LCD
newhaven.cpp@3:1cf3ec6c70d7, 2011-02-27 (annotated)
- 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?
User | Revision | Line number | New 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 | } |