-
-
Save thehonker/6871afb66a1413a9f89e320ed92335de to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * This sketch is specifically for programming the EEPROM used in the 8-bit | |
| * decimal display decoder described in https://youtu.be/dLh1n2dErzE | |
| */ | |
| #define SHIFT_DATA 16 | |
| #define SHIFT_CLK 15 // 15 | |
| #define SHIFT_LATCH 14 // 14 | |
| #define EEPROM_D0 2 | |
| #define EEPROM_D7 9 | |
| #define WRITE_EN 10 | |
| unsigned char reverse(unsigned char b) { | |
| b = (b & 0xF0) >> 4 | (b & 0x0F) << 4; | |
| b = (b & 0xCC) >> 2 | (b & 0x33) << 2; | |
| b = (b & 0xAA) >> 1 | (b & 0x55) << 1; | |
| return b; | |
| } | |
| /* | |
| Output the address bits and outputEnable signal using shift registers. | |
| */ | |
| 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); | |
| } | |
| /* | |
| Read a byte from the EEPROM at the specified address. | |
| */ | |
| 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 reverse(data); | |
| } | |
| /* | |
| Write a byte to the EEPROM at the specified address. | |
| */ | |
| void writeEEPROM(int address, byte data) { | |
| data = reverse(data); | |
| setAddress(address, /*outputEnable*/ false); | |
| for (int pin = EEPROM_D0; pin <= EEPROM_D7; pin += 1) { | |
| pinMode(pin, OUTPUT); | |
| } | |
| 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); | |
| } | |
| /* | |
| Read the contents of the EEPROM and print them to the serial monitor. | |
| */ | |
| 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() { | |
| // put your setup code here, to run once: | |
| pinMode(SHIFT_DATA, OUTPUT); | |
| pinMode(SHIFT_CLK, OUTPUT); | |
| pinMode(SHIFT_LATCH, OUTPUT); | |
| digitalWrite(WRITE_EN, HIGH); | |
| pinMode(WRITE_EN, OUTPUT); | |
| Serial.begin(57600); | |
| delay(5000); | |
| // Bit patterns for the digits 0..9 | |
| byte digits[] = { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b }; | |
| Serial.println("Programming ones place"); | |
| for (int value = 0; value <= 255; value += 1) { | |
| writeEEPROM(value, digits[value % 10]); | |
| } | |
| Serial.println("Programming tens place"); | |
| for (int value = 0; value <= 255; value += 1) { | |
| writeEEPROM(value + 256, digits[(value / 10) % 10]); | |
| } | |
| Serial.println("Programming hundreds place"); | |
| for (int value = 0; value <= 255; value += 1) { | |
| writeEEPROM(value + 512, digits[(value / 100) % 10]); | |
| } | |
| Serial.println("Programming sign"); | |
| for (int value = 0; value <= 255; value += 1) { | |
| writeEEPROM(value + 768, 0); | |
| } | |
| Serial.println("Programming ones place (twos complement)"); | |
| for (int value = -128; value <= 127; value += 1) { | |
| writeEEPROM((byte)value + 1024, digits[abs(value) % 10]); | |
| } | |
| Serial.println("Programming tens place (twos complement)"); | |
| for (int value = -128; value <= 127; value += 1) { | |
| writeEEPROM((byte)value + 1280, digits[abs(value / 10) % 10]); | |
| } | |
| Serial.println("Programming hundreds place (twos complement)"); | |
| for (int value = -128; value <= 127; value += 1) { | |
| writeEEPROM((byte)value + 1536, digits[abs(value / 100) % 10]); | |
| } | |
| Serial.println("Programming sign (twos complement)"); | |
| for (int value = -128; value <= 127; value += 1) { | |
| if (value < 0) { | |
| writeEEPROM((byte)value + 1792, 0x01); | |
| } else { | |
| writeEEPROM((byte)value + 1792, 0); | |
| } | |
| } | |
| // Read and print out the contents of the EERPROM | |
| Serial.println("Reading EEPROM"); | |
| printContents(); | |
| } | |
| void loop() { | |
| // put your main code here, to run repeatedly: | |
| } |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment