-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathsap1_decimal_counter_programmer.ino
More file actions
160 lines (137 loc) · 4.64 KB
/
Copy pathsap1_decimal_counter_programmer.ino
File metadata and controls
160 lines (137 loc) · 4.64 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
// SAP-1 8-bit computer EEPROM Decimal Counter Programmer
// Arduino Nano
#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) {
// since com is 8-bit, we need to account for numbers that are larger than 8-bits
shiftOut(SHIFT_DATA, SHIFT_CLK, MSBFIRST, (address >> 8) | (outputEnable ? 0x00 : 0x80)); // ">> 8" shifts all bits to the right by 8 places
shiftOut(SHIFT_DATA, SHIFT_CLK, MSBFIRST, address); // outputs the remainding bits that were shifted out on the line above
digitalWrite(SHIFT_LATCH, LOW);
digitalWrite(SHIFT_LATCH, HIGH);
digitalWrite(SHIFT_LATCH, LOW);
}
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;
}
// pulse
digitalWrite(WRITE_EN, LOW);
delayMicroseconds(1);
digitalWrite(WRITE_EN, HIGH);
delay(5); // if reading doesnt work properly change it to 10
}
// print all EEPROM addresses
void printContents() {
Serial.println("Reading EEPROM");
for(int base = 0; base <= 255; base += 16 /*read 16 EEPROM bytes at a time*/) {
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 printDot(int value) {
if(value % 64 == 0) {
Serial.print(".");
}
}
// 4-bit hex decoder for 7-seg display (common cathode)
// byte data[] = {0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b, 0x77, 0x1f, 0x4e, 0x3d, 0x4f, 0x47};
// 4-bit hex decoder for 7-seg display (common anode)
// byte data[] = {0x81, 0xcf, 0x92, 0x86, 0xcc, 0xa4, 0xa0, 0x8f, 0x80, 0x84, 0x88, 0xe0, 0xb1, 0xc2, 0xb0, 0xb8};
void setup() {
pinMode(SHIFT_DATA, OUTPUT);
pinMode(SHIFT_CLK, OUTPUT);
pinMode(SHIFT_LATCH, OUTPUT);
digitalWrite(WRITE_EN, HIGH);
pinMode(WRITE_EN, OUTPUT);
Serial.begin(115200);
Serial.println("\n");
// program data bytes
byte digits[] = { 0x7e, 0x30, 0x6d, 0x79, 0x33, 0x5b, 0x5f, 0x70, 0x7f, 0x7b };
int programTimeStart = millis();
// UNSIGNED
// 1s
Serial.print("\nProgramming ones place");
for(int value = 0; value <= 255; value += 1) {
writeEEPROM(value, digits[value % 10]);
printDot(value);
}
// 10s
Serial.print("\nProgramming tens place");
for(int value = 0; value <= 255; value += 1) {
writeEEPROM(value + 256, digits[(value / 10) % 10]);
printDot(value);
}
// 100s
Serial.print("\nProgramming hundreds place");
for(int value = 0; value <= 255; value += 1) {
writeEEPROM(value + 512, digits[(value / 100) % 10]);
printDot(value);
}
// 1000s (blank)
Serial.print("\nProgramming sign");
for(int value = 0; value <= 255; value += 1) {
writeEEPROM(value + 768, 0);
printDot(value);
}
// TWOS COMPLIMENT
// 1s
Serial.print("\nProgramming ones place (twos compliment)");
for(int value = -128; value <= 127; value += 1) {
writeEEPROM((byte)value + 1024, digits[abs(value) % 10]);
printDot(value);
}
// 10s
Serial.print("\nProgramming tens place (twos compliment)");
for(int value = -128; value <= 127; value += 1) {
writeEEPROM((byte)value + 1280, digits[abs(value / 10) % 10]);
printDot(value);
}
// 100s
Serial.print("\nProgramming hundreds place (twos compliment)");
for(int value = -128; value <= 127; value += 1) {
writeEEPROM((byte)value + 1536, digits[abs(value / 100) % 10]);
printDot(value);
}
// 1000s (negative sign)
Serial.print("\nProgramming sign (twos compliment)");
for(int value = -128; value <= 127; value += 1) {
if(value < 0) {
writeEEPROM((byte)value + 1792, 0x01);
} else {
writeEEPROM((byte)value + 1792, 0);
}
printDot(value);
}
int programTimeEnd = millis() - programTimeStart;
Serial.println("\nDone! (" + String(programTimeEnd) + " ms)");
printContents();
}
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 loop() {
}