Segment-multiplexing of a 7 segment LED display with an Atmel microcontroller (ATMega163).
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

237 lines
6.7 KiB

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