Skip to content

Instantly share code, notes, and snippets.

@tuzz
Last active September 8, 2024 16:27
Show Gist options
  • Save tuzz/b3c2f7fba0784a875d554c8b46fd2ea0 to your computer and use it in GitHub Desktop.
Save tuzz/b3c2f7fba0784a875d554c8b46fd2ea0 to your computer and use it in GitHub Desktop.
Arduino EEPROM Programmer - Signed and unsigned decimal decoder
// Based on https://www.youtube.com/watch?v=dLh1n2dErzE
#define SHIFT_DATA 2
#define SHIFT_CLK 3
#define SHIFT_LATCH 4
#define EEPROM_D0 5
#define EEPROM_D7 12
#define WRITE_EN 13
void setAddress(int address, bool outputEnable) {
shiftOut(SHIFT_DATA, SHIFT_CLK, MSBFIRST, (address >> 8) | (outputEnable ? 0x00 : 0x80));
shiftOut(SHIFT_DATA, SHIFT_CLK, MSBFIRST, address);
digitalWrite(SHIFT_LATCH, LOW);
digitalWrite(SHIFT_LATCH, HIGH);
digitalWrite(SHIFT_LATCH, LOW);
}
byte readEEPROM(int address) {
for (int pin = EEPROM_D0; pin <= EEPROM_D7; pin += 1) {
pinMode(pin, INPUT);
}
setAddress(address, /* outputEnable */ true);
byte data = 0;
for (int pin = EEPROM_D7; pin >= EEPROM_D0; pin -= 1) {
data = (data << 1) + digitalRead(pin);
}
return data;
}
void writeEEPROM(int address, byte data) {
for (int pin = EEPROM_D0; pin <= EEPROM_D7; pin += 1) {
pinMode(pin, OUTPUT);
}
setAddress(address, /* outputEnable */ false);
for (int pin = EEPROM_D0; pin <= EEPROM_D7; pin += 1) {
digitalWrite(pin, data & 1);
data = data >> 1;
}
digitalWrite(WRITE_EN, LOW);
delayMicroseconds(1);
digitalWrite(WRITE_EN, HIGH);
delay(10);
}
void printContents() {
for (int base = 0; base <= 255; base += 16) {
byte data[16];
for (int offset = 0; offset <= 15; offset += 1) {
data[offset] = readEEPROM(base + offset);
}
char buf[80];
sprintf(buf, "%03x: %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x %02x",
base, data[0], data[1], data[2], data[3], data[4], data[5], data[6], data[7],
data[8], data[9], data[10], data[11], data[12], data[13], data[14], data[15]);
Serial.println(buf);
}
}
void setup() {
pinMode(SHIFT_DATA, OUTPUT);
pinMode(SHIFT_CLK, OUTPUT);
pinMode(SHIFT_LATCH, OUTPUT);
digitalWrite(WRITE_EN, HIGH);
pinMode(WRITE_EN, OUTPUT);
byte digits[] = { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b };
Serial.begin(57600);
Serial.println("Programming ones place (unsigned)");
for (int value = 0; value < 256; value += 1) {
writeEEPROM(value, digits[value % 10]);
}
Serial.println("Programming tens place (unsigned)");
for (int value = 0; value < 256; value += 1) {
writeEEPROM(value + 256, digits[(value / 10) % 10]);
}
Serial.println("Programming hundreds place (unsigned)");
for (int value = 0; value < 256; value += 1) {
writeEEPROM(value + 512, digits[(value / 100) % 10]);
}
Serial.println("Programming sign place (unsigned)");
for (int value = 0; value < 256; value += 1) {
writeEEPROM(value + 768, 0);
}
Serial.println("Programming ones place (signed)");
for (int value = -128; value < 128; value += 1) {
writeEEPROM((byte)value + 1024, digits[abs(value) % 10]); // 1s digit
}
Serial.println("Programming tens place (signed)");
for (int value = -128; value < 128; value += 1) {
writeEEPROM((byte)value + 1280, digits[(abs(value) / 10) % 10]); // 10s digit
}
Serial.println("Programming hundreds place (signed)");
for (int value = -128; value < 128; value += 1) {
writeEEPROM((byte)value + 1536, digits[(abs(value) / 100) % 10]); // 100s digit
}
Serial.println("Programming sign place (signed)");
for (int value = -128; value < 128; value += 1) {
if (value < 0) {
writeEEPROM((byte)value + 1792, 0x01); // Negative sign
} else {
writeEEPROM((byte)value + 1792, 0);
}
}
Serial.println("Reading EEPROM");
printContents();
}
void loop() {
// Do nothing.
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment