Important changes to repositories hosted on mbed.com
Mbed hosted mercurial repositories are deprecated and are due to be permanently deleted in July 2026.
To keep a copy of this software download the repository Zip archive or clone locally using Mercurial.
It is also possible to export all your personal repositories from the account settings page.
lcd_2wire.cpp@0:23e6b8ed8dbd, 2011-12-25 (annotated)
- Committer:
- elektronaut
- Date:
- Sun Dec 25 17:33:53 2011 +0000
- Revision:
- 0:23e6b8ed8dbd
Who changed what in which revision?
| User | Revision | Line number | New 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 |