Werner Mueller / Mbed 2 deprecated 2wirelcd

Dependencies:   mbed

Committer:
elektronaut
Date:
Sun Dec 25 17:33:53 2011 +0000
Revision:
0:23e6b8ed8dbd

        

Who changed what in which revision?

UserRevisionLine numberNew contents of line
elektronaut 0:23e6b8ed8dbd 1 #include "mbed.h"
elektronaut 0:23e6b8ed8dbd 2 #include "lcd_2wire.h"
elektronaut 0:23e6b8ed8dbd 3
elektronaut 0:23e6b8ed8dbd 4
elektronaut 0:23e6b8ed8dbd 5 lcd_2wire::lcd_2wire (PinName pinc, PinName pind ): _pinc(pinc), _pind(pind) {
elektronaut 0:23e6b8ed8dbd 6 _pinc = 0;//clock signal
elektronaut 0:23e6b8ed8dbd 7 _pind = 0;// data signal
elektronaut 0:23e6b8ed8dbd 8 }
elektronaut 0:23e6b8ed8dbd 9 //-----------------------------
elektronaut 0:23e6b8ed8dbd 10 void lcd_2wire::LCD_SET_CLK(void) {
elektronaut 0:23e6b8ed8dbd 11 _pinc = 1;
elektronaut 0:23e6b8ed8dbd 12 }
elektronaut 0:23e6b8ed8dbd 13 //---------------------------------
elektronaut 0:23e6b8ed8dbd 14 void lcd_2wire::LCD_CLR_CLK(void) {
elektronaut 0:23e6b8ed8dbd 15 _pinc = 0;
elektronaut 0:23e6b8ed8dbd 16 }
elektronaut 0:23e6b8ed8dbd 17 //----------------------------------
elektronaut 0:23e6b8ed8dbd 18 void lcd_2wire::LCD_SET_DATA(void) {
elektronaut 0:23e6b8ed8dbd 19 _pind = 1;
elektronaut 0:23e6b8ed8dbd 20 }
elektronaut 0:23e6b8ed8dbd 21 //----------------------------------
elektronaut 0:23e6b8ed8dbd 22 void lcd_2wire::LCD_CLR_DATA(void) {
elektronaut 0:23e6b8ed8dbd 23 _pind = 0;
elektronaut 0:23e6b8ed8dbd 24 }
elektronaut 0:23e6b8ed8dbd 25 //----------------------------------
elektronaut 0:23e6b8ed8dbd 26 int LCD_ROW_TABLE[4] = { //Display row addresses
elektronaut 0:23e6b8ed8dbd 27 0x80,
elektronaut 0:23e6b8ed8dbd 28 0xC0,
elektronaut 0:23e6b8ed8dbd 29 0x80 + LCD_COLS,
elektronaut 0:23e6b8ed8dbd 30 0xC0 + LCD_COLS
elektronaut 0:23e6b8ed8dbd 31 };
elektronaut 0:23e6b8ed8dbd 32 //----------------------------------------
elektronaut 0:23e6b8ed8dbd 33 void lcd_2wire::lcd_delay(void) {
elektronaut 0:23e6b8ed8dbd 34 wait_us(100);
elektronaut 0:23e6b8ed8dbd 35 }
elektronaut 0:23e6b8ed8dbd 36 //-------------------------------------------
elektronaut 0:23e6b8ed8dbd 37 void lcd_2wire::lcd_init_shift_reg(int mode) { //Clear shift register, set E and RS
elektronaut 0:23e6b8ed8dbd 38 int n;
elektronaut 0:23e6b8ed8dbd 39
elektronaut 0:23e6b8ed8dbd 40 LCD_CLR_DATA(); //clear data signal
elektronaut 0:23e6b8ed8dbd 41 lcd_delay();
elektronaut 0:23e6b8ed8dbd 42
elektronaut 0:23e6b8ed8dbd 43 //clear all outputs of shift register
elektronaut 0:23e6b8ed8dbd 44 for (n=7; n; n--) {
elektronaut 0:23e6b8ed8dbd 45 LCD_SET_CLK();
elektronaut 0:23e6b8ed8dbd 46 lcd_delay();
elektronaut 0:23e6b8ed8dbd 47 LCD_CLR_CLK();
elektronaut 0:23e6b8ed8dbd 48 }
elektronaut 0:23e6b8ed8dbd 49
elektronaut 0:23e6b8ed8dbd 50 //Set high level for E at Q7
elektronaut 0:23e6b8ed8dbd 51 LCD_SET_DATA();
elektronaut 0:23e6b8ed8dbd 52 lcd_delay();
elektronaut 0:23e6b8ed8dbd 53 LCD_SET_CLK();
elektronaut 0:23e6b8ed8dbd 54 lcd_delay();
elektronaut 0:23e6b8ed8dbd 55 LCD_CLR_CLK();
elektronaut 0:23e6b8ed8dbd 56
elektronaut 0:23e6b8ed8dbd 57 //Set level for RS at Q6
elektronaut 0:23e6b8ed8dbd 58 if (mode == LCD_DATA_MODE) {
elektronaut 0:23e6b8ed8dbd 59 LCD_SET_DATA();
elektronaut 0:23e6b8ed8dbd 60 } else {
elektronaut 0:23e6b8ed8dbd 61 LCD_CLR_DATA();
elektronaut 0:23e6b8ed8dbd 62 }
elektronaut 0:23e6b8ed8dbd 63 lcd_delay();
elektronaut 0:23e6b8ed8dbd 64 LCD_SET_CLK();
elektronaut 0:23e6b8ed8dbd 65 lcd_delay();
elektronaut 0:23e6b8ed8dbd 66 LCD_CLR_CLK();
elektronaut 0:23e6b8ed8dbd 67 }
elektronaut 0:23e6b8ed8dbd 68 //----------------------------------------------
elektronaut 0:23e6b8ed8dbd 69 void lcd_2wire::lcd_shift_nibble(int data) { //Clock in 4 bits of data
elektronaut 0:23e6b8ed8dbd 70 int n, mask= 0x08;
elektronaut 0:23e6b8ed8dbd 71 for (n =4; n; n--) { //do this for 4 databits
elektronaut 0:23e6b8ed8dbd 72 if (data & mask) { // set or reset data signal
elektronaut 0:23e6b8ed8dbd 73 LCD_SET_DATA();
elektronaut 0:23e6b8ed8dbd 74 } else {
elektronaut 0:23e6b8ed8dbd 75 LCD_CLR_DATA();
elektronaut 0:23e6b8ed8dbd 76 }
elektronaut 0:23e6b8ed8dbd 77 LCD_SET_CLK();
elektronaut 0:23e6b8ed8dbd 78 lcd_delay();
elektronaut 0:23e6b8ed8dbd 79 LCD_CLR_CLK();
elektronaut 0:23e6b8ed8dbd 80 mask >>= 1; // shift right
elektronaut 0:23e6b8ed8dbd 81 }
elektronaut 0:23e6b8ed8dbd 82 LCD_SET_CLK();
elektronaut 0:23e6b8ed8dbd 83 lcd_delay();
elektronaut 0:23e6b8ed8dbd 84 LCD_CLR_CLK();
elektronaut 0:23e6b8ed8dbd 85 }
elektronaut 0:23e6b8ed8dbd 86 //-------------------------------------------------
elektronaut 0:23e6b8ed8dbd 87
elektronaut 0:23e6b8ed8dbd 88 void lcd_2wire::lcd_shift_byte(int data , int mode) {
elektronaut 0:23e6b8ed8dbd 89 lcd_init_shift_reg(mode);
elektronaut 0:23e6b8ed8dbd 90 lcd_shift_nibble(data >> 4);
elektronaut 0:23e6b8ed8dbd 91 LCD_SET_DATA();
elektronaut 0:23e6b8ed8dbd 92 lcd_delay();
elektronaut 0:23e6b8ed8dbd 93 if (mode != LCD_INIT_MODE) {
elektronaut 0:23e6b8ed8dbd 94 lcd_init_shift_reg(mode);
elektronaut 0:23e6b8ed8dbd 95 lcd_shift_nibble(data);
elektronaut 0:23e6b8ed8dbd 96 LCD_SET_DATA();
elektronaut 0:23e6b8ed8dbd 97 lcd_delay();
elektronaut 0:23e6b8ed8dbd 98 }
elektronaut 0:23e6b8ed8dbd 99 LCD_CLR_DATA();
elektronaut 0:23e6b8ed8dbd 100 lcd_delay();
elektronaut 0:23e6b8ed8dbd 101 }
elektronaut 0:23e6b8ed8dbd 102 //-------------------------------------------------
elektronaut 0:23e6b8ed8dbd 103 void lcd_2wire::lcd_write_command(int command) {
elektronaut 0:23e6b8ed8dbd 104 lcd_shift_byte(command,LCD_CMD_MODE);
elektronaut 0:23e6b8ed8dbd 105 }
elektronaut 0:23e6b8ed8dbd 106 //---------------------------------------------------
elektronaut 0:23e6b8ed8dbd 107 void lcd_2wire::lcd_write_data(int data) {
elektronaut 0:23e6b8ed8dbd 108 lcd_shift_byte(data,LCD_DATA_MODE);
elektronaut 0:23e6b8ed8dbd 109 }
elektronaut 0:23e6b8ed8dbd 110 //----------------------------------------------
elektronaut 0:23e6b8ed8dbd 111 //Functions flags - Bit 0 0: 5x7 Dots 1:5x10 Dots
elektronaut 0:23e6b8ed8dbd 112 // Bit 1 0: 1 Row 1: 2 Rows
elektronaut 0:23e6b8ed8dbd 113 // Bit 2 0: 4-Bit Intf 1: 8-Bit Intf
elektronaut 0:23e6b8ed8dbd 114 void lcd_2wire::lcd_function_mode(int function_mode) {
elektronaut 0:23e6b8ed8dbd 115 function_mode =((function_mode & 7) << 2) + 0x20;
elektronaut 0:23e6b8ed8dbd 116 lcd_write_command(function_mode);
elektronaut 0:23e6b8ed8dbd 117 }
elektronaut 0:23e6b8ed8dbd 118 //-------------------------------------------------
elektronaut 0:23e6b8ed8dbd 119 void lcd_2wire::lcd_display_mode(int display_mode) {
elektronaut 0:23e6b8ed8dbd 120 display_mode =(display_mode & 7) + 0x08;
elektronaut 0:23e6b8ed8dbd 121 lcd_write_command(display_mode);
elektronaut 0:23e6b8ed8dbd 122 }
elektronaut 0:23e6b8ed8dbd 123 //-------------------------------------------------
elektronaut 0:23e6b8ed8dbd 124 void lcd_2wire::lcd_entry_mode(int entry_mode) {
elektronaut 0:23e6b8ed8dbd 125 entry_mode =(entry_mode & 3) + 0x04;
elektronaut 0:23e6b8ed8dbd 126 lcd_write_command(entry_mode);
elektronaut 0:23e6b8ed8dbd 127 }
elektronaut 0:23e6b8ed8dbd 128 //-------------------------------------------------
elektronaut 0:23e6b8ed8dbd 129 void lcd_2wire::lcd_clear(void) {
elektronaut 0:23e6b8ed8dbd 130 lcd_write_command(LCD_CLR);
elektronaut 0:23e6b8ed8dbd 131 }
elektronaut 0:23e6b8ed8dbd 132 //--------------------------------------------------
elektronaut 0:23e6b8ed8dbd 133 void lcd_2wire::lcd_home(void) {
elektronaut 0:23e6b8ed8dbd 134 lcd_write_command(LCD_HOME);
elektronaut 0:23e6b8ed8dbd 135 }
elektronaut 0:23e6b8ed8dbd 136 //--------------------------------------------------
elektronaut 0:23e6b8ed8dbd 137 void lcd_2wire::lcd_goto_xy(int xpos, int ypos) {
elektronaut 0:23e6b8ed8dbd 138 if (xpos < LCD_COLS && ypos <LCD_ROWS) {
elektronaut 0:23e6b8ed8dbd 139 lcd_write_command(LCD_ROW_TABLE[ypos] + xpos);
elektronaut 0:23e6b8ed8dbd 140 }
elektronaut 0:23e6b8ed8dbd 141 }
elektronaut 0:23e6b8ed8dbd 142 //---------------------------------------------------
elektronaut 0:23e6b8ed8dbd 143 void lcd_2wire::lcd_write_char(int chr) {
elektronaut 0:23e6b8ed8dbd 144 lcd_write_data(chr);
elektronaut 0:23e6b8ed8dbd 145 }
elektronaut 0:23e6b8ed8dbd 146 //--------------------------------------------------
elektronaut 0:23e6b8ed8dbd 147 void lcd_2wire::lcd_write_char_xy(int x, int y, int chr) {
elektronaut 0:23e6b8ed8dbd 148 lcd_goto_xy(x,y);
elektronaut 0:23e6b8ed8dbd 149 lcd_write_data(chr);
elektronaut 0:23e6b8ed8dbd 150 }
elektronaut 0:23e6b8ed8dbd 151 //------------------------------------------------
elektronaut 0:23e6b8ed8dbd 152 void lcd_2wire::lcd_write_str(const char *sp) {
elektronaut 0:23e6b8ed8dbd 153 while (*sp) {
elektronaut 0:23e6b8ed8dbd 154 lcd_write_data(*sp++);
elektronaut 0:23e6b8ed8dbd 155 }
elektronaut 0:23e6b8ed8dbd 156 }
elektronaut 0:23e6b8ed8dbd 157 //----------------------------------------------------
elektronaut 0:23e6b8ed8dbd 158 void lcd_2wire::lcd_write_str_xy(int x, int y, const char *sp) {
elektronaut 0:23e6b8ed8dbd 159 lcd_goto_xy(x,y);
elektronaut 0:23e6b8ed8dbd 160 lcd_write_data(*sp++);
elektronaut 0:23e6b8ed8dbd 161 }
elektronaut 0:23e6b8ed8dbd 162 //----------------------------------------------------
elektronaut 0:23e6b8ed8dbd 163 void lcd_2wire::lcd_init(void) {
elektronaut 0:23e6b8ed8dbd 164 LCD_CLR_CLK();
elektronaut 0:23e6b8ed8dbd 165 LCD_CLR_DATA();
elektronaut 0:23e6b8ed8dbd 166
elektronaut 0:23e6b8ed8dbd 167 wait_ms(LCD_POWER_UP_DELAY_MS);
elektronaut 0:23e6b8ed8dbd 168
elektronaut 0:23e6b8ed8dbd 169 //Startinitialisation
elektronaut 0:23e6b8ed8dbd 170
elektronaut 0:23e6b8ed8dbd 171 lcd_shift_byte(LCD_FUNCTION_8BIT_1LINE,LCD_INIT_MODE);
elektronaut 0:23e6b8ed8dbd 172 wait_ms(LCD_INIT_DELAY_MS);
elektronaut 0:23e6b8ed8dbd 173 lcd_shift_byte(LCD_FUNCTION_8BIT_1LINE,LCD_INIT_MODE);
elektronaut 0:23e6b8ed8dbd 174 wait_ms(LCD_INIT_DELAY_MS);
elektronaut 0:23e6b8ed8dbd 175 lcd_shift_byte(LCD_FUNCTION_8BIT_1LINE,LCD_INIT_MODE);
elektronaut 0:23e6b8ed8dbd 176 wait_ms(LCD_INIT_DELAY_MS);
elektronaut 0:23e6b8ed8dbd 177 lcd_shift_byte(LCD_FUNCTION_4BIT_1LINE,LCD_INIT_MODE);
elektronaut 0:23e6b8ed8dbd 178 wait_ms(LCD_INIT_DELAY_MS);
elektronaut 0:23e6b8ed8dbd 179 //Display is in 4 bit I/O mode now
elektronaut 0:23e6b8ed8dbd 180 #if (LCD_ROWS > 1)
elektronaut 0:23e6b8ed8dbd 181 lcd_write_command(LCD_FUNCTION_4BIT_2LINE);
elektronaut 0:23e6b8ed8dbd 182 #else
elektronaut 0:23e6b8ed8dbd 183 lcd_write_command(LCD_FUNCTION_4BIT_1LINE);
elektronaut 0:23e6b8ed8dbd 184 #endif
elektronaut 0:23e6b8ed8dbd 185 wait_ms(LCD_INIT_DELAY_MS);
elektronaut 0:23e6b8ed8dbd 186 lcd_write_command(LCD_DISP_ON);
elektronaut 0:23e6b8ed8dbd 187 wait_ms(LCD_INIT_DELAY_MS);
elektronaut 0:23e6b8ed8dbd 188 lcd_write_command(LCD_CLR);
elektronaut 0:23e6b8ed8dbd 189 lcd_write_command(LCD_HOME);
elektronaut 0:23e6b8ed8dbd 190 wait_ms(LCD_INIT_DELAY_MS);
elektronaut 0:23e6b8ed8dbd 191 }
elektronaut 0:23e6b8ed8dbd 192