Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<msp430x14x.h>
- #define bitset(var,bitno) ((var) |= 1 << (bitno))
- #define bitclr(var,bitno) ((var) &= ~(1 << (bitno)))
- #define LCD_Data P2OUT
- #define _100us 100 //
- #define _10us 10 //
- #define E 3 //P2.3
- #define RS 2 //P2.2
- #define CLR_DISP 0x01 // clear display
- #define CUR_HOME 0x02 // return home
- #define ENTRY_INC 0x06 // entry mode increment
- #define ENTRY_INC_ROL 0x07 // entry mode increment with rol data
- #define ENTRY_DEC 0x04 // entry mode decrement
- #define ENTRY_DEC_ROL 0x05 // entry mode decrement witch rol dat
- #define DISP_OFF 0x08 // all display off
- #define DISP_ON 0x0c // all display on
- #define DATA_ROL_LEFT 0x18 // rol data left
- #define DATA_ROL_RIGHT 0x1c // rol data right
- #define CUR_SHIFT_LEFT 0x10 // shift coursor left
- #define CUR_SHIFT_RIGHT 0x14 // shift coursor right
- #define DD_RAM_ADDR 0x80 // set DD_RAM
- #define DD_RAM_ADDR2 0xc0 // set CG_RAM
- #define DD_RAM_ADDR3 0x28 //
- #define STATUS_ON P2OUT&=~BIT1
- #define STATUS_OFF P2OUT|=BIT1
- #define BUZ1_HI P4OUT|=BIT2
- #define BUZ1_LOW P4OUT&=~BIT2
- #define BUZ2_HI P4OUT|=BIT3
- #define BUZ2_LOW P4OUT&=~BIT3
- #define FREQ_BUZ 100
- #define LIGHT 32000
- #define BUZZER 900
- #define CG_RAM_ADDR 0x40 //
- void InitPortsLcd(void);
- void InitLCD(void);
- void putc(char c);
- void clearDisplay();
- void printDecDigit(int Number);
- void SEND_CHAR (unsigned char c);
- void SEND_CMD (unsigned char e);
- void Delayx100us(unsigned char b);
- void InitPortsLcd(void);
- void Delay (unsigned int a);
- void _E(void);
- void przelicznik(long x);
- void delay (unsigned int n);
- void Game();
- void Wyswietl();
- void Wczytywanie_znakow();
- //---------------- zmienne globalne -------------
- unsigned int i=0;
- unsigned int licznik=0;
- unsigned int kierunek = 0; // 0 - stop, 1 - lewo, 2 - prawo, 3 - gora, 4 - dol
- unsigned int dlugosc = 2; // dlugosc pytona
- //----------------- main program -------------------
- void main( void )
- {
- P4DIR &= ~0x10;
- P4DIR &= ~0x20;
- P4DIR &= ~0x40;
- P4DIR &= ~0x80;
- P2DIR |= BIT1 ; // STATUS LED
- P2DIR |= 0x02; // ustawienie P2.1 jako wyjocie
- P4DIR |= BIT2 | BIT3; // P4.2 i P4.3 wyjocia
- BUZ1_LOW;
- BUZ2_LOW;
- //WDT wylaczony
- WDTCTL=WDTPW + WDTHOLD;
- IE1 |= WDTIE;
- _BIS_SR(GIE);
- InitPortsLcd(); // inicjalizacja portów LCD
- InitLCD(); // inicjalizacja LCD
- clearDisplay(); // czyszczenie wyowietlacza
- // Basic Clock Module ustawiamy na ACLK(zegar 8 MHz ) i dzielimy czestotliwooa przez 2 (4 MHz)
- BCSCTL1 |= XTS ;//+ DIVA_3; // ACLK = LFXT1 = HF XTAL 8MHz !!!!zad1 ma byc DIVA3!!!!
- do{
- IFG1 &= ~OFIFG; // Czyszczenie flgi OSCFault
- for (i = 0xFF; i > 0; i--); // odczekanie
- }while ((IFG1 & OFIFG) == OFIFG); // dopóki OSCFault jest ci1gle ustawiona
- BCSCTL1 |= DIVA_1;//DIVA_2; // ACLK=8 MHz/2=4 MHz !!!!zad1 ma byc DIVA2!!!!
- BCSCTL2 |= SELM0 | SELM1; // MCLK= LFTX1 =ACLK
- // Timer_A ustawiamy na 500 kHz
- // a przerwanie generujemy co 100 ms
- TACTL = TASSEL_1 + MC_1 + ID_3;//+ID_1; // Wybieram ACLK, ACLK/8=500kHz,tryb Up !!!!zad1 ma byc id_1!!!!
- CCTL0 = CCIE; // w31czenie przerwan od CCR0
- CCR0=50000; // podzielnik 50000: przerwanie co 100 ms
- _EINT(); // w31czenie przerwan
- Wczytywanie_znakow();
- for (;;){
- _BIS_SR(LPM3_bits); // przejscie do trybu LPM3
- Game();
- }
- }
- // procedura obslugi przerwania od TimerA
- #pragma vector=TIMERA0_VECTOR
- __interrupt void Timer_A (void){
- ++licznik;
- _BIC_SR_IRQ(LPM3_bits); // wyjocie z trybu LPM3
- }
- void InitPortsLcd(void)
- {
- P2SEL = 0;
- P2OUT = 0;
- P2DIR = ~BIT0; //only P2.0 is input
- }
- void putc(char c) {
- SEND_CHAR(c);
- }
- void clearDisplay() {
- SEND_CMD(CLR_DISP);
- Delayx100us(10);
- }
- void Delay (unsigned int a)
- {
- int k;
- for (k=0 ; k != a; ++k) {
- _NOP();
- _NOP();
- _NOP();
- _NOP();
- }
- }
- void Delayx100us(unsigned char b)
- {
- int j;
- for (j=0; j!=b; ++j) Delay (_100us);
- }
- void _E(void)
- {
- bitset(P2OUT,E); //toggle E for LCD
- Delay(_10us);
- bitclr(P2OUT,E);
- }
- void SEND_CHAR (unsigned char d)
- {
- int temp;
- Delayx100us(5); //.5ms
- temp = d & 0xf0; //get upper nibble
- LCD_Data &= 0x0f;
- LCD_Data |= temp;
- bitset(P2OUT,RS); //set LCD to data mode
- _E(); //toggle E for LCD
- temp = d & 0x0f;
- temp = temp << 4; //get down nibble
- LCD_Data &= 0x0f;
- LCD_Data |= temp;
- bitset(P2OUT,RS); //set LCD to data mode
- _E(); //toggle E for LCD
- }
- void SEND_CMD (unsigned char e)
- {
- int temp;
- Delayx100us(10); //10ms
- temp = e & 0xf0; //get upper nibble
- LCD_Data &= 0x0f;
- LCD_Data |= temp; //send CMD to LCD
- bitclr(P2OUT,RS); //set LCD to CMD mode
- _E(); //toggle E for LCD
- temp = e & 0x0f;
- temp = temp << 4; //get down nibble
- LCD_Data &= 0x0f;
- LCD_Data |= temp;
- bitclr(P2OUT,RS); //set LCD to CMD mode
- _E(); //toggle E for LCD
- }
- void InitLCD(void)
- {
- bitclr(P2OUT,RS);
- Delayx100us(250); //Delay 100ms
- Delayx100us(250);
- Delayx100us(250);
- Delayx100us(250);
- LCD_Data |= BIT4 | BIT5; //D7-D4 = 0011
- LCD_Data &= ~BIT6 & ~BIT7;
- _E(); //toggle E for LCD
- Delayx100us(100); //10ms
- _E(); //toggle E for LCD
- Delayx100us(100); //10ms
- _E(); //toggle E for LCD
- Delayx100us(100); //10ms
- LCD_Data &= ~BIT4;
- _E(); //toggle E for LCD
- SEND_CMD(DISP_ON);
- SEND_CMD(CLR_DISP);
- Delayx100us(250);
- Delayx100us(250);
- Delayx100us(250);
- Delayx100us(250);
- }
- //-----Przelicznik liczb-----------
- void przelicznik(long x){
- if(x >= 10)
- przelicznik(x / 10);
- int liczba = x%10 + 48;
- SEND_CHAR(liczba);
- }
- void Game(){
- //przyciski
- if(licznik%10 == 0){
- wyswietl();
- }
- }
- void Wyswietl(){
- P2OUT ^=BIT1; //zapal diode
- }
- void delay (unsigned int n){
- unsigned int i;
- for (i=0;i<n;i++){};
- }
- void Wczytywanie_znakow(){
- SEND_CMD(0x40);
- int jablko_gora[] = {0x0, 0x4, 0xe, 0x4, 0x0, 0x0, 0x0, 0x0};
- int jablko_dol[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0x4, 0xe, 0x4};
- int jablko_gora_snake[] = {0x0, 0x4, 0xe, 0x4, 0x0, 0xe, 0xe, 0xe};
- int jablko_dol_snake[] = {0x0, 0xe, 0xe, 0xe, 0x0, 0x4, 0xe, 0x4};
- int snake_dol[] = {0x0, 0x0, 0x0, 0x0, 0x0, 0xe, 0xe, 0xe};
- int snake_gora[] = {0x0, 0xe, 0xe, 0xe, 0x0, 0x0, 0x0, 0x0};
- int snake_full[] = {0x0, 0xe, 0xe, 0xe, 0x0, 0xe, 0xe, 0xe};
- int i;
- for(i = 0; i<8; i++){
- SEND_CHAR(jablko_gora[i]);
- }
- for(i = 0; i<8; i++){
- SEND_CHAR(jablko_dol[i]);
- }
- for(i = 0; i<8; i++){
- SEND_CHAR(jablko_gora_snake[i]);
- }
- for(i = 0; i<8; i++){
- SEND_CHAR(jablko_dol_snake[i]);
- }
- for(i = 0; i<8; i++){
- SEND_CHAR(snake_dol[i]);
- }
- for(i = 0; i<8; i++){
- SEND_CHAR(snake_gora[i]);
- }
- for(i = 0; i<8; i++){
- SEND_CHAR(snake_full[i]);
- }
- SEND_CMD(0x80);
- char napis[] = {0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06};
- //SEND_CMD(0xc0); DRUGA LINIA
- for(i = 0; i<7; i++){
- SEND_CHAR(napis[i]);
- }
- SEND_CMD(0xc0);
- for(i = 0; i<7; i++){
- SEND_CHAR(napis[i]);
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement