Created
November 8, 2011 05:00
-
-
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
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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