#include <msp430g2553.h> #define CS1 BIT1 // #define CS2 BIT2 // #define CLK BIT5 // #define D BIT7 // char flag_next=0; // ( ) /* */ void bit1() { P1OUT &= ~D; P1OUT &= ~CLK; P1OUT |= CLK; } /* */ void bit0() { P1OUT |= D; P1OUT &= ~CLK; P1OUT |= CLK; } /* * ( ) */ void delay( unsigned int ms) { while (ms--) __delay_cycles(16000); } /* */ void spi_IO( unsigned int data ) { unsigned int i; for( i = 0; i < 8; i++ ) { // if( data & 0x80 ) bit1(); else bit0(); data <<= 1; } } /* * */ int char2byte( char ch ){ switch(ch){ case '1' : return 0x06; case '2' : return 0x5B; case '3' : return 0x4F; case '4' : return 0x66; case '5' : return 0x6D; case '6' : return 0x7D; case '7' : return 0x07; case '8' : return 0x7F; case '9' : return 0x6F; case 'O' : case 'o' : case '0' : return 0x3F; case 'a' : case 'A' : return 0x77; case 'b' : case 'B' : return 0x7C; case 'c' : case 'C' : return 0x39; case 'd' : case 'D' : return 0x5E; case 'e' : case 'E' : return 0x79; case 'f' : case 'F' : return 0x71; case '-' : return 0x40; case ' ' : return 0x00; case 'p' : case 'P' : return 0x73; case 'g' : case 'G' : return 0x31; case 'l' : case 'L' : return 0x38; case 'h' : case 'H' : return 0x76; case 'y' : case 'Y' : return 0x38; case 'r' : case 'R' : return 0x50; case 'u' : return 0x1C; case 'U' : return 0x3E; case '|' : return 0x30; case '~' : return 0x01; // case '_' : return 0x08; // case '=' : return 0x09; // case 'j' : return 0x21; // ( - // jkmn ) case 'k' : return 0x03; // case 'm' : return 0x0C; // case 'n' : return 0x18; // default: return 0x00; } } /* * * data - * n - * dot - () */ void print_LCD( char data[], char n, char dot ) { unsigned char copy[8]; unsigned char i; if(n<1) return ; if(n>8) n=8; for( i = 0; i < 8; i++ ) if(i+1>n) copy[i] = ' ' ; else copy[i] = data[i]; // // 4 P1OUT |= CS1; for(i=0;i<4;i++){ if( dot & 0x80 ) spi_IO(char2byte(copy[i])+0x80); else spi_IO(char2byte(copy[i])); dot <<= 1; } // 4 , ( ) bit0(); bit0(); bit0(); bit0(); // bit0(); bit1(); bit1(); bit0(); P1OUT &= ~CS1; // 4 P1OUT |= CS2; for(i=4; i<8; i++){ if( dot & 0x80 ) spi_IO(char2byte(copy[i])+0x80); else spi_IO(char2byte(copy[i])); dot <<= 1; } // 4 , ( ) bit0(); bit0(); bit0(); bit0(); // bit1(); bit0(); bit0(); bit0(); P1OUT &= ~CS2; } /* * LCD */ void initLCD(){ P1OUT |= CS1+CS2; // ~CS // ( - , ) // spi_IO(0); spi_IO(0); spi_IO(0); spi_IO(0); // 4 spi_IO(0x07); // 4 + 4 P1OUT &= ~(CS1 + CS2); // ~CS=1 ( ) P1OUT |= CS2; // ~CS=0 - spi_IO(0); spi_IO(0); spi_IO(0); spi_IO(0); // 4 spi_IO(0x08); // 4 + 4 P1OUT &= ~(CS2 + CS1); // ~CS=1 (!) } /* * */ void clear_LCD() { print_LCD( , 8, 0); // - } /* * */ void demo() { int demo_n = 1; while(1){ switch(demo_n){ case 0:{ int ms=50; while(1){ print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); if(flag_next==1) { demo_n=1; flag_next=0; break; } } } case 1:{ clear_LCD(); while(1){ print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(1000); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 1); delay(200); print_LCD( , 8, 2); delay(200); print_LCD( , 8, 4); delay(200); print_LCD( , 8, 8); delay(1000); print_LCD( , 8, 16); delay(200); print_LCD( , 8, 32); delay(200); print_LCD( , 8, 64); delay(200); print_LCD( , 8, 128); delay(200); print_LCD( , 8, 0); delay(200); print_LCD( , 8, 0); delay(200); if(flag_next==1) { demo_n=2; flag_next=0; break; } } //while } case 3:{ clear_LCD(); int ms=50; while(1){ print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); print_LCD( ,8,0); delay(ms); if(flag_next==1) { demo_n=0; flag_next=0; break; } } } } } } /* * main.c */ void main( void) { // WDTCTL = WDTPW + WDTHOLD; // - delay() BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ; // These are the pins we need to drive. P1DIR |= CLK + D + CS1 + CS2; P1SEL &= ~BIT3; // 1.3 P1DIR &= ~BIT3; // Port 1 P1.3 (push button) as input, 0 is input P1REN |= BIT3; // P1IE |= BIT3; // P1IFG &= ~BIT3; // delay(500); // , initLCD(); // LCD __bis_SR_register(GIE); // demo(); // } #pragma vector=PORT1_VECTOR __interrupt void Port_1( void) { P1IFG &= ~BIT3; // flag_next=1; // }