2wireLCD

Table of Contents

    2-wire-LCD-Interface

    This is a 2-wire-LCD-interface, but not I2C.

    • Advantage:
    • You can use all pins to connect your LCD.
    • You don't need especially (I2C)IC.
    • high Refresh-Rate for the Display.(any MHz I2C only 400kHz)

    /media/uploads/elektronaut/lcd1.png

    • here is the programm:

    #include "mbed.h"
    #include "lcd_2wire.h"
    
    
    lcd_2wire dis(p29,p30);
    AnalogIn input(p20);
    DigitalOut myled(LED1);
    
    float wert;
    char c[3];
    int main() {
        dis.lcd_init();
        dis.lcd_goto_xy(0,0);
        dis.lcd_write_str("********************");
        dis.lcd_goto_xy(7,1);
        dis.lcd_write_str("Hallo");
        dis.lcd_goto_xy(7,2);
        dis.lcd_write_str("MBED!");
        dis.lcd_goto_xy(0,3);
        dis.lcd_write_str("********************");
        wait(2);
        
        
        while (1) {
            wert = input.read();
            sprintf(c,"%.3f",wert);
            dis.lcd_clear();
            dis.lcd_goto_xy(7,1);
            dis.lcd_write_str("Analogwert:");
            dis.lcd_goto_xy(7,2);
            dis.lcd_write_str(c);
            wait_ms(1);
            myled = 1;
            wait(0.1);
            myled = 0;
            wait(0.1);
        }
    }
    
    • here is the necessary library:

    #include "mbed.h"
    #include "lcd_2wire.h"
    
    
    lcd_2wire::lcd_2wire (PinName pinc, PinName pind ): _pinc(pinc),  _pind(pind) {
        _pinc = 0;//clock signal
        _pind = 0;// data signal
    }
    //-----------------------------
    void lcd_2wire::LCD_SET_CLK(void) {
        _pinc = 1;
    }
    //---------------------------------
    void lcd_2wire::LCD_CLR_CLK(void) {
        _pinc = 0;
    }
    //----------------------------------
    void lcd_2wire::LCD_SET_DATA(void) {
        _pind = 1;
    }
    //----------------------------------
    void lcd_2wire::LCD_CLR_DATA(void) {
        _pind = 0;
    }
    //----------------------------------
    int LCD_ROW_TABLE[4] = {  //Display row addresses
        0x80,
        0xC0,
        0x80 + LCD_COLS,
        0xC0 + LCD_COLS
    };
    //----------------------------------------
    void lcd_2wire::lcd_delay(void) { 
        wait_us(100);
    }
    //-------------------------------------------
    void lcd_2wire::lcd_init_shift_reg(int mode) {   //Clear shift register, set E and RS
        int n;
    
        LCD_CLR_DATA(); //clear data signal
        lcd_delay();
    
    //clear all outputs of shift register
        for (n=7; n; n--) {
            LCD_SET_CLK();
            lcd_delay();
            LCD_CLR_CLK();
        }
    
    //Set high level for E at Q7
        LCD_SET_DATA();
        lcd_delay();
        LCD_SET_CLK();
        lcd_delay();
        LCD_CLR_CLK();
    
    //Set level for RS at Q6
        if (mode == LCD_DATA_MODE) {
            LCD_SET_DATA();
        } else {
            LCD_CLR_DATA();
        }
        lcd_delay();
        LCD_SET_CLK();
        lcd_delay();
        LCD_CLR_CLK();
    }
    //----------------------------------------------
    void lcd_2wire::lcd_shift_nibble(int data) { //Clock in 4 bits of data
        int n, mask= 0x08;
        for (n =4; n; n--) {   //do this for 4 databits
            if (data & mask) {  // set or reset data signal
                LCD_SET_DATA();
            } else {
                LCD_CLR_DATA();
            }
            LCD_SET_CLK();
            lcd_delay();
            LCD_CLR_CLK();
            mask >>= 1;  // shift right
        }
        LCD_SET_CLK();
        lcd_delay();
        LCD_CLR_CLK();
    }
    //-------------------------------------------------
    
    void lcd_2wire::lcd_shift_byte(int data , int mode) {
        lcd_init_shift_reg(mode);
        lcd_shift_nibble(data >> 4);
        LCD_SET_DATA();
        lcd_delay();
        if (mode != LCD_INIT_MODE) {
            lcd_init_shift_reg(mode);
            lcd_shift_nibble(data);
            LCD_SET_DATA();
            lcd_delay();
        }
        LCD_CLR_DATA();
        lcd_delay();
    }
    //-------------------------------------------------
    void lcd_2wire::lcd_write_command(int command) {
        lcd_shift_byte(command,LCD_CMD_MODE);
    }
    //---------------------------------------------------
    void lcd_2wire::lcd_write_data(int data) {
        lcd_shift_byte(data,LCD_DATA_MODE);
    }
    //----------------------------------------------
    //Functions flags - Bit 0  0: 5x7 Dots   1:5x10 Dots
    //                  Bit 1  0: 1 Row      1: 2 Rows
    //                  Bit 2  0: 4-Bit Intf 1: 8-Bit Intf
    void lcd_2wire::lcd_function_mode(int function_mode) {
        function_mode =((function_mode & 7) << 2) + 0x20;
        lcd_write_command(function_mode);
    }
    //-------------------------------------------------
    void lcd_2wire::lcd_display_mode(int display_mode) {
        display_mode =(display_mode & 7) + 0x08;
        lcd_write_command(display_mode);
    }
    //-------------------------------------------------
    void lcd_2wire::lcd_entry_mode(int entry_mode) {
        entry_mode =(entry_mode & 3) + 0x04;
        lcd_write_command(entry_mode);
    }
    //-------------------------------------------------
    void lcd_2wire::lcd_clear(void) {
        lcd_write_command(LCD_CLR);
    }
    //--------------------------------------------------
    void lcd_2wire::lcd_home(void) {
        lcd_write_command(LCD_HOME);
    }
    //--------------------------------------------------
    void lcd_2wire::lcd_goto_xy(int xpos, int ypos) {
        if (xpos < LCD_COLS && ypos <LCD_ROWS) {
            lcd_write_command(LCD_ROW_TABLE[ypos] + xpos);
        }
    }
    //---------------------------------------------------
    void lcd_2wire::lcd_write_char(int chr) {
        lcd_write_data(chr);
    }
    //--------------------------------------------------
    void lcd_2wire::lcd_write_char_xy(int x, int y, int chr) {
        lcd_goto_xy(x,y);
        lcd_write_data(chr);
    }
    //------------------------------------------------
    void lcd_2wire::lcd_write_str(const char *sp) {
        while (*sp) {
            lcd_write_data(*sp++);
        }
    }
    //----------------------------------------------------
    void lcd_2wire::lcd_write_str_xy(int x, int y, const char *sp) {
        lcd_goto_xy(x,y);
        lcd_write_data(*sp++);
    }
    //----------------------------------------------------
    void lcd_2wire::lcd_init(void) {
        LCD_CLR_CLK();
        LCD_CLR_DATA();
    
        wait_ms(LCD_POWER_UP_DELAY_MS);
    
    //Startinitialisation
    
        lcd_shift_byte(LCD_FUNCTION_8BIT_1LINE,LCD_INIT_MODE);
        wait_ms(LCD_INIT_DELAY_MS);
        lcd_shift_byte(LCD_FUNCTION_8BIT_1LINE,LCD_INIT_MODE);
        wait_ms(LCD_INIT_DELAY_MS);
        lcd_shift_byte(LCD_FUNCTION_8BIT_1LINE,LCD_INIT_MODE);
        wait_ms(LCD_INIT_DELAY_MS);
        lcd_shift_byte(LCD_FUNCTION_4BIT_1LINE,LCD_INIT_MODE);
        wait_ms(LCD_INIT_DELAY_MS);
    //Display is in 4 bit I/O mode now
    #if (LCD_ROWS > 1)
        lcd_write_command(LCD_FUNCTION_4BIT_2LINE);
    #else
        lcd_write_command(LCD_FUNCTION_4BIT_1LINE);
    #endif
        wait_ms(LCD_INIT_DELAY_MS);
        lcd_write_command(LCD_DISP_ON);
        wait_ms(LCD_INIT_DELAY_MS);
        lcd_write_command(LCD_CLR);
        lcd_write_command(LCD_HOME);
        wait_ms(LCD_INIT_DELAY_MS);
    }
    
    
    • and the header

    #ifndef MBED_LCD_2WIRE_H
    #define MBED_LCD_2WIRE_H
    
    #include "mbed.h"
    
    class lcd_2wire {
    public:
        lcd_2wire(PinName pinc, PinName pind);
    
    #define LCD_CMD_MODE 0
    #define LCD_DATA_MODE 1
    #define LCD_INIT_MODE 2
    #define LCD_CLR 1
    #define LCD_HOME 2
    #define LCD_DISP_ON 0x0C
    #define LCD_FUNCTION_4BIT_1LINE 0x20
    #define LCD_FUNCTION_4BIT_2LINE 0x28
    #define LCD_FUNCTION_8BIT_1LINE 0x30
    #define LCD_FUNCTION_8BIT_2LINE 0x38
    #define LCD_COLS 20
    #define LCD_ROWS 4
    #define LCD_POWER_UP_DELAY_MS 50
    #define LCD_INIT_DELAY_MS 5
    
    
        void lcd_init(void);
        void lcd_clear();
        void lcd_home(void);
        void lcd_goto_xy(int xpos, int ypos);
        void lcd_write_char(int chr);
        void lcd_write_char_xy(int x, int y, int chr);
        void lcd_write_str(const char *sp);
        void lcd_write_str_xy(int x,int y,const char *sp);
    
    private:
        DigitalOut _pinc;
        DigitalOut _pind;
        void LCD_SET_CLK();
        void LCD_CLR_CLK();
        void LCD_SET_DATA();
        void LCD_CLR_DATA();
        void lcd_delay();
        void lcd_init_shift_reg(int mode);
        void lcd_shift_nibble(int data);
        void lcd_shift_byte(int data, int mode);
        void lcd_write_command(int command);
        void lcd_write_data(int data);
        void lcd_function_mode(int function_mode);
        void lcd_display_mode(int display_mode);
        void lcd_entry_mode(int entry_mode);
    };
    #endif
    
    • to the end any photos /media/uploads/elektronaut/photmbed.jpg /media/uploads/elektronaut/photplah.jpg

    All wikipages