//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);
|
|
}
|