Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <msp430.h>
- /*
- * main.c
- */
- #define RESET 0x0800
- #define RD 0x0400
- #define WR 0x0200
- #define A0 0x0100
- unsigned int SPIDAT=0;
- void send_SPI(unsigned int c)
- {
- unsigned int a;
- a=c>>8;
- while(!(UCA0IFG&UCTXIFG));
- UCA0TXBUF=(unsigned char)a;
- while(!(UCA0IFG&UCTXIFG));
- UCA0TXBUF=(unsigned char)c;
- while(!(UCA0IFG&UCTXIFG));
- P1OUT |= BIT6;
- P1OUT &=~BIT6;
- return;
- }
- void send_PLL(unsigned long c)
- {
- unsigned char i;
- unsigned long a;
- a=c>>24; //posuv o 24 bitů doprava, zůstane nejvyšší byte
- while(!(UCA0IFG&UCTXIFG)); //kontrola zda bylo již vše odesláno, buffer je prázdný
- UCA0TXBUF=(unsigned char)a;
- while(!(UCA0IFG&UCTXIFG));
- a=c>>16;
- UCA0TXBUF=(unsigned char)a;
- while(!(UCA0IFG&UCTXIFG));
- a=c>>8;
- UCA0TXBUF=(unsigned char)a;
- while(!(UCA0IFG&UCTXIFG));
- UCA0TXBUF=(unsigned char)c;
- while(!(UCA0IFG&UCTXIFG));
- P8OUT |= BIT1;
- for(i=0;i<50;i++)
- {};
- P8OUT &=~BIT1;
- return;
- }
- void LCD_CMD(unsigned char command)
- {
- P8OUT &=~ BIT1;
- SPIDAT |= A0; //A0 do 1
- SPIDAT=SPIDAT+command;
- SPIDAT &=~ WR; //WR vynuluji
- send_SPI(SPIDAT);
- SPIDAT |= WR; //WR, A0 přepnu do 1
- send_SPI(SPIDAT);
- SPIDAT=SPIDAT&0xFF00;
- return;
- }
- void LCD_DATA(unsigned char data)
- {
- SPIDAT=SPIDAT+data;
- SPIDAT &=~ A0; //A0 vynuluji
- SPIDAT &=~ WR; //WR vynuluji
- send_SPI(SPIDAT);
- SPIDAT |= WR; //WR, A0 přepnu do 1
- send_SPI(SPIDAT);
- SPIDAT=SPIDAT&0xFF00;
- return;
- }
- void cursor(unsigned int pozice)
- {
- LCD_CMD(0x46); // cursor command
- LCD_DATA((unsigned char)pozice); // lower
- pozice=pozice>>8;
- LCD_DATA((unsigned char)pozice); // higher
- }
- void graphics_clear(void)
- {
- //funkce vyčistí grafickou část
- unsigned int m=0; //proměnné pro cykly
- unsigned int n=0; //proměnné pro cykly
- LCD_CMD(0x4F);
- for(m=0;m<27;m++)
- {
- for(n=0;n<40;n++)
- {
- cursor(9600+m*360+n);
- LCD_CMD(0x42);
- LCD_DATA(0x00);
- LCD_DATA(0x00);
- LCD_DATA(0x00);
- LCD_DATA(0x00);
- LCD_DATA(0x00);
- LCD_DATA(0x00);
- LCD_DATA(0x00);
- LCD_DATA(0x00);
- LCD_DATA(0x00);
- }
- }
- }
- void write_pixel(unsigned int x,unsigned int y)
- {
- static int pozicnik=0;
- static int mem;
- static int pole[20]={0};
- unsigned char sektor;
- unsigned char subbit;
- subbit=x%8;
- sektor=(x-subbit)/8;
- if(pozicnik!=19)
- {
- cursor(pole[pozicnik+1]);//předchozí pozici vyčistit
- LCD_CMD(0x42);
- LCD_DATA(0x00);
- }
- else
- {
- cursor(pole[0]);//předchozí pozici vyčistit
- LCD_CMD(0x42);
- LCD_DATA(0x00);
- }
- mem=9600+y*40+sektor;
- pole[pozicnik]=mem;
- pozicnik++;
- if(pozicnik==20)
- {
- pozicnik=0;
- }
- cursor(mem);
- LCD_CMD(0x42);
- LCD_DATA(0b10000000>>subbit);
- }
- /* zalozni pro PLL1
- void PLL1_FREQ(unsigned long kmitocet)
- {
- unsigned int INTEGER;
- unsigned int LSB_FRAC;
- unsigned int MSB_FRAC;
- float temporary;
- INTEGER=kmitocet/10e6;
- temporary=((kmitocet/10e6)-INTEGER)*4096;
- MSB_FRAC=(int)temporary;
- LSB_FRAC= (int)((temporary - MSB_FRAC)*8192);
- send_PLL(0x00000004); //reg 4 neg current bleeding on
- send_PLL(0x00000003); //reg 3
- send_PLL(0x0E008002); //reg 2
- send_PLL(0x00000001|((long)(LSB_FRAC)<<15)); //reg 1
- send_PLL(0x30000000|((long)(INTEGER)<<15)|((long)(MSB_FRAC)<<3)); //reg 0
- }*/
- void PLL1_FREQ(unsigned long kmitocet)
- {
- unsigned int INTEGER;
- unsigned int LSB_FRAC;
- unsigned int MSB_FRAC;
- float temporary;
- INTEGER=kmitocet/10e6;
- temporary=((kmitocet/10e6)-INTEGER)*4096;
- MSB_FRAC=(int)temporary;
- LSB_FRAC= (int)((temporary - MSB_FRAC)*8192);
- send_PLL(0x580005); //reg R5 1011000,00000000,00000101
- send_PLL(0xBC803C); //reg R4 01101100,10000000,00111100
- send_PLL(0x4B3); //reg R3 100,10110011
- send_PLL(0x4042); //reg R2 1001110,01000010
- send_PLL(0x8008009);//reg R1 100000000000,10000000,00001001
- send_PLL(0x320000); //reg R0 110010,00000000,00000000
- /*
- send_PLL(0x00000004); //reg 4 neg current bleeding on
- send_PLL(0x00000003); //reg 3
- send_PLL(0x0E008002); //reg 2
- send_PLL(0x00000001|((long)(LSB_FRAC)<<15)); //reg 1
- send_PLL(0x30000000|((long)(INTEGER)<<15)|((long)(MSB_FRAC)<<3)); //reg 0
- */
- }
- int main(void)
- {
- unsigned int i;
- unsigned int px=0;
- unsigned int py=0;
- unsigned char xpriznak=0;
- unsigned char ypriznak=0;
- unsigned long frekvence=800e6;
- WDTCTL = WDTPW | WDTHOLD; // Stop watchdog timer
- P1DIR |= BIT0; //pin pro LEDku jako výstupní
- P1DIR |= BIT6; //pin pro SPI/PARALEL jako výstupní
- P3SEL |= BIT3+BIT4; //port 3 piny 3 a 4 do 1
- P8DIR |= BIT1; //výstup pro CS PLLky
- P8OUT &=~BIT1; //přepnutí pinu do nuly
- P1DIR |= BIT7; //pin P2.7 UCA0CLK set as output (SPI clock)
- P2SEL |= BIT7;
- P8OUT |= BIT1;
- P1OUT |= BIT0; //rozsvítit LEDku
- P1OUT &=~ BIT6;
- UCA0CTL1 |= UCSWRST; //nastavím
- UCA0CTL0 = UCMST+UCSYNC+UCCKPL+UCMSB; // master mode, synchronní mód, polarita hodin, posílat od MSB
- UCA0CTL1 = UCSSEL_2;
- UCA0BR0 = 0x00; //předdělička nižší bity
- UCA0BR1 = 0x00; //předdělička vyšší bity
- UCA0MCTL = 0x00; //modulace, vždy zapsat 0
- UCA0CTL1 &=~UCSWRST; //vynuluji
- //END of SPI initialization
- /*
- SPIDAT |= RESET|A0|WR|RD; //nastavím
- SPIDAT &=~(WR|A0); //vynuluju
- */
- SPIDAT|= A0|WR|RD;
- send_SPI(SPIDAT);
- _delay_cycles(1000);
- SPIDAT|= RESET;
- send_SPI(SPIDAT);
- _delay_cycles(1000);
- _delay_cycles(1000);
- LCD_CMD(0x40); //system set
- LCD_DATA(0x30);
- LCD_DATA(0x07);
- LCD_DATA(0x07);
- LCD_DATA(0x27);
- LCD_DATA(0x2F);
- LCD_DATA(0xEF);
- LCD_DATA(0x28);
- LCD_DATA(0x00);
- LCD_CMD(0x44); //scroll
- LCD_DATA(0x0);
- LCD_DATA(0x0);
- LCD_DATA(0xF0);
- LCD_DATA(0x80);
- LCD_DATA(0x25);
- LCD_DATA(0xF0);
- LCD_DATA(0x00);
- LCD_DATA(0x4B);
- LCD_DATA(0x0);
- LCD_DATA(0x0);
- LCD_CMD(0x5A); //HDOT SCR
- LCD_DATA(0x0);
- LCD_CMD(0x5B); //ovlay
- LCD_DATA(0x01);
- LCD_CMD(0x58); //DISP ON OFF
- LCD_DATA(0x56);
- LCD_CMD(0x46); //CSRW
- LCD_DATA(0x00);
- LCD_DATA(0x00);
- LCD_CMD(0x5D); //CSR FORM
- LCD_DATA(0x04);
- LCD_DATA(0x86);
- LCD_CMD(0x59); //display ON
- //----
- cursor(0);
- for(i=0;i<1200;i++)
- {
- LCD_CMD(0x42);
- LCD_DATA(' ');
- }
- cursor(0);
- for(i=0;i<=5;i++)
- {
- LCD_CMD(0x42);
- LCD_DATA('H');
- LCD_DATA('e');
- LCD_DATA('l');
- LCD_DATA('l');
- LCD_DATA('o');
- LCD_DATA(' ');
- LCD_DATA('W');
- LCD_DATA('o');
- LCD_DATA('r');
- LCD_DATA('l');
- LCD_DATA('d');
- LCD_DATA(' ');
- }
- cursor(1000);
- LCD_CMD(0x42);
- LCD_DATA('C');
- graphics_clear();
- write_pixel(100,100);
- //nastavení PLLky na 1GHz
- /*
- send_PLL(0x00000004); //reg 4 neg current bleeding on
- send_PLL(0x00000003); //reg 3
- send_PLL(0x0E008002); //reg 2
- send_PLL(0x00000001); //reg 1
- send_PLL(0x30500000); //reg 0
- */
- PLL1_FREQ(1599001234);
- /*
- while(1)
- {
- /*
- for(frekvence=800000000;frekvence<=1600000000;frekvence++)
- {
- PLL1_FREQ(frekvence);
- frekvence=frekvence+1000;
- }
- }
- */
- while(1)
- {
- if(xpriznak==0)
- px++;
- if(ypriznak==0)
- py++;
- if(xpriznak!=0)
- px--;
- if(ypriznak!=0)
- py--;
- if(px==319)
- xpriznak=1;
- if(py==239)
- ypriznak=1;
- if(px==0)
- xpriznak=0;
- if(py==0)
- ypriznak=0;
- write_pixel(px,py);
- for(i=0;i<4000;i++)
- {}
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement