LED dot matrix segment test driver, v 0.01 (brute force) 

Christoph Meissner 
meissne1@uni-weimar.de 
(c) Bauhausuniversity Weimar, faculty of media, virtual reality 

ROADMAP: 
######## 
- function return / no inline funct.!! 
- serial interface 
- interrupt on serial (matrix) data input from max msp jitter 
- latch controlling routine for more segments and clustered display 
*/ 

/* 
vers' History 
############# 
JUN 2, 2005 - 9 pm to JUN 3, 2005 - 3 am: 
brute force display driver 
hard coded alphanumeric symbols 
some test routines for led matrix 
*/ 

//#include <stdint.h> 
#include <avr/io.h> 

#define DOT_LUMINANCE_DURATION 40 
#define FRAME_DURATION 400 

//this is the frame, display_segment_frame() will print on LED matrix 
//("frame buffer") 
unsigned char segment_frame[5]; 

//delays avr for value of ticks cycles 
inline void delay(const long ticks) 
{ 
   long i; 
   for(i=0; i<=ticks; i++){ 
   PORTD = 64; 
   } 
   PORTD = 0; 
} 

//brute force display driver 
inline void display_segment_frame(void) 
{ 
   PORTD = 128; 
   unsigned char i, row; 
   for(row=0; row<=4; row++){ 
      PORTC = (1 << row); 
      for(i=0; i<=DOT_LUMINANCE_DURATION; i++) PORTB = 255-segment_frame[row]; 
      PORTB = 255; 
   } 
   PORTD = 0; 
} 

//rewrite segment_frame display frame buffer 
inline void set_segment_frame(const unsigned char line0, const unsigned char line1, const unsigned char line2, const unsigned char line3, const unsigned char line4) 
{ 
  //red LED on, while re-riting frame "buffer" 
  PORTD = 64; 
  segment_frame[0] = line0; 
  segment_frame[1] = line1; 
  segment_frame[2] = line2; 
  segment_frame[3] = line3; 
  segment_frame[4] = line4; 
} 


inline void set_capital_letter_to_segment_frame(const char code) 
{ 

switch (code) { 
   //capital letters 
   case  1: set_segment_frame(  48,  72, 120,  72,  72); break;   //A 
   case  2: set_segment_frame( 112,  72, 112,  72, 112); break;   //B 
   case  3: set_segment_frame(  56,  64,  64,  64,  56); break;   //C 
   case  4: set_segment_frame( 112,  72,  72,  72, 112); break;   //D 
   case  5: set_segment_frame( 120,  64, 112,  64, 120); break;   //E 
   // ...und so weiter, hab ich mal weggelassen, wäre n bisschen lang 
   } 
} 

inline void set_small_letter_to_segment_frame(const char code) 
{ 
    //small letters 
   switch (code) { 
   case  1: set_segment_frame(   0,  48,  80,  80, 104); break;   //a 
   case  2: set_segment_frame(  64,  64, 112,  80, 112); break;   //b 
   case  3: set_segment_frame(   0,   0, 112,  64, 112); break;   //c 
   case  4: set_segment_frame(  16,  16, 112,  80, 112); break;   //d 
   case  5: set_segment_frame(   0, 112,  80,  96, 112); break;   //e 
   // ...und so weiter, hab ich mal weggelassen, wäre n bisschen lang 
   } 
} 

inline void set_number_to_segment_frame(const char code) 
{ 
   //numbers 
   switch (code) { 
   case  0: set_segment_frame(  48,  72,  72,  72,  48); break;   //0 
   case  1: set_segment_frame(  16,  48,  80,  16, 120); break;   //1 
   case  2: set_segment_frame(  48,  72,  16,  32, 120); break;   //2 
   // ...und so weiter 
   case 10: set_segment_frame( 127, 127, 127, 127, 127); break;   //all dots on 
   case 11: set_segment_frame(   0,   0,   0,   0,   0); break;   //all dots off 
   } 
} 

inline void clear(void) 
{ 
  //clear display (set all dots off) 
  PORTB=0xFF; 
  PORTC=0x00; 
} 

inline void display_single_dot(const char row, const char line) 
{ 
  clear(); 
  PORTC = (1 << row); 
  PORTB = ~(1 << line); 
  //delay(0); 
} 

inline void display_full_row(const char row) 
{ 
  clear(); 
  PORTB = 0; 
  PORTC = (1 << row); 
  //delay(0); 
} 

inline void display_full_line(const char line) 
{ 
  clear(); 
  PORTC = 255; 
  PORTB = ~(1 << line); 
  //delay(0); 
} 

inline void segment_test(void) 
{ 
PORTD = 128; 
   char r, l; 
      for(l=0; l<=6; l++) { 
         for(r=0; r<=4; r++) { 
            display_single_dot(r,l); 
            delay(3000); 
         } 
      } 
/*      for(l=0; l<=6; l++) { 
         for(r=0; r<=4; r++) { 
            display_single_dot(4-r,6-l); 
            delay(3000); 
         } 
      }*/ 
      for(r=0; r<=4; r++) { 
         for(l=0; l<=6; l++) { 
            display_single_dot(r,l); 
            delay(3000); 
         } 
      } 
/*      for(r=0; r<=4; r++) { 
         for(l=0; l<=6; l++) { 
            display_single_dot(4-r,6-l); 
            delay(3000); 
         } 
      }*/ 
      for(r=0; r<=4; r++) { 
         display_full_row(r); 
         delay(6000); 
      } 
/*      for(r=0; r<=4; r++) { 
         display_full_row(4-r); 
         delay(6000); 
      }*/ 
      for(l=0; l<=6; l++) { 
         display_full_line(l); 
         delay(6000); 
      } 
/*      for(l=0; l<=6; l++) { 
         display_full_line(6-l); 
         delay(6000); 
      }*/ 
   clear(); 
PORTD = 0; 
} 

inline void test_sequence(void) 
{ 
   uint32_t i, j; 
   segment_test(); 
   for(j=0; j<=9; j++) { 
      set_number_to_segment_frame(j); 
      for(i=0; i<=FRAME_DURATION; i++) display_segment_frame(); 
   } 
   for(j=1; j<=26; j++) { 
      set_capital_letter_to_segment_frame(j); 
      for(i=0; i<=FRAME_DURATION; i++) display_segment_frame(); 
   } 
   for(j=1; j<=26; j++) { 
      set_small_letter_to_segment_frame(j); 
      for(i=0; i<=FRAME_DURATION; i++) display_segment_frame(); 
   } 
} 

int main(void) 
{ 
   DDRB=0xFF; // Alle Pins an Port B als Ausgang (Output) einstellen 
   DDRC=0xFF; 

   PORTB=0xFF; //=255, d.h. alle hi, LEDs aus 
   PORTC=0x00; 

   DDRD=0xFF; 

   while(1) { 
      test_sequence(); 
   } 
} 
