


How do I display a digital clock on the HD44780 display in CRUMB Circuit Simulator?
I need to create a functional digital clock in CRUMB. I've never worked with circuits before. I believe the clock is working, but it's not displaying correctly; only meaningless characters are appearing. I will include the specifications I followed, the connections, and the code I put in Main.c:
| Display HD44780 | Arduino NANO |
|---|---|
| 1 (VSS) | GND |
| 2 (VDD) | 5V |
| 3 (V0) | 5V |
| 4 (RS) | D12 |
| 5 (RW) | GND |
| 6 (E) | D11 |
| 11 (D4) | D5 |
| 12 (D5) | D4 |
| 13 (D6) | D3 |
| 14 (D7) | D2 |
| 15 (A) | 5V + resistor 220Ω |
| 16 (K) | GND |
1. Power source (DC 12V)
| Source 12V | Arduino NANO |
|---|---|
| Positive (+) | VIN |
| Negative (-) | GND |
Code in Main.c
#define RS 12
#define E 11
#define D4 5
#define D5 4
#define D6 3
#define D7 2
int h = 12;
int m = 0;
int s = 0;
unsigned long tmp = 0;
void cmd(unsigned char c) {
digitalWrite(D4, (c >> 4) & 1);
digitalWrite(D5, (c >> 5) & 1);
digitalWrite(D6, (c >> 6) & 1);
digitalWrite(D7, (c >> 7) & 1);
digitalWrite(RS, 0);
digitalWrite(E, 1);
delay(50);
digitalWrite(E, 0);
delay(50);
digitalWrite(D4, c & 1);
digitalWrite(D5, (c >> 1) & 1);
digitalWrite(D6, (c >> 2) & 1);
digitalWrite(D7, (c >> 3) & 1);
digitalWrite(E, 1);
delay(50);
digitalWrite(E, 0);
delay(50);
}
void dat(unsigned char d) {
digitalWrite(D4, (d >> 4) & 1);
digitalWrite(D5, (d >> 5) & 1);
digitalWrite(D6, (d >> 6) & 1);
digitalWrite(D7, (d >> 7) & 1);
digitalWrite(RS, 1);
digitalWrite(E, 1);
delay(50);
digitalWrite(E, 0);
delay(50);
digitalWrite(D4, d & 1);
digitalWrite(D5, (d >> 1) & 1);
digitalWrite(D6, (d >> 2) & 1);
digitalWrite(D7, (d >> 3) & 1);
digitalWrite(E, 1);
delay(50);
digitalWrite(E, 0);
delay(50);
}
void init() {
pinMode(RS, 1);
pinMode(E, 1);
pinMode(D4, 1);
pinMode(D5, 1);
pinMode(D6, 1);
pinMode(D7, 1);
delay(200);
cmd(0x33);
delay(50);
cmd(0x32);
delay(50);
cmd(0x28);
delay(50);
cmd(0x0C);
delay(50);
cmd(0x06);
delay(50);
cmd(0x01);
delay(100);
}
void pos(int c, int r) {
if(r == 0) cmd(0x80 + c);
else cmd(0xC0 + c);
}
void print(char *t) {
while(*t) dat(*t++);
}
void num(int n) {
dat('0' + n / 10);
dat('0' + n % 10);
}
void setup() {
init();
pos(0, 0);
print(" RELOGIO ");
pos(0, 1);
print(" DIGITAL ");
delay(3000);
init();
}
void loop() {
if(millis() - tmp >= 1000) {
tmp = millis();
s++;
if(s >= 60) {
s = 0;
m++;
if(m >= 60) {
m = 0;
h++;
if(h >= 24) {
h = 0;
}
}
}
pos(0, 0);
print("Hora: ");
num(h);
dat(':');
num(m);
dat(':');
num(s);
print(" ");
pos(0, 1);
if(h >= 12) print(" PM ");
else print(" AM ");
if(s % 2 == 0) print(" [*] ");
else print(" [ ] ");
}
}