Advertisement
Guest User

AT28C64B EEPROM Programmer: 7-segment display

a guest
Sep 14th, 2019
295
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // 7-segment programming for AT28C64B EEPROM
  2. // digits are time multiplexed, ones at 0x0100, tens at 0x0200 and hundreds at 0x0200
  3. // NOTE: AT28C64B has a memory size of 8kB = 12 address-bits
  4.  
  5. enum {
  6.   D0 = 4,
  7.   D1,
  8.   D2,
  9.   D3,
  10.   D4,
  11.   D5,
  12.   D6,
  13.   D7,
  14.  
  15.   DMAX
  16. };
  17.  
  18. #define ADDRESS       2
  19. #define CLK           3
  20. #define WRITE_ENABLE 12
  21. #define READ_ENABLE  13
  22.  
  23. // E
  24. //#define CLEAR_BYTE 0x79
  25. #define CLEAR_BYTE 0x00
  26.  
  27. byte pattern[10] = {
  28.         //   | A | B | C | D | E | F | G |
  29.   0x3F, // 0 | 1 | 1 | 1 | 1 | 1 | 1 | 0 |
  30.   0x06, // 1 | 0 | 1 | 1 | 0 | 0 | 0 | 0 |
  31.   0x5B, // 2 | 1 | 1 | 0 | 1 | 1 | 0 | 1 |
  32.   0x4F, // 3 | 1 | 1 | 1 | 1 | 0 | 0 | 1 |
  33.   0x66, // 4 | 0 | 1 | 1 | 0 | 0 | 1 | 1 |
  34.   0x6D, // 5 | 1 | 0 | 1 | 1 | 0 | 1 | 1 |
  35.   0x7D, // 6 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
  36.   0x07, // 7 | 1 | 1 | 1 | 0 | 0 | 0 | 0 |
  37.   0x7F, // 8 | 1 | 1 | 1 | 1 | 1 | 1 | 1 |
  38.   0x6F  // 9 | 1 | 1 | 1 | 1 | 0 | 1 | 1 |
  39. };
  40.  
  41. void shiftOut_data16(int dataPin, int clockPin, uint16_t data) {
  42.   shiftOut(dataPin, clockPin, MSBFIRST, (data >> 8) & 0xff);
  43.   shiftOut(dataPin, clockPin, MSBFIRST, data & 0xff);
  44. }
  45.  
  46. void write_to_address(uint16_t address, byte data) {
  47.   // set address
  48.   shiftOut_data16(ADDRESS, CLK, address);
  49.   delayMicroseconds(5);
  50.  
  51.   // initiate write
  52.   digitalWrite(WRITE_ENABLE, LOW);
  53.   delayMicroseconds(5);
  54.  
  55.   for(int i = 0; i < 8; i++) {
  56.     digitalWrite(D0 + i, ((data >> i) & 0x01) ? HIGH : LOW);
  57.   }
  58.   delayMicroseconds(5);
  59.   digitalWrite(WRITE_ENABLE, HIGH);
  60.  
  61.   // delay next write enough so we don't trigger a page write
  62.   delayMicroseconds(200);
  63. }
  64.  
  65. byte read_from_address(uint16_t address) {
  66.   // set address
  67.   shiftOut_data16(ADDRESS, CLK, address);
  68.   delayMicroseconds(5);
  69.  
  70.   // initiate read
  71.   digitalWrite(READ_ENABLE, LOW);
  72.   delayMicroseconds(5);
  73.  
  74.   byte data = 0;
  75.   for(int i = 0; i < 8; i++) {
  76.     data |= ((digitalRead(D0 + i) == HIGH) ? 0x01 : 0x00) << i;
  77.   }
  78.   digitalWrite(READ_ENABLE, HIGH);
  79.   delayMicroseconds(5);
  80.   return data;
  81. }
  82.  
  83. void get_digits_from_byte(byte b, byte digits[3]) {
  84.   byte *at = digits;
  85.   while (b) {
  86.     *at++ = b % 10;
  87.     b /= 10;
  88.   }
  89. }
  90.  
  91. void program_eeprom() {
  92.   for(int i = D0; i < DMAX; i++) {
  93.     pinMode(i, OUTPUT);
  94.     digitalWrite(i, LOW);
  95.   }
  96.  
  97.   Serial.print("Erasing");
  98.   for(uint16_t address = 0x0000; address < 0x2000; address++) {
  99.     if(address % 0x100 == 0) {
  100.       Serial.print('.');
  101.     }
  102.     write_to_address(address, CLEAR_BYTE);
  103.   }
  104.   Serial.print("\nProgramming");
  105. #if 0
  106.   for (int n = 0; n < 256; n++) {
  107.     if(n % 8 == 0) {      
  108.       Serial.print('.');
  109.     }
  110.     byte digits[3] = {};
  111.     get_digits_from_byte(n, digits);
  112.     for (int i = 0; i < 3; i++) {
  113.       write_to_address(n | (0x0100 << i), pattern[digits[i]]);
  114.     }
  115.   }
  116. #else
  117. /*
  118.   for(uint16_t address = 0x0000; address < 0x2000; address++) {
  119.     if(address % 0x100 == 0) {
  120.       Serial.print('.');
  121.     }
  122.     write_to_address(address, address % 0x100);
  123.   }
  124. */
  125. #endif
  126.   Serial.println("\nDone.");
  127. }
  128.  
  129. void read_eeprom() {
  130.   for(int i = D0; i < DMAX; i++) {
  131.     pinMode(i, INPUT);
  132.   }
  133.  
  134.   Serial.println("EEPROM contents:");
  135.   char buffer[128];
  136.   for(uint16_t address = 0x0000; address < 0x2000; address += 0x10) {
  137.     byte data[16];
  138.     for(byte i = 0; i < 8; i++) {
  139.       data[i] = read_from_address(address + i);
  140.       data[8 + i] = read_from_address(address + 8 + i);
  141.     }
  142.     sprintf(buffer,
  143.       "%04X: %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X %02X\n",
  144.       address,    
  145.       data[0x0], data[0x1], data[0x2], data[0x3], data[0x4], data[0x5], data[0x6], data[0x7],
  146.       data[0x8], data[0x9], data[0xa], data[0xb], data[0xc], data[0xd], data[0xe], data[0xf]
  147.     );
  148.     Serial.print(buffer);
  149.   }
  150. }
  151.  
  152. void setup() {
  153.   //Initialize serial and wait for port to open:
  154.   Serial.begin(9600);
  155.   while (!Serial) {} // wait for serial port to connect. Needed for native USB port only
  156.   Serial.println("Serial port ready");
  157.  
  158.   // Configure digital pins
  159.   pinMode(CLK, OUTPUT);
  160.   pinMode(WRITE_ENABLE, OUTPUT);
  161.   pinMode(READ_ENABLE, OUTPUT);
  162.   pinMode(ADDRESS, OUTPUT);
  163.  
  164.   // Set default values
  165.   digitalWrite(CLK, LOW);
  166.   digitalWrite(WRITE_ENABLE, HIGH);
  167.   digitalWrite(READ_ENABLE, HIGH);
  168.   digitalWrite(ADDRESS, LOW);
  169.  
  170.   // Start programming EEPROM
  171.   program_eeprom();
  172.  
  173. #if 1
  174.   // Read EEPROM
  175.   read_eeprom();
  176. #endif
  177. }
  178.  
  179. void loop() {
  180. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement