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.

Revision:
1:1349bedd5793
Child:
2:18f6402fd025
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/charLcd.cpp	Fri Mar 25 10:01:28 2011 +0000
@@ -0,0 +1,248 @@
+#include "mbed.h"
+#include "charLcd.h"
+#include "hd44780.h"
+#include "main.h"
+Serial pc(USBTX, USBRX);
+#define DEBUG
+
+    //constructor for 4-bit lcd control
+    charLcd::charLcd(PinName rs, PinName en, PinName rw, PinName d4, PinName d5, PinName d6, PinName d7, LCDType type) 
+    : cl_rs(rs), cl_rw(rw), cl_en(en), cl_charLcdData(d7, d6, d5, d4) {
+        pc.baud(115200);
+        #ifdef DEBUG
+            pc.printf("LCD 4bit init\r\n");
+        #endif //DEBUG
+        charLcdResetLCD();
+    }
+
+    //constructor for 8-bit lcd control
+    charLcd::charLcd(PinName rs, PinName en, PinName rw, PinName d0, PinName d1, PinName d2, PinName d3, PinName d4, PinName d5, 
+    PinName d6, PinName d7, LCDType type)
+    : cl_rs(rs), cl_rw(rw), cl_en(en), cl_charLcdData(d7, d6, d5, d4, d3, d2, d1, d0) {
+    
+        pc.baud(115200);
+        #ifdef DEBUG
+            pc.printf("LCD 8-bit init\r\n");
+        #endif //DEBUG
+        charLcdResetLCD();
+    
+    }
+
+
+
+void charLcd::charLcdResetLCD(void) {
+    cl_en  = 1;
+    cl_rs = 0;            // command mode
+    cl_rw = 0;
+    wait_ms(40);        // Wait 15ms to ensure powered up
+    charLcdFunctionSet(0,1,0);
+    wait_ms(5);        // Wait 15ms to ensure powered up
+    charLcdFunctionSet(0,1,0);
+    wait_us(100);        // Wait 15ms to ensure powered up
+    charLcdFunctionSet(0,1,0);
+    wait_us(100);        // Wait 15ms to ensure powered up
+    charLcdFunctionSet(0,1,0);
+    charLcdDisplayOn(0);
+    charLcdClear();
+    charLcdEntryMode(1,0);
+    //wait_ms(20);        // Wait 15ms to ensure powered up
+    //charLcdFunctionSet(0,1,0);
+    //wait_ms(20);        // Wait 15ms to ensure powered up
+    charLcdDisplayOn(1);
+    wait_ms(20);        // Wait 15ms to ensure powered up
+    charLcdCursor(1, 1);
+    wait_ms(20);        // Wait 15ms to ensure powered up
+    charLcdEntryMode(1,0);
+}
+
+void charLcd::charLcdClear (void){
+    #ifdef DEBUG
+            pc.printf("LCD Clear\r\n");
+    #endif //DEBUG
+    charLcdSendCommand(LCD_CLEAR);
+}
+void charLcd::charLcdReturnHome(){
+    #ifdef DEBUG
+            pc.printf("LCD Home\r\n");
+    #endif //DEBUG
+    charLcdSendCommand(LCD_HOME);
+}
+
+void charLcd::charLcdEntryMode(uint8 increment, uint8 shift){
+    uint8 cmd = LCD_ENTRY_MODE;
+    if (increment == 0x00){
+        cmd |= LCD_ENTRY_DEC;
+        #ifdef DEBUG
+            pc.printf("LCD Entry Mode decrement\r\n");
+        #endif //DEBUG
+    } else {
+        cmd |= LCD_ENTRY_INC;
+        #ifdef DEBUG
+            pc.printf("LCD Entry Mode Increment\r\n");
+        #endif //DEBUG
+    }
+    if (shift == 0x00){
+        #ifdef DEBUG
+            pc.printf("LCD Entry Mode Static\r\n");
+        #endif //DEBUGcmd |= LCD_ENTRY_STAT;
+        
+    } else {
+        cmd |=LCD_ENTRY_SHIFT;
+        #ifdef DEBUG
+            pc.printf("LCD Entry Mode Shift\r\n");
+        #endif //DEBUG
+    }    
+    charLcdSendCommand(cmd);
+    
+}
+
+void charLcd::charLcdDisplayOn(uint8 on){
+    uint8 cmd = LCD_DISPLAY_CTR;
+    if (on == 0x00){
+        cmd |= LCD_DISP_OFF;
+        #ifdef DEBUG
+            pc.printf("LCD Display Control Display off\r\n");
+        #endif //DEBUG
+    } else {
+        cmd |= LCD_DISP_ON;
+        #ifdef DEBUG
+            pc.printf("LCD Display Control Display on\r\n");
+        #endif //DEBUG
+    }
+    charLcdSendCommand(cmd);
+}
+
+void charLcd::charLcdCursor(uint8 cursor, uint8 blink){
+    uint8 cmd = LCD_DISPLAY_CTR;
+    if (cursor == 0x00){
+        cmd |= LCD_CURSOR_OFF;
+        #ifdef DEBUG
+            pc.printf("LCD Display Control Cursor off\r\n");
+        #endif //DEBUG
+    } else {
+        cmd |= LCD_CURSOR_ON;
+        #ifdef DEBUG
+            pc.printf("LCD Display Control Cursor on\r\n");
+        #endif //DEBUG
+    }
+    if (blink == 0x00){
+        cmd |= LCD_BLINK_OFF;
+        #ifdef DEBUG
+            pc.printf("LCD Display Control Cursor Blink off\r\n");
+        #endif //DEBUG
+    } else {
+        cmd |=LCD_BLINK_ON;
+        #ifdef DEBUG
+            pc.printf("LCD Display Control Cursor Blink on\r\n");
+        #endif //DEBUG
+    }    
+    charLcdSendCommand(cmd);
+}
+
+void charLcd::charLcdShift(uint8 left, uint8 cursor){
+    uint8 cmd = LCD_SHIFT;
+    if (left == 0x00){
+        cmd |= LCD_SHIFT_LEFT;
+        #ifdef DEBUG
+            pc.printf("LCD Shift Control Shift Left\r\n");
+        #endif //DEBUG
+    } else {
+        cmd |= LCD_SHIFT_RIGHT;
+        #ifdef DEBUG
+            pc.printf("LCD Display Control Shift Right\r\n");
+        #endif //DEBUG
+    }
+    if (cursor == 0x00){
+        cmd |= LCD_SHIFT_DISP;
+        #ifdef DEBUG
+            pc.printf("LCD Display Control Shift Display\r\n");
+        #endif //DEBUG
+    } else {
+        cmd |= LCD_SHIFT_CURS;
+        #ifdef DEBUG
+            pc.printf("LCD Display Control Shift Cursor\r\n");
+        #endif //DEBUG
+    }
+    charLcdSendCommand(cmd);
+}
+
+void charLcd::charLcdFunctionSet(uint8 dots, uint8 lines, uint8 bits){
+    uint8 cmd = LCD_FUNCTION;
+    if (dots == 0x00){
+        cmd |= LCD_FUNC_5x8;
+        #ifdef DEBUG
+            pc.printf("LCD Display Function Control 5x8\r\n");
+        #endif //DEBUG
+    } else {
+        cmd |= LCD_FUNC_5x10;
+        #ifdef DEBUG
+            pc.printf("LCD Display Function Control 5x10\r\n");
+        #endif //DEBUG
+    }
+    if (lines == 0x00){
+        cmd |= LCD_FUNC_1LINES;
+        #ifdef DEBUG
+            pc.printf("LCD Display Function Control 1 Line\r\n");
+        #endif //DEBUG
+    } else {
+        cmd |= LCD_FUNC_2LINES;
+        #ifdef DEBUG
+            pc.printf("LCD Display Function Control 2 Lines\r\n");
+        #endif //DEBUG
+    }
+    if (bits == 0x00){
+        cmd |= LCD_FUNC_8BIT;
+        #ifdef DEBUG
+            pc.printf("LCD Display Function Control 8 BIT\r\n");
+        #endif //DEBUG
+    } else {
+        cmd |= LCD_FUNC_4BIT;
+        #ifdef DEBUG
+            pc.printf("LCD Display Function Control 4 BIT\r\n");
+        #endif //DEBUG
+    }
+    charLcdSendCommand(cmd);
+//#define LCD_FUNCTION    0x20
+//#define LCD_FUNC_5x10   0x04
+//#define LCD_FUNC_5x8    0x00
+//#define LCD_FUNC_2LINES 0x08
+//#define LCD_FUNC_1LINES 0x00
+//#define LCD_FUNC_8BIT   0x10
+//#define LCD_FUNC_4BIT   0x00
+}
+
+void charLcd::charLcdSetCGRAMaddress(uint8 adr) {
+    charLcdSendCommand(LCD_SET_CGRAM & adr);
+}
+
+void charLcd::charLcdSetDDRAMaddress(uint8 adr) {
+    charLcdSendCommand(LCD_SET_DDRAM & adr);
+}
+
+uint8 charLcd::charLcdReadBusyFlag() {
+    return 0x00;
+}
+
+void charLcd::charLcdWriteData(uint8 dat){
+    cl_rs = 1;
+    charLcdWriteByte(dat);
+}
+
+uint8 charLcd::charLcdReadData(){
+    cl_rs = 0;
+    return 0x00;
+}
+        
+void charLcd::charLcdSendCommand(uint8 cmd) {
+    cl_rs = 0;
+    charLcdWriteByte(cmd);
+}
+
+void charLcd::charLcdWriteByte(uint8 byte) {
+    cl_charLcdData = byte;
+    pc.printf("Write %#X to LCD\r\n", byte);
+    wait_us(40); // setup time
+    cl_en = 0;
+    wait_us(40); //hold time
+    cl_en = 1;
+}