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 ); // 16bitint display_led(int t, int display);void display_refresh( void );// Time function variblesvolatile 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/controlvolatile 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 controlchar 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); }// Displayvoid 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 74HC595int 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 portsvoid Initializeports(void){int i = 0;P1DIR |= 0x07; P1SEL = 0x00;P1OUT = 0x18; // P1.4 set, else resetP1REN |= 0x18;while( i < 8 ) { display_buffer[i] = 0; display_ctl[i] = 0; i++; }} // Delay Routine from mspgcc help filestatic void __inline__delay(register unsigned int n){ __asm__ __volatile__ ( "1: \n" " dec %[n] \n" " jne 1b \n" : [n] "+r"(n));}// Time keeping routineinterrupt(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;}