Skip to content

Instantly share code, notes, and snippets.

@AnthonyDiGirolamo
Created November 8, 2011 05:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save AnthonyDiGirolamo/1347046 to your computer and use it in GitHub Desktop.
Save AnthonyDiGirolamo/1347046 to your computer and use it in GitHub Desktop.
controlling a large 16 segment display and a rotary encoder using only an atmel328p
#include <avr/pgmspace.h>
#define ENC_A 14
#define ENC_B 15
#define ENC_PORT PINC
const prog_uint8_t character_map[][2] = {
{ B00000000, B00000000 }, // space
{ B00000010, B00000100 }, // ! 32
{ B00101000, B00000000 }, // "
{ B11111111, B11111111 }, // #
{ B11101001, B10010111 }, // $
{ B00110101, B10101100 }, // %
{ B01001100, B00110111 }, // &
{ B00000100, B00000000 }, // '
{ B00000100, B00001000 }, // (
{ B00010000, B00100000 }, // )
{ B00011101, B10111000 }, // *
{ B00001001, B10010000 }, // +
{ B00000000, B00100000 }, // ,
{ B00000001, B10000000 }, // -
{ B00000001, B01010010 }, // .
{ B00000100, B00100000 }, // /
{ B11100110, B01100111 }, // 0
{ B00000010, B00000100 }, // 1
{ B11000010, B10100011 }, // 2
{ B11000010, B10000111 }, // 3
{ B00100011, B10000100 }, // 4
{ B11100001, B00001011 }, // 5
{ B11100001, B11000111 }, // 6
{ B11000100, B00010000 }, // 7
{ B11100011, B11000111 }, // 8
{ B11100011, B10000111 }, // 9
{ B00001000, B00010000 }, // :
{ B00001000, B00100000 }, // ;
{ B00000100, B00001000 }, // <
{ B00000001, B10000011 }, // =
{ B00010000, B00100000 }, // >
{ B01000010, B10010000 }, // ?
{ B11100110, B11000011 }, // @
{ B11100011, B11000100 }, // A
{ B11001010, B10010111 }, // B
{ B11100000, B01000011 }, // C
{ B11001010, B00010111 }, // D
{ B11100001, B01000011 }, // E
{ B11100001, B01000000 }, // F
{ B11100000, B11000111 }, // G
{ B00100011, B11000100 }, // H
{ B11001000, B00010011 }, // I
{ B00000010, B01000111 }, // J
{ B00100101, B01001000 }, // K
{ B00100000, B01000011 }, // L
{ B00110110, B01000100 }, // M
{ B00110010, B01001100 }, // N
{ B11100010, B01000111 }, // O
{ B11100011, B11000000 }, // P
{ B11100010, B01001111 }, // Q
{ B11100011, B11001000 }, // R
{ B11100001, B10000111 }, // S
{ B11001000, B00010000 }, // T
{ B00100010, B01000111 }, // U
{ B00100100, B01100000 }, // V
{ B00100010, B01101100 }, // W
{ B00010100, B00101000 }, // X
{ B00010100, B00010000 }, // Y
{ B11000100, B00100011 }, // Z
{ B01001000, B00010001 }, // [
{ B00010000, B00001000 }, // backslash
{ B10001000, B00010010 }, // ]
{ B00000000, B00101000 }, // ^
{ B00000000, B00000011 }, // _
{ B00010000, B00000000 } // ` 96
// { 123
// |
// }
// ~
};
/*
- -
|\|/|
- -
|/|\|
- -
*/
/* returns change in encoder state (-1,0,1) */
int8_t read_encoder()
{
static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
static uint8_t old_AB = 0;
old_AB <<= 2; //remember previous state
old_AB |= ( ENC_PORT & 0x03 ); //add current state
return ( enc_states[( old_AB & 0x0f )]);
}
void write_character(char c) {
uint8_t mask;
// All Off
PORTD |= B11111100;
PORTB |= B00111111;
PORTC |= B00111100;
for (int i=0; i<16; i++) {
if (i<8)
mask = ~character_map[c-32][1];
else
mask = ~character_map[c-32][0];
/*
PORTD D7 D6 D5 D4 D3 D2 TX RX
PORTB X2 X1 D13 D12 D11 D10 D9 D8
PORTC NC RST A5 A4 A3 A2 A1 A0
PIN 19 18 17 16 15 14 13 12
AVR A5 A4 A3 A2 D13 D12 D11 D10
SEG 14 13 16 12 11 15 10 8
PIN 2 3 4 5 6 7 8 9 10
AVR D2 D3 D4 D5 D6 D7 D8 D9 NC
SEG 9 7 2 6 5 1 4 3 17(DP)
*/
if (i==0) { mask <<= 7; mask |= B01111111; PORTD &= mask; }
else if (i==1) { mask <<= 3; mask |= B11101111; PORTD &= mask; }
else if (i==2) { mask >>= 1; mask |= B11111101; PORTB &= mask; }
else if (i==3) { mask >>= 3; mask |= B11111110; PORTB &= mask; }
else if (i==4) { mask <<= 2; mask |= B10111111; PORTD &= mask; }
else if (i==5) { mask |= B11011111; PORTD &= mask; }
else if (i==6) { mask >>= 3; mask |= B11110111; PORTD &= mask; }
else if (i==7) { mask >>= 5; mask |= B11111011; PORTB &= mask; }
else if (i==8) { mask <<= 2; mask |= B11111011; PORTD &= mask; }
else if (i==9) { mask <<= 2; mask |= B11110111; PORTB &= mask; }
else if (i==10) { mask <<= 3; mask |= B11011111; PORTB &= mask; }
else if (i==11) { mask >>= 1; mask |= B11111011; PORTC &= mask; }
else if (i==12) { mask |= B11101111; PORTC &= mask; }
else if (i==13) { mask |= B11011111; PORTC &= mask; }
else if (i==14) { mask >>= 2; mask |= B11101111; PORTB &= mask; }
else if (i==15) { mask >>= 4; mask |= B11110111; PORTC &= mask; }
}
}
int d = 400;
void write_string(char* s) {
uint8_t i=0;
while (s[i] != '\0') {
write_character(s[i]);
i++;
delay(d);
}
}
void setup() {
/* Setup encoder pins as inputs */
pinMode(ENC_A, INPUT);
digitalWrite(ENC_A, HIGH);
pinMode(ENC_B, INPUT);
digitalWrite(ENC_B, HIGH);
Serial.begin (115200);
// Set In/Out
DDRD |= B11111100;
DDRB |= B00111111;
DDRC |= B00111100;
// All On
PORTD &= B00000011;
PORTB &= B11000000;
PORTC &= B11000011;
// All Off
PORTD |= B11111100;
PORTB |= B00111111;
PORTC |= B00111100;
write_character('A');
}
int changes = 0;
int last_counter = 0;
int current_char = 33;
void loop() {
write_string("HELLO ABIGAIL, HOW ARE YOU TODAY?");
// All Off
PORTD |= B11111100;
PORTB |= B00111111;
PORTC |= B00111100;
delay(2000);
/*
static uint8_t counter = 0; //this variable will be changed by encoder input
int8_t tmpdata;
tmpdata = read_encoder();
if( tmpdata ) {
Serial.print("Counter value: ");
Serial.println(counter, DEC);
counter += tmpdata;
changes++;
}
if ( changes == 4 ) {
Serial.print("Last Counter: ");
Serial.println(last_counter);
Serial.print("Counter: ");
Serial.println(counter, DEC);
if (counter > last_counter) {
current_char++;
d--;
}
else {
current_char--;
d++;
}
if (current_char > 96)
current_char = 32;
if (current_char < 32)
current_char = 96;
Serial.print("current_char: ");
Serial.println(current_char);
last_counter = counter;
changes = 0;
// write_character(current_char);
}
/*
// all on
PORTD &= B00000011;
PORTB &= B11000000;
PORTC &= B11000011;
delay(d);
// all off
PORTD |= B11111100;
PORTB |= B00111111;
PORTC |= B00111100;
delay(d);
*/
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment