#include <Wire.h>
#define LCD_RS 2
#define LCD_EN 3
#define LCD_D4 4
#define LCD_D5 5
#define LCD_D6 6
#define LCD_D7 7
void pulseEnable() {
digitalWrite(LCD_EN, LOW);
delayMicroseconds(1);
digitalWrite(LCD_EN, HIGH);
delayMicroseconds(1);
digitalWrite(LCD_EN, LOW);
delayMicroseconds(100);
}
void write4bits(uint8_t value) {
digitalWrite(LCD_D4, (value >> 0) & 0x01);
digitalWrite(LCD_D5, (value >> 1) & 0x01);
digitalWrite(LCD_D6, (value >> 2) & 0x01);
digitalWrite(LCD_D7, (value >> 3) & 0x01);
pulseEnable();
}
void lcdSend(uint8_t value, bool mode) {
digitalWrite(LCD_RS, mode); // 0 = cmd, 1 = data
write4bits(value >> 4);
write4bits(value & 0x0F);
}
void lcdCommand(uint8_t cmd) {
lcdSend(cmd, false);
}
void lcdData(uint8_t data) {
lcdSend(data, true);
}
void lcdInit() {
delay(50);
digitalWrite(LCD_RS, LOW);
write4bits(0x03);
delay(5);
write4bits(0x03);
delayMicroseconds(150);
write4bits(0x03);
write4bits(0x02); // 4-bit mode
lcdCommand(0x28); // 4-bit, 2 line, 5x8
lcdCommand(0x0C); // display ON, cursor OFF
lcdCommand(0x06); // entry mode
lcdCommand(0x01); // clear
delay(2);
}
void lcdSetCursor(uint8_t col, uint8_t row) {
uint8_t row_offsets[] = {0x00, 0x40};
lcdCommand(0x80 | (col + row_offsets[row]));
}
void lcdPrint(const char* str) {
while (*str) {
lcdData(*str++);
}
}
/* ===== DIP ===== */
#define DIP1 8
#define DIP2 9
#define DIP3 10
#define DIP4 11
#define DIP5 12
void setup() {
pinMode(LCD_RS, OUTPUT);
pinMode(LCD_EN, OUTPUT);
pinMode(LCD_D4, OUTPUT);
pinMode(LCD_D5, OUTPUT);
pinMode(LCD_D6, OUTPUT);
pinMode(LCD_D7, OUTPUT);
pinMode(DIP1, INPUT_PULLUP);
pinMode(DIP2, INPUT_PULLUP);
pinMode(DIP3, INPUT_PULLUP);
pinMode(DIP4, INPUT_PULLUP);
pinMode(DIP5, INPUT_PULLUP);
lcdInit();
}
void loop() {
lcdCommand(0x01); // clear
delay(2);
lcdSetCursor(0, 0);
if (!digitalRead(DIP1)) {
lcdPrint("MODE: 0-10V");
} else if (!digitalRead(DIP2)) {
lcdPrint("MODE: 0-20mA");
} else if (!digitalRead(DIP3)) {
lcdPrint("MODE: 4-20mA");
} else if (!digitalRead(DIP4)) {
lcdPrint("MODE: +-10V");
} else if (!digitalRead(DIP5)) {
lcdPrint("MODE: +-20mA");
} else {
lcdPrint("SELECT MODE");
}
delay(300);
}