//Copyright 2023 RuhNet //All rights reserved. //MIT Licensed. #define LOW 1 #define HIGH 0 //br = bottom right segment //top = top segment //bl = bottom left segment //b = bottom segment //mid = mid segment //tr = top right segment //tl = top left segment //PORTC 1 1 1 1 1 1 1 1 // br . top bl b mid tr tl void writeDigit(byte displayCharacter, uint8_t position); void writeDisplay(char displayString[]); void loadDisplay(byte stringArr[]); byte segment_cursor = 1; //which segment to light up uint8_t cursor = 0; //position on display //PORTC is wired to each segment through a 200ohm resistor //PORTC 1 1 1 1 1 1 1 1 // br . top bl b mid tr tl uint8_t seg_br = bit(7); uint8_t seg_dot = bit(6); uint8_t seg_top = bit(5); uint8_t seg_bl = bit(4); uint8_t seg_bot = bit(3); uint8_t seg_mid = bit(2); uint8_t seg_tr = bit(1); uint8_t seg_tl = bit(0); //characterset const byte c_space = 0x00; const byte c_0 = seg_br + seg_top + seg_bl + seg_bot + seg_tr + seg_tl; //0b10111011 const byte c_1 = seg_tr + seg_br; //0b10000010 const byte c_2 = seg_top + seg_bl + seg_bot + seg_mid + seg_tr; //0b00111110 const byte c_3 = seg_br + seg_top + seg_bot + seg_mid + seg_tr; const byte c_4 = seg_br + seg_mid + seg_tr + seg_tl; const byte c_5 = seg_br + seg_top + seg_bot + seg_mid + seg_tl; const byte c_6 = seg_br + seg_top + seg_bl + seg_bot + seg_mid + seg_tl; //0b10111101 const byte c_7 = seg_br + seg_top + seg_tr; //0b10100010 const byte c_8 = seg_br + seg_top + seg_bl + seg_bot + seg_mid + seg_tr + seg_tl; //0b10111111; const byte c_9 = seg_br + seg_top + seg_bot + seg_mid + seg_tr + seg_tl; //0b11101111 const byte c_dot = seg_dot; //0b01000000 const byte c_A = seg_br + seg_top + seg_bl + +seg_mid + seg_tr + seg_tl; //0b10110111 const byte c_B = seg_br + seg_bl + seg_bot + seg_mid + seg_tl; const byte c_C = seg_bl + seg_bot + seg_mid; const byte c_D = seg_br + seg_bl + seg_bot + seg_mid + seg_tr; const byte c_E = seg_top + seg_bl + seg_bot + seg_mid + seg_tl; const byte c_F = seg_top + seg_bl + seg_mid + seg_tl; //0b00110101 const byte c_G = seg_br + seg_top + seg_bl + seg_bot + seg_tl; const byte c_H = seg_br + seg_bl + seg_mid + seg_tr + seg_tl; const byte c_I = seg_bl; const byte c_J = seg_br + seg_bl + seg_bot + seg_tr; const byte c_K = seg_br + seg_bl + seg_mid + seg_tr + seg_tl + seg_dot; const byte c_L = seg_bl + seg_bot + seg_tl; const byte c_M = seg_br + seg_bl + seg_mid; const byte c_N = seg_br + seg_bl + seg_mid; const byte c_O = seg_br + seg_bl + seg_mid + seg_bot; const byte c_P = seg_top + seg_bl + seg_mid + seg_tr + seg_tl; const byte c_Q = seg_br + seg_top + seg_bl + seg_bot + seg_tr + seg_tl + seg_dot; const byte c_R = seg_br + seg_top + seg_bl + seg_mid + seg_tr + seg_tl; const byte c_S = seg_br + seg_top + seg_bot + seg_mid + seg_tl; const byte c_T = seg_br + seg_top + seg_tr; const byte c_U = seg_br + seg_bl + seg_bot; const byte c_V = seg_br + seg_bl + seg_bot; const byte c_W = seg_br + seg_bl + seg_bot + seg_tr + seg_tl; const byte c_X = seg_br + seg_bl + seg_mid + seg_tr + seg_tl + seg_dot; const byte c_Y = seg_br + seg_mid + seg_tr + seg_tl; const byte c_Z = seg_top + seg_bl + seg_bot + seg_mid + seg_tr; byte numberSet[11] = { c_0, c_1, c_2, c_3, c_4, c_5, c_6, c_7, c_8, c_9, c_dot }; //byte displayOutput[8] = { c_a, c_b, c_c, 0b11111111, c_2, c_3, c_4, c_5 }; //byte displayOutput[8] = { c_H, c_E, c_L, c_L, c_O, c_dot, c_4, c_5 }; //byte displayOutput[8] = { c_R, c_U, c_H, c_N, c_E, c_T, 0, 0 }; byte displayOutput[] = { c_G, c_P, c_S, c_dot, c_L, c_O, c_C, c_K }; void writeDigit(byte displayCharacter, uint8_t position) { //segment_cursor = 1; //PORTA = 0b10101010; //PORTA = 0xff; PORTA = (0xff & ~(1 << position)); for (uint8_t i = 0; i < 8; i++) { PORTC = (displayCharacter & segment_cursor); //PORTC = displayCharacter; //delay(1); //segment_cursor = segment_cursor << 1; //shift bit to left /* if (displayCharacter & segment_cursor) { PORTA = (0 << cursor); //Enable the character to write this segment } else { PORTA = 0xff; } */ } } void writeDisplay(char displayString[8]) { for (uint8_t i = 0; i < 8; i++) { writeDigit(displayString[i], i); } } void setup() { OSCCAL = 0xad; //pinMode(led, OUTPUT); DDRA = 0xff; //set all of port A as output DDRC = 0xff; PORTA = 0b10111111; PORTC = 0b10111011; PORTA = 0b11101111; PORTC = 0b10000111; PORTA = 0x00; PORTC = 0b01000000; /* TCCR2 PRESCALER: CS22 CS21 CS20 0 0 1 2 0 1 0 8 0 1 1 32 1 0 0 64 1 0 1 128 1 1 0 256 1 1 1 1024 */ noInterrupts(); // disable all interrupts TCCR2 = 0; //TCNT2 = 150; // preload timer //TCCR1B |= (1 << CS22) | (1 << CS21) | (1 << CS20); // 1024 prescaler TCCR2 |= (1 << CS21); // prescaler 8 TIMSK |= (1 << TOIE2); // enable timer overflow interrupt ISR interrupts(); //PORTA = 0b11100011; PORTA = 0b00100111; //PORTA = 0x00; } ISR(TIMER2_OVF_vect) { //WRITE DISPLAY! //WRITE DISPLAY TCNT2 = 192; //set timer value to set refresh rate -- lower is slower PORTA = 0xff; if (displayOutput[cursor] & segment_cursor) PORTA &= ~(1 << cursor); //writeDigit(displayOutput[cursor], cursor); PORTC = (displayOutput[cursor] & segment_cursor); if (segment_cursor < 0b10000000) { segment_cursor = segment_cursor << 1; } else { segment_cursor = 1; if (cursor < 7) { cursor++; } else { cursor = 0; } } } void loadDisplay(byte stringArr[]) { for (uint8_t i = 0; i < 8; i++) { displayOutput[i] = stringArr[i]; } } void loop() { byte dp1[8] = { c_G, c_P, c_S, c_dot, c_L, c_O, c_C, c_K }; //GPS.LOCK loadDisplay(dp1); delay(1000); byte dp2[8] = { c_3, (c_6 | (1 << 6)), c_4, c_7, c_3, c_9, c_2, c_N }; //36.47392N --- the bitshift turns the dot on along with the 6. loadDisplay(dp2); delay(1000); byte dp3[8] = { c_C, c_L, c_O, c_C, c_K, 0, 0, 0 }; //CLOCK loadDisplay(dp3); delay(1000); byte dp4[8] = { c_1, c_2, c_dot, c_5, c_4 , c_dot, c_3, c_7 }; //12.54.37 loadDisplay(dp4); delay(1000); displayOutput[7] = c_8; delay(1000); displayOutput[7] = c_9; loadDisplay(displayOutput); delay(1000); displayOutput[6] = c_4; displayOutput[7] = c_0; delay(1000); displayOutput[7] = c_1; delay(1000); displayOutput[7] = c_2; delay(1000); displayOutput[7] = c_3; delay(1000); displayOutput[7] = c_4; delay(1000); displayOutput[7] = c_5; delay(1000); displayOutput[7] = c_6; delay(1000); }