DotMatrix scrolling text demo

Demo of scrolling text on a dot matrix display using the MSP430, two 74HC595, home made dot matrix display.

Source Code:

//  MSP430G2231  Scrolling text demo
// and display on 8x8 dot matrix display via two 74hc595 shift registers
#include  <msp430x20x2.h>
#include <io.h>
#include <signal.h>
#include <stdlib.h>
#include <stdio.h>
const unsigned char Font8x5[][6] = {
{0x00,0x00,0x00,0x00,0x00,0x00},   //   0x20 32
{0x00,0x00,0x00,0x6f,0x00,0x00},   // ! 0x21 33
{0x00,0x00,0x07,0x00,0x07,0x00},   // " 0x22 34
{0x00,0x14,0x7f,0x14,0x7f,0x14},   // # 0x23 35
{0x00,0x00,0x07,0x04,0x1e,0x00},   // $ 0x24 36
{0x00,0x23,0x13,0x08,0x64,0x62},   // % 0x25 37
{0x00,0x36,0x49,0x56,0x20,0x50},   // & 0x26 38
{0x00,0x00,0x00,0x07,0x00,0x00},   // ' 0x27 39
{0x00,0x00,0x1c,0x22,0x41,0x00},   // ( 0x28 40
{0x00,0x00,0x41,0x22,0x1c,0x00},   // ) 0x29 41
{0x00,0x14,0x08,0x3e,0x08,0x14},   // * 0x2a 42
{0x00,0x08,0x08,0x3e,0x08,0x08},   // + 0x2b 43
{0x00,0x00,0x50,0x30,0x00,0x00},   // , 0x2c 44
{0x00,0x08,0x08,0x08,0x08,0x08},   // - 0x2d 45
{0x00,0x00,0x60,0x60,0x00,0x00},   // . 0x2e 46
{0x00,0x20,0x10,0x08,0x04,0x02},   // / 0x2f 47
{0x00,0x3e,0x51,0x49,0x45,0x3e},   // 0 0x30 48
{0x00,0x00,0x42,0x7f,0x40,0x00},   // 1 0x31 49
{0x00,0x42,0x61,0x51,0x49,0x46},   // 2 0x32 50
{0x00,0x21,0x41,0x45,0x4b,0x31},   // 3 0x33 51
{0x00,0x18,0x14,0x12,0x7f,0x10},   // 4 0x34 52
{0x00,0x27,0x45,0x45,0x45,0x39},   // 5 0x35 53
{0x00,0x3c,0x4a,0x49,0x49,0x30},   // 6 0x36 54
{0x00,0x01,0x71,0x09,0x05,0x03},   // 7 0x37 55
{0x00,0x36,0x49,0x49,0x49,0x36},   // 8 0x38 56
{0x00,0x06,0x49,0x49,0x29,0x1e},   // 9 0x39 57
{0x00,0x00,0x36,0x36,0x00,0x00},   // : 0x3a 58
{0x00,0x00,0x56,0x36,0x00,0x00},   // ; 0x3b 59
{0x00,0x08,0x14,0x22,0x41,0x00},   // < 0x3c 60
{0x00,0x14,0x14,0x14,0x14,0x14},   // = 0x3d 61
{0x00,0x00,0x41,0x22,0x14,0x08},   // > 0x3e 62
{0x00,0x02,0x01,0x51,0x09,0x06},   // ? 0x3f 63
{0x00,0x3e,0x41,0x5d,0x49,0x4e},   // @ 0x40 64
{0x00,0x7e,0x09,0x09,0x09,0x7e},   // A 0x41 65
{0x00,0x7f,0x49,0x49,0x49,0x36},   // B 0x42 66
{0x00,0x3e,0x41,0x41,0x41,0x22},   // C 0x43 67
{0x00,0x7f,0x41,0x41,0x41,0x3e},   // D 0x44 68
{0x00,0x7f,0x49,0x49,0x49,0x41},   // E 0x45 69
{0x00,0x7f,0x09,0x09,0x09,0x01},   // F 0x46 70
{0x00,0x3e,0x41,0x49,0x49,0x7a},   // G 0x47 71
{0x00,0x7f,0x08,0x08,0x08,0x7f},   // H 0x48 72
{0x00,0x00,0x41,0x7f,0x41,0x00},   // I 0x49 73
{0x00,0x20,0x40,0x41,0x3f,0x01},   // J 0x4a 74
{0x00,0x7f,0x08,0x14,0x22,0x41},   // K 0x4b 75
{0x00,0x7f,0x40,0x40,0x40,0x40},   // L 0x4c 76
{0x00,0x7f,0x02,0x0c,0x02,0x7f},   // M 0x4d 77
{0x00,0x7f,0x04,0x08,0x10,0x7f},   // N 0x4e 78
{0x00,0x3e,0x41,0x41,0x41,0x3e},   // O 0x4f 79
{0x00,0x7f,0x09,0x09,0x09,0x06},   // P 0x50 80
{0x00,0x3e,0x41,0x51,0x21,0x5e},   // Q 0x51 81
{0x00,0x7f,0x09,0x19,0x29,0x46},   // R 0x52 82
{0x00,0x46,0x49,0x49,0x49,0x31},   // S 0x53 83
{0x00,0x01,0x01,0x7f,0x01,0x01},   // T 0x54 84
{0x00,0x3f,0x40,0x40,0x40,0x3f},   // U 0x55 85
{0x00,0x0f,0x30,0x40,0x30,0x0f},   // V 0x56 86
{0x00,0x3f,0x40,0x30,0x40,0x3f},   // W 0x57 87
{0x00,0x63,0x14,0x08,0x14,0x63},   // X 0x58 88
{0x00,0x07,0x08,0x70,0x08,0x07},   // Y 0x59 89
{0x00,0x61,0x51,0x49,0x45,0x43},   // Z 0x5a 90
{0x00,0x3c,0x4a,0x49,0x29,0x1e},   // [ 0x5b 91
{0x00,0x02,0x04,0x08,0x10,0x20},   // \ 0x5c 92
{0x00,0x00,0x41,0x7f,0x00,0x00},   // ] 0x5d 93
{0x00,0x04,0x02,0x01,0x02,0x04},   // ^ 0x5e 94
{0x00,0x40,0x40,0x40,0x40,0x40},   // _ 0x5f 95
{0x00,0x00,0x00,0x03,0x04,0x00},   // ` 0x60 96
{0x00,0x20,0x54,0x54,0x54,0x78},   // a 0x61 97
{0x00,0x7f,0x48,0x44,0x44,0x38},   // b 0x62 98
{0x00,0x38,0x44,0x44,0x44,0x20},   // c 0x63 99
{0x00,0x38,0x44,0x44,0x48,0x7f},   // d 0x64 100
{0x00,0x38,0x54,0x54,0x54,0x18},   // e 0x65 101
{0x00,0x08,0x7e,0x09,0x01,0x02},   // f 0x66 102
{0x00,0x0c,0x52,0x52,0x52,0x3e},   // g 0x67 103
{0x00,0x7f,0x08,0x04,0x04,0x78},   // h 0x68 104
{0x00,0x00,0x44,0x7d,0x40,0x00},   // i 0x69 105
{0x00,0x20,0x40,0x44,0x3d,0x00},   // j 0x6a 106
{0x00,0x00,0x7f,0x10,0x28,0x44},   // k 0x6b 107
{0x00,0x00,0x41,0x7f,0x40,0x00},   // l 0x6c 108
{0x00,0x7c,0x04,0x18,0x04,0x78},   // m 0x6d 109
{0x00,0x7c,0x08,0x04,0x04,0x78},   // n 0x6e 110
{0x00,0x38,0x44,0x44,0x44,0x38},   // o 0x6f 111
{0x00,0x7c,0x14,0x14,0x14,0x08},   // p 0x70 112
{0x00,0x08,0x14,0x14,0x18,0x7c},   // q 0x71 113
{0x00,0x7c,0x08,0x04,0x04,0x08},   // r 0x72 114
{0x00,0x48,0x54,0x54,0x54,0x20},   // s 0x73 115
{0x00,0x04,0x3f,0x44,0x40,0x20},   // t 0x74 116
{0x00,0x3c,0x40,0x40,0x20,0x7c},   // u 0x75 117
{0x00,0x1c,0x20,0x40,0x20,0x1c},   // v 0x76 118
{0x00,0x3c,0x40,0x30,0x40,0x3c},   // w 0x77 119
{0x00,0x44,0x28,0x10,0x28,0x44},   // x 0x78 120
{0x00,0x0c,0x50,0x50,0x50,0x3c},   // y 0x79 121
{0x00,0x44,0x64,0x54,0x4c,0x44},   // z 0x7a 122
{0x00,0x00,0x08,0x36,0x41,0x41},   // { 0x7b 123
{0x00,0x00,0x00,0x7f,0x00,0x00},   // | 0x7c 124
{0x00,0x41,0x41,0x36,0x08,0x00},   // } 0x7d 125
{0x00,0x04,0x02,0x04,0x08,0x04}   // ~ 0x7e 126
};
void Initializeports(void);
static void __inline__delay(register unsigned int n);
int binary2bcd16( unsigned char *bcd, int t );  // 16bit
int display_led(int t, int display);
void display_refresh( void );
// Time function varibles
volatile unsigned char days = 0, hours = 0, minutes = 0, seconds = 0, e_hours = 0, e_minutes = 0, e_seconds = 0;
volatile unsigned int milliseconds = 0, milliseconds_t = 0;
// Display buffer/control
volatile int display_buffer[8];
volatile int display_ctl[8];
volatile int display_blink = 0;
volatile int display_blink_rate;
volatile int display_position;
// Switch, mode control
char d_mode = 0, e_mode = 0, d_mode_digit = 0, switch1, switch2;
unsigned int switch1_dt, switch2_dt;
char scroll[46] = {"MSP430 Launchpad....--->Hello 43oh.com<--...."};
void main(void)
{
  int i, t, l;
  unsigned char  digit[5], alt_digit = 0;
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
//1Mhz
  BCSCTL1 = CALBC1_1MHZ;                    // Set range
  DCOCTL = CALDCO_1MHZ;                     // Set DCO step + modulation */
 
  CCTL0 = CCIE;                             // CCR0 interrupt enabled
  CCR0 = 1000;
  TACTL = TASSEL_2 + MC_2;                  // SMCLK, contmode
  
  Initializeports();
 
 _EINT();
 
  /* Main Application Loop */
  while(1)
  {
 
  // Scroll test
 for(t=0; t < 44; t++)
     {     
  for(l=0; l < 6; l++)
    {
  for(i=0; i < 7; i++)
      {
      display_buffer[i] = display_buffer[i + 1];
      }     
      display_buffer[7] = ~Font8x5[scroll[t] - 32][l] & 0x00ff;
      __inline__delay(10000);
      }
  }
  seconds = 0;
  while(seconds < 1);
 
   // Display a Character swip effect     
  for(t=0; t < 32; t++)
     {     
  for(i=0; i < 6; i++)
      {
      display_buffer[i] = ~Font8x5[t][i] & 0x00ff;
      __inline__delay(20000);
      }
   display_buffer[6] = 0xff;
   display_buffer[7] = 0xff;
  seconds = 0;
  while(seconds < 1);
   }   
  
   
  }
}
int binary2bcd16( unsigned char *bcd, int t )  // 16bit to BCD conversion
{
int i;
while( i < 5)
 {
 bcd[i] = 0;
 i++;
}
     if ( t > 9999 ) bcd[4] = t / 10000;
     if ( t > 999  ) bcd[3] = t  / 1000 - bcd[4] * 10;
     if ( t > 99 ) bcd[2] = t / 100 - (bcd[3] * 10 + bcd[4] * 100);
     if ( t > 9 ) bcd[1] = t / 10 - (bcd[2] * 10 + bcd[3] * 100 + bcd[4] * 1000);
     bcd[0] = t - (bcd[1] * 10 + bcd[2] * 100 + bcd[3] * 1000 + bcd[4] * 10000);     
 
}
// Display
void display_refresh( void )
{
int d;
if ( (display_ctl[display_position] == 0x01) && (display_blink == 0x01))
    {
   d = 16;
   }else{
    d = display_buffer[display_position];
   }
display_led( d, display_position);
display_position++;
if (display_position > 7) display_position = 0;
}
// Serial out of LED data to 74HC595
int display_led(int t, int display)
{
int j, i, mask;
mask = (0x0100<<display) & 0xff00;
j = t | mask;
P1OUT &= ~BIT2;
for(i=0; i < 16; i++)
   {   
   P1OUT &= ~BIT1;
   if  (j & 0x8000)
      {
      P1OUT |= BIT0;
      }else{
      P1OUT &= ~BIT0;
      }
P1OUT |= BIT1;
   j = j<<1;
   }
P1OUT |= BIT2;
}
// setup ports
void Initializeports(void)
{
int i = 0;
P1DIR |= 0x07;    
P1SEL = 0x00;
P1OUT = 0x18;                             // P1.4 set, else reset
P1REN |= 0x18;
while( i < 8 )
  {
  display_buffer[i] = 0;
  display_ctl[i] = 0;
  i++;
  }
}   
   
// Delay Routine from mspgcc help file
static void __inline__delay(register unsigned int n)
{
  __asm__ __volatile__ (
  "1: \n"
  " dec %[n] \n"
  " jne 1b \n"
        : [n] "+r"(n));
}
// Time keeping routine
interrupt(TIMERA0_VECTOR) Timer_A (void)
{
milliseconds++;
milliseconds_t++;
if (milliseconds > 999)
   {
   seconds++;
   milliseconds = 0;
   }
if (milliseconds_t > 59999)
   {
   milliseconds_t = 0;
   }
if ( 0x10 & ~P1IN)
   {
   switch1_dt++;
  }else{
  switch1_dt = 0;
  }
    
if ( 0x08 & ~P1IN)
   {
   switch2_dt++;
  }else{
  switch2_dt = 0;
  }
if (seconds > 59)
   {
   minutes++;
   seconds = 0;
   }   
if (minutes > 59 )
   {
    hours++;
    minutes = 0;
   }
if (hours > 23)
    {
    hours = 0;
    days++;
    }
  
display_blink_rate++; 
if  (display_blink_rate > 250)  // LED Blink rate
    {
    display_blink = (~display_blink) & 0x01;  
    display_blink_rate = 0;
    }
display_refresh( );
CCR0 += 999;
}