// http://www.solomon-systech.com
// http://www.lcd-module.de/fileadmin/eng/pdf/zubehoer/ssd1803a_2_0.pdf
-enum {
+#ifndef PREF
+#define PREF(X) LCD_##X
+#endif
+
+enum { // I2C address
SSD1803_I2C_ADDR_SA0 = 0b0111100, // I2C address, SA0 = 0
SSD1803_I2C_ADDR_SA1 = 0b0111101, // I2C address, SA0 = 1
+};
+
+enum { // I2C control byte
+ PREF(I2C_CTRL_CMD) = 0<<6, // D/C: CMD byte follows
+ PREF(I2C_CTRL_DATA) = 1<<6, // D/C: DATA byte follows
+ PREF(I2C_CTRL_CO) = 1<<7, // Co, Continuation: CTRL sequence follows
+};
- // I2C control byte
- LCD_I2C_CTRL_CMD = 0<<6, // D/C: CMD byte follows
- LCD_I2C_CTRL_DATA = 1<<6, // D/C: DATA byte follows
- LCD_I2C_CTRL_CO = 1<<7, // Co, Continuation: CTRL sequence follows
+enum { // Status byte
+ PREF(BUSY) = 1<<7, // BF, Busy flag
};
-// Command codes
-enum {
- LCD_CLEAR = 0b00000001, // Clear Display
- LCD_HOME = 0b00000010, // Return Home (RE=0)
- LCD_POWER_DOWN = 0b00000011, // PD, Power Down Mode (RE=1)
-
- LCD_MODE = 0b00000100, // Entry Mode Set
- LCD_MODE_INC = 1<<1, // I, Increment pos after access (RE=0)
- LCD_MODE_SHIFT = 1<<0, // S, Display shift after access (RE=0)
- LCD_MODE_BDC = 1<<1, // BDC, reverse Common (COMx) (RE=1)
- LCD_MODE_BDS = 1<<0, // BDS, reverse Segment (SEGx) (RE=1)
-
- LCD_CTRL = 0b00001000, // Display ON/OFF Control (RE=0)
- LCD_CTRL_ON = 1<<2, // D, Display ON
- LCD_CTRL_CURS = 1<<1, // C, Cursor ON
- LCD_CTRL_BLINK = 1<<0, // B, Blink ON
-
- LCD_EXT = 0b00001000, // Extended function set (RE=1)
- LCD_EXT_FW = 1<<2, // FW, 6-dot/5-dot font width
- LCD_EXT_INV = 1<<1, // B/W, black/white inverting of cursor
- LCD_EXT_NW = 1<<0, // NW, 3,4-line/1,2-line display
-
- LCD_SHIFT = 0b00010000, // Cursor or Display Shift (IS=0, RE=0)
- LCD_SHIFT_DISP = 1<<4, // S/C, display/cursor shift
- LCD_SHIFT_R = 1<<3, // R/L, Shift to right/left
-
- LCD_CTRL2 = 0b00010000, // Double height / Bias / Display-dot shift (IS=1, RE=0)
- LCD_CTRL2_UD2 = 1<<3, // UD2
- LCD_CTRL2_UD1 = 1<<2, // UD1
- LCD_CTRL2_BS1 = 1<<1, // BS1
- LCD_CTRL2_DH = 1<<0, // DH, display shift / dot scroll
-
- LCD_OSC = 0b00010000, // Internal OSC frequency (IS=1, RE=0)
- LCD_OSC_BS0 = 1<<3, // BS0
- LCD_OSC_F2 = 1<<2, // F2
+enum { // Command codes
+ PREF(CLEAR) = 1<<0, // Clear Display
+
+ PREF(HOME) = 1<<1, // Return Home (RE=0)
+
+ PREF(POWER_DOWN) = 0b00000011, // PD, Power Down Mode (RE=1)
+
+ PREF(MODE) = 1<<2, // Entry Mode Set
+ PREF(MODE_INC) = 1<<1, // I, Increment pos after access (RE=0)
+ PREF(MODE_SHIFT) = 1<<0, // S, Display shift after access (RE=0)
+ PREF(MODE_BDC) = 1<<1, // BDC, reverse Common (COMx) (RE=1)
+ PREF(MODE_BDS) = 1<<0, // BDS, reverse Segment (SEGx) (RE=1)
+
+ PREF(CTRL) = 1<<3, // Display ON/OFF Control (RE=0)
+ PREF(CTRL_ON) = 1<<2, // D, Display ON
+ PREF(CTRL_CURS) = 1<<1, // C, Cursor ON
+ PREF(CTRL_BLINK) = 1<<0, // B, Blink ON
+
+ PREF(EXT) = 1<<3, // Extended function set (RE=1)
+ PREF(EXT_FW) = 1<<2, // FW, 6-dot/5-dot font width
+ PREF(EXT_INV) = 1<<1, // B/W, black/white inverting of cursor
+ PREF(EXT_NW) = 1<<0, // NW, 3,4-line/1,2-line display
+
+ PREF(SHIFT) = 1<<4, // Cursor or Display Shift (IS=0, RE=0)
+ PREF(SHIFT_DISP) = 1<<3, // S/C, display/cursor shift
+ PREF(SHIFT_R) = 1<<2, // R/L, Shift to right/left
+
+ PREF(CTRL2) = 1<<4, // Double height / Bias / Display-dot shift (IS=1, RE=0)
+ PREF(CTRL2_UD2) = 1<<3, // UD2
+ PREF(CTRL2_UD1) = 1<<2, // UD1
+ PREF(CTRL2_BS1) = 1<<1, // BS1
+ PREF(CTRL2_DH) = 1<<0, // DH, display shift / dot scroll
+
+ PREF(OSC) = 1<<4, // Internal OSC frequency (IS=1, RE=0)
+ PREF(OSC_BS0) = 1<<3, // BS0
+ PREF(OSC_F2) = 1<<2, // F2
// ...
- LCD_SHIFT = 0b00010000, // Shift/Scroll enable (IS=1, RE=1)
- LCD_SHIFT_L1 = 1<<0, // DS1/HS1, 1st line shift/scroll enable
- LCD_SHIFT_L2 = 1<<1, // DS2/HS2, 2nd line shift/scroll enable
- LCD_SHIFT_L3 = 1<<2, // DS3/HS3, 3rd line shift/scroll enable
- LCD_SHIFT_L4 = 1<<3, // DS4/HS4, 4th line shift/scroll enable
+ PREF(SHIFT_EN) = 1<<4, // Shift/Scroll enable (IS=1, RE=1)
+ PREF(SHIFT_EN_L1) = 1<<0, // DS1/HS1, 1st line shift/scroll enable
+ PREF(SHIFT_EN_L2) = 1<<1, // DS2/HS2, 2nd line shift/scroll enable
+ PREF(SHIFT_EN_L3) = 1<<2, // DS3/HS3, 3rd line shift/scroll enable
+ PREF(SHIFT_EN_L4) = 1<<3, // DS4/HS4, 4th line shift/scroll enable
- LCD_FUNC = 0b00100000, // Function Set
- LCD_FUNC_8BIT = 1<<4, // DL, 8-bit interface
- LCD_FUNC_2LINE = 1<<3, // N, 2,4-line/1,3-line display
- LCD_FUNC_RE = 1<<1, // RE
+ PREF(FUNC) = 1<<5, // Function Set
+ PREF(FUNC_8BIT) = 1<<4, // DL, 8-bit interface
+ PREF(FUNC_2LINE) = 1<<3, // N, 2,4-line/1,3-line display
+ PREF(FUNC_RE) = 1<<1, // RE
- LCD_FUNC_DH = 1<<2, // DH, double height font (RE=0)
- LCD_FUNC_IS = 1<<0, // IS (RE=0)
+ PREF(FUNC_DH) = 1<<2, // DH, double height font (RE=0)
+ PREF(FUNC_IS) = 1<<0, // IS (RE=0)
- LCD_FUNC_BE = 1<<2, // BE, blink enable (RE=1)
- LCD_FUNC_REV = 1<<0, // REV, reverse display (RE=1)
+ PREF(FUNC_BE) = 1<<2, // BE, blink enable (RE=1)
+ PREF(FUNC_REV) = 1<<0, // REV, reverse display (RE=1)
- LCD_CGRAM = 0b01000000, // Set CGRAM Address (IS=0, RE=0)
- LCD_SEGRAM = 0b01000000, // Set SEGRAM Address (IS=1, RE=0)
+ PREF(CGRAM) = 1<<6, // Set CGRAM Address (IS=0, RE=0)
- LCD_PIC = 0b01010000, // Power / Icon control/ Contrast set (IS=1, RE=0)
- LCD_PIC_I = 1<<3, // Ion, ICON ON
- LCD_PIC_B = 1<<2, // Bon, booster ON
- LCD_PIC_C5 = 1<<1, // C5, contrast
- LCD_PIC_C4 = 1<<0, // C4, contrast
+ PREF(SEGRAM) = 0b01000000, // Set SEGRAM Address (IS=1, RE=0)
- LCD_FLLW = 0b01100000, // Follower Control (IS=1, RE=0)
- LCD_FLLW_D = 1<<3, // Don, Driver ON
- LCD_FLLW_R2 = 1<<2, // Rab2, Select Amplifier internal resistor ratio
- LCD_FLLW_R1 = 1<<1, // Rab1, Select Amplifier internal resistor ratio
- LCD_FLLW_R0 = 1<<0, // Rab0, Select Amplifier internal resistor ratio
+ PREF(PIC) = 0b01010000, // Power / Icon / Contrast set (IS=1, RE=0)
+ PREF(PIC_I) = 1<<3, // Ion, ICON ON
+ PREF(PIC_B) = 1<<2, // Bon, booster ON
+ PREF(PIC_C5) = 1<<1, // C5, contrast
+ PREF(PIC_C4) = 1<<0, // C4, contrast
- LCD_CONTR = 0b01110000, // Contrast set (IS=1, RE=0)
+ PREF(FLLW) = 0b01100000, // Follower Control (IS=1, RE=0)
+ PREF(FLLW_D) = 1<<3, // Don, Driver ON
+ PREF(FLLW_R2) = 1<<2, // Rab2, Select Amplifier internal resistor ratio
+ PREF(FLLW_R1) = 1<<1, // Rab1, Select Amplifier internal resistor ratio
+ PREF(FLLW_R0) = 1<<0, // Rab0, Select Amplifier internal resistor ratio
- LCD_TEMP = 0b01110110, // Set Temperature Coefficient (RE=1), data in following byte
- LCD_ROM = 0b01110010, // ROM Selection (RE=1), data in following byte
- LCD_ROM_A = 0<<2, // ROM A
- LCD_ROM_B = 1<<2, // ROM B
- LCD_ROM_C = 2<<2, // ROM C
+ PREF(CONTR) = 0b01110000, // Contrast set (IS=1, RE=0)
- LCD_DDRAM = 0b10000000, // Set DDRAM Address (RE=0)
- LCD_SCROLL = 0b10000000, // Set Scroll quantity (RE=1)
+ PREF(TEMP) = 0b01110110, // Set Temperature Coefficient (RE=1), data in following byte
- // status byte
- LCD_BUSY = 1<<7, // BF, Busy flag
+ PREF(ROM) = 0b01110010, // ROM Selection (RE=1), data in following byte
+ PREF(ROM_A) = 0<<2, // ROM A
+ PREF(ROM_B) = 1<<2, // ROM B
+ PREF(ROM_C) = 2<<2, // ROM C
+
+ PREF(DDRAM) = 1<<7, // Set DDRAM Address (RE=0)
+
+ PREF(SCROLL) = 1<<7, // Set Scroll quantity (RE=1)
};
+
+#undef PREF