Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- // 7-segment programming for AT28C64B EEPROM
- // digits are time multiplexed, ones at 0x0100, tens at 0x0200 and hundreds at 0x0200
- // NOTE: AT28C64B has a memory size of 8kB = 12 address-bits
- enum {
- D0 = 4,
- D1,
- D2,
- D3,
- D4,
- D5,
- D6,
- D7,
- DMAX
- };
- #define ADDRESS 2
- #define CLK 3
- #define WRITE_ENABLE 12
- #define READ_ENABLE 13
- // E
- //#define CLEAR_BYTE 0x79
- #define CLEAR_BYTE 0x00
- byte pattern[10] = {
- // | A | B | C | D | E | F | G |
- 0x3F, // 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
- 0x06, // 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
- 0x5B, // 2 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
- 0x4F, // 3 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
- 0x66, // 4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
- 0x6D, // 5 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
- 0x7D, // 6 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
- 0x07, // 7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
- 0x7F, // 8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
- 0x6F // 9 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
- };
- void shiftOut_data16(int dataPin, int clockPin, uint16_t data) {
- shiftOut(dataPin, clockPin, MSBFIRST, (data >> 8) & 0xff);
- shiftOut(dataPin, clockPin, MSBFIRST, data & 0xff);
- }
- void write_to_address(uint16_t address, byte data) {
- // set address
- shiftOut_data16(ADDRESS, CLK, address);
- delayMicroseconds(5);
- // initiate write
- digitalWrite(WRITE_ENABLE, LOW);
- delayMicroseconds(5);
- for(int i = 0; i < 8; i++) {
- digitalWrite(D0 + i, ((data >> i) & 0x01) ? HIGH : LOW);
- }
- delayMicroseconds(5);
- digitalWrite(WRITE_ENABLE, HIGH);
- // delay next write enough so we don't trigger a page write
- delayMicroseconds(200);
- }
- byte read_from_address(uint16_t address) {
- // set address
- shiftOut_data16(ADDRESS, CLK, address);
- delayMicroseconds(5);
- // initiate read
- digitalWrite(READ_ENABLE, LOW);
- delayMicroseconds(5);
- byte data = 0;
- for(int i = 0; i < 8; i++) {
- data |= ((digitalRead(D0 + i) == HIGH) ? 0x01 : 0x00) << i;
- }
- digitalWrite(READ_ENABLE, HIGH);
- delayMicroseconds(5);
- return data;
- }
- void get_digits_from_byte(byte b, byte digits[3]) {
- byte *at = digits;
- while (b) {
- *at++ = b % 10;
- b /= 10;
- }
- }
- void program_eeprom() {
- for(int i = D0; i < DMAX; i++) {
- pinMode(i, OUTPUT);
- digitalWrite(i, LOW);
- }
- Serial.print("Erasing");
- for(uint16_t address = 0x0000; address < 0x2000; address++) {
- if(address % 0x100 == 0) {
- Serial.print('.');
- }
- write_to_address(address, CLEAR_BYTE);
- }
- Serial.print("\nProgramming");
- #if 0
- for (int n = 0; n < 256; n++) {
- if(n % 8 == 0) {
- Serial.print('.');
- }
- byte digits[3] = {};
- get_digits_from_byte(n, digits);
- for (int i = 0; i < 3; i++) {
- write_to_address(n | (0x0100 << i), pattern[digits[i]]);
- }
- }
- #else
- /*
- for(uint16_t address = 0x0000; address < 0x2000; address++) {
- if(address % 0x100 == 0) {
- Serial.print('.');
- }
- write_to_address(address, address % 0x100);
- }
- */
- #endif
- Serial.println("\nDone.");
- }
- void read_eeprom() {
- for(int i = D0; i < DMAX; i++) {
- pinMode(i, INPUT);
- }
- Serial.println("EEPROM contents:");
- char buffer[128];
- for(uint16_t address = 0x0000; address < 0x2000; address += 0x10) {
- byte data[16];
- for(byte i = 0; i < 8; i++) {
- data[i] = read_from_address(address + i);
- data[8 + i] = read_from_address(address + 8 + i);
- }
- sprintf(buffer,
- "%04X: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
- address,
- data[0x0], data[0x1], data[0x2], data[0x3], data[0x4], data[0x5], data[0x6], data[0x7],
- data[0x8], data[0x9], data[0xa], data[0xb], data[0xc], data[0xd], data[0xe], data[0xf]
- );
- Serial.print(buffer);
- }
- }
- void setup() {
- //Initialize serial and wait for port to open:
- Serial.begin(9600);
- while (!Serial) {} // wait for serial port to connect. Needed for native USB port only
- Serial.println("Serial port ready");
- // Configure digital pins
- pinMode(CLK, OUTPUT);
- pinMode(WRITE_ENABLE, OUTPUT);
- pinMode(READ_ENABLE, OUTPUT);
- pinMode(ADDRESS, OUTPUT);
- // Set default values
- digitalWrite(CLK, LOW);
- digitalWrite(WRITE_ENABLE, HIGH);
- digitalWrite(READ_ENABLE, HIGH);
- digitalWrite(ADDRESS, LOW);
- // Start programming EEPROM
- program_eeprom();
- #if 1
- // Read EEPROM
- read_eeprom();
- #endif
- }
- void loop() {
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement