General purpose character LCD library. I found the TextLCD library had too many constraints and it didn\\\\\\\'t supply acces to all functions in the HD44780 chipset, so i decided to write my own character lcd library.

Committer:
lktromp
Date:
Fri Mar 25 10:01:28 2011 +0000
Revision:
1:1349bedd5793
Child:
2:18f6402fd025
Improved

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lktromp 1:1349bedd5793 1 #include "mbed.h"
lktromp 1:1349bedd5793 2 #include "charLcd.h"
lktromp 1:1349bedd5793 3 #include "hd44780.h"
lktromp 1:1349bedd5793 4 #include "main.h"
lktromp 1:1349bedd5793 5 Serial pc(USBTX, USBRX);
lktromp 1:1349bedd5793 6 #define DEBUG
lktromp 1:1349bedd5793 7
lktromp 1:1349bedd5793 8 //constructor for 4-bit lcd control
lktromp 1:1349bedd5793 9 charLcd::charLcd(PinName rs, PinName en, PinName rw, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type)
lktromp 1:1349bedd5793 10 : cl_rs(rs), cl_rw(rw), cl_en(en), cl_charLcdData(d7, d6, d5, d4) {
lktromp 1:1349bedd5793 11 pc.baud(115200);
lktromp 1:1349bedd5793 12 #ifdef DEBUG
lktromp 1:1349bedd5793 13 pc.printf("LCD 4bit init\r\n");
lktromp 1:1349bedd5793 14 #endif //DEBUG
lktromp 1:1349bedd5793 15 charLcdResetLCD();
lktromp 1:1349bedd5793 16 }
lktromp 1:1349bedd5793 17
lktromp 1:1349bedd5793 18 //constructor for 8-bit lcd control
lktromp 1:1349bedd5793 19 charLcd::charLcd(PinName rs, PinName en, PinName rw, PinName d0, PinName d1, PinName d2, PinName d3, PinName d4, PinName d5,
lktromp 1:1349bedd5793 20 PinName d6, PinName d7, LCDType type)
lktromp 1:1349bedd5793 21 : cl_rs(rs), cl_rw(rw), cl_en(en), cl_charLcdData(d7, d6, d5, d4, d3, d2, d1, d0) {
lktromp 1:1349bedd5793 22
lktromp 1:1349bedd5793 23 pc.baud(115200);
lktromp 1:1349bedd5793 24 #ifdef DEBUG
lktromp 1:1349bedd5793 25 pc.printf("LCD 8-bit init\r\n");
lktromp 1:1349bedd5793 26 #endif //DEBUG
lktromp 1:1349bedd5793 27 charLcdResetLCD();
lktromp 1:1349bedd5793 28
lktromp 1:1349bedd5793 29 }
lktromp 1:1349bedd5793 30
lktromp 1:1349bedd5793 31
lktromp 1:1349bedd5793 32
lktromp 1:1349bedd5793 33 void charLcd::charLcdResetLCD(void) {
lktromp 1:1349bedd5793 34 cl_en = 1;
lktromp 1:1349bedd5793 35 cl_rs = 0; // command mode
lktromp 1:1349bedd5793 36 cl_rw = 0;
lktromp 1:1349bedd5793 37 wait_ms(40); // Wait 15ms to ensure powered up
lktromp 1:1349bedd5793 38 charLcdFunctionSet(0,1,0);
lktromp 1:1349bedd5793 39 wait_ms(5); // Wait 15ms to ensure powered up
lktromp 1:1349bedd5793 40 charLcdFunctionSet(0,1,0);
lktromp 1:1349bedd5793 41 wait_us(100); // Wait 15ms to ensure powered up
lktromp 1:1349bedd5793 42 charLcdFunctionSet(0,1,0);
lktromp 1:1349bedd5793 43 wait_us(100); // Wait 15ms to ensure powered up
lktromp 1:1349bedd5793 44 charLcdFunctionSet(0,1,0);
lktromp 1:1349bedd5793 45 charLcdDisplayOn(0);
lktromp 1:1349bedd5793 46 charLcdClear();
lktromp 1:1349bedd5793 47 charLcdEntryMode(1,0);
lktromp 1:1349bedd5793 48 //wait_ms(20); // Wait 15ms to ensure powered up
lktromp 1:1349bedd5793 49 //charLcdFunctionSet(0,1,0);
lktromp 1:1349bedd5793 50 //wait_ms(20); // Wait 15ms to ensure powered up
lktromp 1:1349bedd5793 51 charLcdDisplayOn(1);
lktromp 1:1349bedd5793 52 wait_ms(20); // Wait 15ms to ensure powered up
lktromp 1:1349bedd5793 53 charLcdCursor(1, 1);
lktromp 1:1349bedd5793 54 wait_ms(20); // Wait 15ms to ensure powered up
lktromp 1:1349bedd5793 55 charLcdEntryMode(1,0);
lktromp 1:1349bedd5793 56 }
lktromp 1:1349bedd5793 57
lktromp 1:1349bedd5793 58 void charLcd::charLcdClear (void){
lktromp 1:1349bedd5793 59 #ifdef DEBUG
lktromp 1:1349bedd5793 60 pc.printf("LCD Clear\r\n");
lktromp 1:1349bedd5793 61 #endif //DEBUG
lktromp 1:1349bedd5793 62 charLcdSendCommand(LCD_CLEAR);
lktromp 1:1349bedd5793 63 }
lktromp 1:1349bedd5793 64 void charLcd::charLcdReturnHome(){
lktromp 1:1349bedd5793 65 #ifdef DEBUG
lktromp 1:1349bedd5793 66 pc.printf("LCD Home\r\n");
lktromp 1:1349bedd5793 67 #endif //DEBUG
lktromp 1:1349bedd5793 68 charLcdSendCommand(LCD_HOME);
lktromp 1:1349bedd5793 69 }
lktromp 1:1349bedd5793 70
lktromp 1:1349bedd5793 71 void charLcd::charLcdEntryMode(uint8 increment, uint8 shift){
lktromp 1:1349bedd5793 72 uint8 cmd = LCD_ENTRY_MODE;
lktromp 1:1349bedd5793 73 if (increment == 0x00){
lktromp 1:1349bedd5793 74 cmd |= LCD_ENTRY_DEC;
lktromp 1:1349bedd5793 75 #ifdef DEBUG
lktromp 1:1349bedd5793 76 pc.printf("LCD Entry Mode decrement\r\n");
lktromp 1:1349bedd5793 77 #endif //DEBUG
lktromp 1:1349bedd5793 78 } else {
lktromp 1:1349bedd5793 79 cmd |= LCD_ENTRY_INC;
lktromp 1:1349bedd5793 80 #ifdef DEBUG
lktromp 1:1349bedd5793 81 pc.printf("LCD Entry Mode Increment\r\n");
lktromp 1:1349bedd5793 82 #endif //DEBUG
lktromp 1:1349bedd5793 83 }
lktromp 1:1349bedd5793 84 if (shift == 0x00){
lktromp 1:1349bedd5793 85 #ifdef DEBUG
lktromp 1:1349bedd5793 86 pc.printf("LCD Entry Mode Static\r\n");
lktromp 1:1349bedd5793 87 #endif //DEBUGcmd |= LCD_ENTRY_STAT;
lktromp 1:1349bedd5793 88
lktromp 1:1349bedd5793 89 } else {
lktromp 1:1349bedd5793 90 cmd |=LCD_ENTRY_SHIFT;
lktromp 1:1349bedd5793 91 #ifdef DEBUG
lktromp 1:1349bedd5793 92 pc.printf("LCD Entry Mode Shift\r\n");
lktromp 1:1349bedd5793 93 #endif //DEBUG
lktromp 1:1349bedd5793 94 }
lktromp 1:1349bedd5793 95 charLcdSendCommand(cmd);
lktromp 1:1349bedd5793 96
lktromp 1:1349bedd5793 97 }
lktromp 1:1349bedd5793 98
lktromp 1:1349bedd5793 99 void charLcd::charLcdDisplayOn(uint8 on){
lktromp 1:1349bedd5793 100 uint8 cmd = LCD_DISPLAY_CTR;
lktromp 1:1349bedd5793 101 if (on == 0x00){
lktromp 1:1349bedd5793 102 cmd |= LCD_DISP_OFF;
lktromp 1:1349bedd5793 103 #ifdef DEBUG
lktromp 1:1349bedd5793 104 pc.printf("LCD Display Control Display off\r\n");
lktromp 1:1349bedd5793 105 #endif //DEBUG
lktromp 1:1349bedd5793 106 } else {
lktromp 1:1349bedd5793 107 cmd |= LCD_DISP_ON;
lktromp 1:1349bedd5793 108 #ifdef DEBUG
lktromp 1:1349bedd5793 109 pc.printf("LCD Display Control Display on\r\n");
lktromp 1:1349bedd5793 110 #endif //DEBUG
lktromp 1:1349bedd5793 111 }
lktromp 1:1349bedd5793 112 charLcdSendCommand(cmd);
lktromp 1:1349bedd5793 113 }
lktromp 1:1349bedd5793 114
lktromp 1:1349bedd5793 115 void charLcd::charLcdCursor(uint8 cursor, uint8 blink){
lktromp 1:1349bedd5793 116 uint8 cmd = LCD_DISPLAY_CTR;
lktromp 1:1349bedd5793 117 if (cursor == 0x00){
lktromp 1:1349bedd5793 118 cmd |= LCD_CURSOR_OFF;
lktromp 1:1349bedd5793 119 #ifdef DEBUG
lktromp 1:1349bedd5793 120 pc.printf("LCD Display Control Cursor off\r\n");
lktromp 1:1349bedd5793 121 #endif //DEBUG
lktromp 1:1349bedd5793 122 } else {
lktromp 1:1349bedd5793 123 cmd |= LCD_CURSOR_ON;
lktromp 1:1349bedd5793 124 #ifdef DEBUG
lktromp 1:1349bedd5793 125 pc.printf("LCD Display Control Cursor on\r\n");
lktromp 1:1349bedd5793 126 #endif //DEBUG
lktromp 1:1349bedd5793 127 }
lktromp 1:1349bedd5793 128 if (blink == 0x00){
lktromp 1:1349bedd5793 129 cmd |= LCD_BLINK_OFF;
lktromp 1:1349bedd5793 130 #ifdef DEBUG
lktromp 1:1349bedd5793 131 pc.printf("LCD Display Control Cursor Blink off\r\n");
lktromp 1:1349bedd5793 132 #endif //DEBUG
lktromp 1:1349bedd5793 133 } else {
lktromp 1:1349bedd5793 134 cmd |=LCD_BLINK_ON;
lktromp 1:1349bedd5793 135 #ifdef DEBUG
lktromp 1:1349bedd5793 136 pc.printf("LCD Display Control Cursor Blink on\r\n");
lktromp 1:1349bedd5793 137 #endif //DEBUG
lktromp 1:1349bedd5793 138 }
lktromp 1:1349bedd5793 139 charLcdSendCommand(cmd);
lktromp 1:1349bedd5793 140 }
lktromp 1:1349bedd5793 141
lktromp 1:1349bedd5793 142 void charLcd::charLcdShift(uint8 left, uint8 cursor){
lktromp 1:1349bedd5793 143 uint8 cmd = LCD_SHIFT;
lktromp 1:1349bedd5793 144 if (left == 0x00){
lktromp 1:1349bedd5793 145 cmd |= LCD_SHIFT_LEFT;
lktromp 1:1349bedd5793 146 #ifdef DEBUG
lktromp 1:1349bedd5793 147 pc.printf("LCD Shift Control Shift Left\r\n");
lktromp 1:1349bedd5793 148 #endif //DEBUG
lktromp 1:1349bedd5793 149 } else {
lktromp 1:1349bedd5793 150 cmd |= LCD_SHIFT_RIGHT;
lktromp 1:1349bedd5793 151 #ifdef DEBUG
lktromp 1:1349bedd5793 152 pc.printf("LCD Display Control Shift Right\r\n");
lktromp 1:1349bedd5793 153 #endif //DEBUG
lktromp 1:1349bedd5793 154 }
lktromp 1:1349bedd5793 155 if (cursor == 0x00){
lktromp 1:1349bedd5793 156 cmd |= LCD_SHIFT_DISP;
lktromp 1:1349bedd5793 157 #ifdef DEBUG
lktromp 1:1349bedd5793 158 pc.printf("LCD Display Control Shift Display\r\n");
lktromp 1:1349bedd5793 159 #endif //DEBUG
lktromp 1:1349bedd5793 160 } else {
lktromp 1:1349bedd5793 161 cmd |= LCD_SHIFT_CURS;
lktromp 1:1349bedd5793 162 #ifdef DEBUG
lktromp 1:1349bedd5793 163 pc.printf("LCD Display Control Shift Cursor\r\n");
lktromp 1:1349bedd5793 164 #endif //DEBUG
lktromp 1:1349bedd5793 165 }
lktromp 1:1349bedd5793 166 charLcdSendCommand(cmd);
lktromp 1:1349bedd5793 167 }
lktromp 1:1349bedd5793 168
lktromp 1:1349bedd5793 169 void charLcd::charLcdFunctionSet(uint8 dots, uint8 lines, uint8 bits){
lktromp 1:1349bedd5793 170 uint8 cmd = LCD_FUNCTION;
lktromp 1:1349bedd5793 171 if (dots == 0x00){
lktromp 1:1349bedd5793 172 cmd |= LCD_FUNC_5x8;
lktromp 1:1349bedd5793 173 #ifdef DEBUG
lktromp 1:1349bedd5793 174 pc.printf("LCD Display Function Control 5x8\r\n");
lktromp 1:1349bedd5793 175 #endif //DEBUG
lktromp 1:1349bedd5793 176 } else {
lktromp 1:1349bedd5793 177 cmd |= LCD_FUNC_5x10;
lktromp 1:1349bedd5793 178 #ifdef DEBUG
lktromp 1:1349bedd5793 179 pc.printf("LCD Display Function Control 5x10\r\n");
lktromp 1:1349bedd5793 180 #endif //DEBUG
lktromp 1:1349bedd5793 181 }
lktromp 1:1349bedd5793 182 if (lines == 0x00){
lktromp 1:1349bedd5793 183 cmd |= LCD_FUNC_1LINES;
lktromp 1:1349bedd5793 184 #ifdef DEBUG
lktromp 1:1349bedd5793 185 pc.printf("LCD Display Function Control 1 Line\r\n");
lktromp 1:1349bedd5793 186 #endif //DEBUG
lktromp 1:1349bedd5793 187 } else {
lktromp 1:1349bedd5793 188 cmd |= LCD_FUNC_2LINES;
lktromp 1:1349bedd5793 189 #ifdef DEBUG
lktromp 1:1349bedd5793 190 pc.printf("LCD Display Function Control 2 Lines\r\n");
lktromp 1:1349bedd5793 191 #endif //DEBUG
lktromp 1:1349bedd5793 192 }
lktromp 1:1349bedd5793 193 if (bits == 0x00){
lktromp 1:1349bedd5793 194 cmd |= LCD_FUNC_8BIT;
lktromp 1:1349bedd5793 195 #ifdef DEBUG
lktromp 1:1349bedd5793 196 pc.printf("LCD Display Function Control 8 BIT\r\n");
lktromp 1:1349bedd5793 197 #endif //DEBUG
lktromp 1:1349bedd5793 198 } else {
lktromp 1:1349bedd5793 199 cmd |= LCD_FUNC_4BIT;
lktromp 1:1349bedd5793 200 #ifdef DEBUG
lktromp 1:1349bedd5793 201 pc.printf("LCD Display Function Control 4 BIT\r\n");
lktromp 1:1349bedd5793 202 #endif //DEBUG
lktromp 1:1349bedd5793 203 }
lktromp 1:1349bedd5793 204 charLcdSendCommand(cmd);
lktromp 1:1349bedd5793 205 //#define LCD_FUNCTION 0x20
lktromp 1:1349bedd5793 206 //#define LCD_FUNC_5x10 0x04
lktromp 1:1349bedd5793 207 //#define LCD_FUNC_5x8 0x00
lktromp 1:1349bedd5793 208 //#define LCD_FUNC_2LINES 0x08
lktromp 1:1349bedd5793 209 //#define LCD_FUNC_1LINES 0x00
lktromp 1:1349bedd5793 210 //#define LCD_FUNC_8BIT 0x10
lktromp 1:1349bedd5793 211 //#define LCD_FUNC_4BIT 0x00
lktromp 1:1349bedd5793 212 }
lktromp 1:1349bedd5793 213
lktromp 1:1349bedd5793 214 void charLcd::charLcdSetCGRAMaddress(uint8 adr) {
lktromp 1:1349bedd5793 215 charLcdSendCommand(LCD_SET_CGRAM & adr);
lktromp 1:1349bedd5793 216 }
lktromp 1:1349bedd5793 217
lktromp 1:1349bedd5793 218 void charLcd::charLcdSetDDRAMaddress(uint8 adr) {
lktromp 1:1349bedd5793 219 charLcdSendCommand(LCD_SET_DDRAM & adr);
lktromp 1:1349bedd5793 220 }
lktromp 1:1349bedd5793 221
lktromp 1:1349bedd5793 222 uint8 charLcd::charLcdReadBusyFlag() {
lktromp 1:1349bedd5793 223 return 0x00;
lktromp 1:1349bedd5793 224 }
lktromp 1:1349bedd5793 225
lktromp 1:1349bedd5793 226 void charLcd::charLcdWriteData(uint8 dat){
lktromp 1:1349bedd5793 227 cl_rs = 1;
lktromp 1:1349bedd5793 228 charLcdWriteByte(dat);
lktromp 1:1349bedd5793 229 }
lktromp 1:1349bedd5793 230
lktromp 1:1349bedd5793 231 uint8 charLcd::charLcdReadData(){
lktromp 1:1349bedd5793 232 cl_rs = 0;
lktromp 1:1349bedd5793 233 return 0x00;
lktromp 1:1349bedd5793 234 }
lktromp 1:1349bedd5793 235
lktromp 1:1349bedd5793 236 void charLcd::charLcdSendCommand(uint8 cmd) {
lktromp 1:1349bedd5793 237 cl_rs = 0;
lktromp 1:1349bedd5793 238 charLcdWriteByte(cmd);
lktromp 1:1349bedd5793 239 }
lktromp 1:1349bedd5793 240
lktromp 1:1349bedd5793 241 void charLcd::charLcdWriteByte(uint8 byte) {
lktromp 1:1349bedd5793 242 cl_charLcdData = byte;
lktromp 1:1349bedd5793 243 pc.printf("Write %#X to LCD\r\n", byte);
lktromp 1:1349bedd5793 244 wait_us(40); // setup time
lktromp 1:1349bedd5793 245 cl_en = 0;
lktromp 1:1349bedd5793 246 wait_us(40); //hold time
lktromp 1:1349bedd5793 247 cl_en = 1;
lktromp 1:1349bedd5793 248 }