Advertisement
Guest User

Untitled

a guest
Jan 9th, 2015
222
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 6.96 KB | None | 0 0
  1. #include <msp430.h>
  2.  
  3. /*
  4.  * main.c
  5.  */
  6. #define RESET 0x0800
  7. #define RD 0x0400
  8. #define WR 0x0200
  9. #define A0 0x0100
  10. unsigned int SPIDAT=0;
  11.  
  12. void send_SPI(unsigned int c)
  13. {
  14.     unsigned int a;
  15.     a=c>>8;
  16.  
  17.     while(!(UCA0IFG&UCTXIFG));
  18.     UCA0TXBUF=(unsigned char)a;
  19.     while(!(UCA0IFG&UCTXIFG));
  20.     UCA0TXBUF=(unsigned char)c;
  21.     while(!(UCA0IFG&UCTXIFG));
  22.  
  23.     P1OUT |= BIT6;
  24.     P1OUT &=~BIT6;
  25.     return;
  26. }
  27. void send_PLL(unsigned long c)
  28. {
  29.     unsigned char i;
  30.     unsigned long a;
  31.     a=c>>24;                    //posuv o 24 bitů doprava, zůstane nejvyšší byte
  32.  
  33.     while(!(UCA0IFG&UCTXIFG));  //kontrola zda bylo již vše odesláno, buffer je prázdný
  34.  
  35.     UCA0TXBUF=(unsigned char)a;
  36.     while(!(UCA0IFG&UCTXIFG));
  37.  
  38.     a=c>>16;
  39.     UCA0TXBUF=(unsigned char)a;
  40.     while(!(UCA0IFG&UCTXIFG));
  41.  
  42.     a=c>>8;
  43.     UCA0TXBUF=(unsigned char)a;
  44.     while(!(UCA0IFG&UCTXIFG));
  45.  
  46.     UCA0TXBUF=(unsigned char)c;
  47.     while(!(UCA0IFG&UCTXIFG));
  48.  
  49.     P8OUT |= BIT1;
  50.     for(i=0;i<50;i++)
  51.     {};
  52.     P8OUT &=~BIT1;
  53.     return;
  54. }
  55.  
  56. void LCD_CMD(unsigned char command)
  57. {
  58.     P8OUT &=~ BIT1;
  59.     SPIDAT |= A0;           //A0 do 1
  60.     SPIDAT=SPIDAT+command;
  61.     SPIDAT &=~ WR;          //WR vynuluji
  62.     send_SPI(SPIDAT);
  63.  
  64.     SPIDAT |= WR;           //WR, A0 přepnu do 1
  65.     send_SPI(SPIDAT);
  66.  
  67.  
  68.     SPIDAT=SPIDAT&0xFF00;
  69.     return;
  70. }
  71.  
  72. void LCD_DATA(unsigned char data)
  73. {
  74.  
  75.     SPIDAT=SPIDAT+data;
  76.     SPIDAT &=~ A0;          //A0 vynuluji
  77.     SPIDAT &=~ WR;          //WR vynuluji
  78.     send_SPI(SPIDAT);
  79.     SPIDAT |= WR;       //WR, A0 přepnu do 1
  80.     send_SPI(SPIDAT);
  81.  
  82.     SPIDAT=SPIDAT&0xFF00;
  83.     return;
  84. }
  85. void cursor(unsigned int pozice)
  86. {
  87. LCD_CMD(0x46);  // cursor command
  88. LCD_DATA((unsigned char)pozice); // lower
  89. pozice=pozice>>8;
  90. LCD_DATA((unsigned char)pozice);    // higher
  91. }
  92. void graphics_clear(void)
  93. {
  94. //funkce vyčistí grafickou část
  95. unsigned int m=0; //proměnné pro cykly
  96. unsigned int n=0; //proměnné pro cykly
  97. LCD_CMD(0x4F);
  98. for(m=0;m<27;m++)
  99. {
  100.  
  101.  
  102.     for(n=0;n<40;n++)
  103.     {
  104.         cursor(9600+m*360+n);
  105.  
  106.         LCD_CMD(0x42);
  107.         LCD_DATA(0x00);
  108.         LCD_DATA(0x00);
  109.         LCD_DATA(0x00);
  110.         LCD_DATA(0x00);
  111.         LCD_DATA(0x00);
  112.         LCD_DATA(0x00);
  113.         LCD_DATA(0x00);
  114.         LCD_DATA(0x00);
  115.         LCD_DATA(0x00);
  116.  
  117.     }
  118. }
  119. }
  120.  
  121. void write_pixel(unsigned int x,unsigned int y)
  122. {
  123.     static int pozicnik=0;
  124.     static int mem;
  125.     static int pole[20]={0};
  126.     unsigned char sektor;
  127.     unsigned char subbit;
  128.     subbit=x%8;
  129.     sektor=(x-subbit)/8;
  130.  
  131.     if(pozicnik!=19)
  132.     {
  133.     cursor(pole[pozicnik+1]);//předchozí pozici vyčistit
  134.     LCD_CMD(0x42);
  135.     LCD_DATA(0x00);
  136.     }
  137.     else
  138.     {
  139.     cursor(pole[0]);//předchozí pozici vyčistit
  140.     LCD_CMD(0x42);
  141.     LCD_DATA(0x00);
  142.     }
  143.  
  144.     mem=9600+y*40+sektor;
  145.     pole[pozicnik]=mem;
  146.     pozicnik++;
  147.  
  148.     if(pozicnik==20)
  149.         {
  150.         pozicnik=0;
  151.         }
  152.  
  153.  
  154.     cursor(mem);
  155.     LCD_CMD(0x42);
  156.     LCD_DATA(0b10000000>>subbit);
  157. }
  158. /* zalozni pro PLL1
  159. void PLL1_FREQ(unsigned long kmitocet)
  160. {
  161. unsigned int INTEGER;
  162. unsigned int LSB_FRAC;
  163. unsigned int MSB_FRAC;
  164. float temporary;
  165.  
  166. INTEGER=kmitocet/10e6;
  167.  
  168. temporary=((kmitocet/10e6)-INTEGER)*4096;
  169.  
  170. MSB_FRAC=(int)temporary;
  171.  
  172. LSB_FRAC= (int)((temporary - MSB_FRAC)*8192);
  173.  
  174.  
  175. send_PLL(0x00000004); //reg 4 neg current bleeding on
  176. send_PLL(0x00000003); //reg 3
  177. send_PLL(0x0E008002); //reg 2
  178. send_PLL(0x00000001|((long)(LSB_FRAC)<<15)); //reg 1
  179. send_PLL(0x30000000|((long)(INTEGER)<<15)|((long)(MSB_FRAC)<<3)); //reg 0
  180. }*/
  181.  
  182. void PLL1_FREQ(unsigned long kmitocet)
  183. {
  184. unsigned int INTEGER;
  185. unsigned int LSB_FRAC;
  186. unsigned int MSB_FRAC;
  187. float temporary;
  188.  
  189. INTEGER=kmitocet/10e6;
  190.  
  191. temporary=((kmitocet/10e6)-INTEGER)*4096;
  192.  
  193. MSB_FRAC=(int)temporary;
  194.  
  195. LSB_FRAC= (int)((temporary - MSB_FRAC)*8192);
  196.  
  197. send_PLL(0x580005); //reg R5      1011000,00000000,00000101
  198. send_PLL(0xBC803C); //reg R4     01101100,10000000,00111100
  199. send_PLL(0x4B3);    //reg R3                   100,10110011
  200. send_PLL(0x4042);   //reg R2               1001110,01000010
  201. send_PLL(0x8008009);//reg R1 100000000000,10000000,00001001
  202. send_PLL(0x320000); //reg R0       110010,00000000,00000000
  203. /*
  204. send_PLL(0x00000004); //reg 4 neg current bleeding on
  205. send_PLL(0x00000003); //reg 3
  206. send_PLL(0x0E008002); //reg 2
  207. send_PLL(0x00000001|((long)(LSB_FRAC)<<15)); //reg 1
  208. send_PLL(0x30000000|((long)(INTEGER)<<15)|((long)(MSB_FRAC)<<3)); //reg 0
  209. */
  210. }
  211.  
  212. int main(void)
  213. {
  214. unsigned int i;
  215. unsigned int px=0;
  216. unsigned int py=0;
  217. unsigned char xpriznak=0;
  218. unsigned char ypriznak=0;
  219. unsigned long frekvence=800e6;
  220. WDTCTL = WDTPW | WDTHOLD;   // Stop watchdog timer
  221. P1DIR |= BIT0;      //pin pro LEDku jako výstupní
  222. P1DIR |= BIT6;      //pin pro SPI/PARALEL jako výstupní
  223. P3SEL |= BIT3+BIT4; //port 3 piny 3 a 4 do 1
  224.  
  225. P8DIR |= BIT1;      //výstup pro CS PLLky
  226. P8OUT &=~BIT1;      //přepnutí pinu do nuly
  227.  
  228. P1DIR |= BIT7;      //pin P2.7 UCA0CLK set as output (SPI clock)
  229. P2SEL |= BIT7;
  230. P8OUT |= BIT1;
  231.  
  232. P1OUT |= BIT0;      //rozsvítit LEDku
  233. P1OUT &=~ BIT6;
  234.  
  235. UCA0CTL1 |= UCSWRST; //nastavím
  236.  
  237. UCA0CTL0  = UCMST+UCSYNC+UCCKPL+UCMSB; // master mode, synchronní mód, polarita hodin, posílat od MSB
  238. UCA0CTL1  = UCSSEL_2;
  239. UCA0BR0   = 0x00;   //předdělička nižší bity
  240. UCA0BR1   = 0x00;   //předdělička vyšší bity
  241. UCA0MCTL  = 0x00;   //modulace, vždy zapsat 0
  242. UCA0CTL1 &=~UCSWRST; //vynuluji
  243. //END of SPI initialization
  244.  
  245. /*
  246. SPIDAT |= RESET|A0|WR|RD; //nastavím
  247. SPIDAT &=~(WR|A0);          //vynuluju
  248. */
  249. SPIDAT|= A0|WR|RD;
  250. send_SPI(SPIDAT);
  251. _delay_cycles(1000);
  252. SPIDAT|= RESET;
  253. send_SPI(SPIDAT);
  254. _delay_cycles(1000);
  255. _delay_cycles(1000);
  256.  
  257. LCD_CMD(0x40); //system set
  258. LCD_DATA(0x30);
  259. LCD_DATA(0x07);
  260. LCD_DATA(0x07);
  261. LCD_DATA(0x27);
  262. LCD_DATA(0x2F);
  263. LCD_DATA(0xEF);
  264. LCD_DATA(0x28);
  265. LCD_DATA(0x00);
  266.  
  267. LCD_CMD(0x44); //scroll
  268. LCD_DATA(0x0);
  269. LCD_DATA(0x0);
  270. LCD_DATA(0xF0);
  271. LCD_DATA(0x80);
  272. LCD_DATA(0x25);
  273. LCD_DATA(0xF0);
  274. LCD_DATA(0x00);
  275. LCD_DATA(0x4B);
  276. LCD_DATA(0x0);
  277. LCD_DATA(0x0);
  278.  
  279. LCD_CMD(0x5A); //HDOT SCR
  280. LCD_DATA(0x0);
  281. LCD_CMD(0x5B); //ovlay
  282. LCD_DATA(0x01);
  283. LCD_CMD(0x58); //DISP ON OFF
  284. LCD_DATA(0x56);
  285. LCD_CMD(0x46); //CSRW
  286. LCD_DATA(0x00);
  287. LCD_DATA(0x00);
  288. LCD_CMD(0x5D); //CSR FORM
  289. LCD_DATA(0x04);
  290. LCD_DATA(0x86);
  291. LCD_CMD(0x59); //display ON
  292. //----
  293. cursor(0);
  294. for(i=0;i<1200;i++)
  295. {
  296. LCD_CMD(0x42);
  297. LCD_DATA(' ');
  298. }
  299. cursor(0);
  300. for(i=0;i<=5;i++)
  301. {
  302. LCD_CMD(0x42);
  303. LCD_DATA('H');
  304. LCD_DATA('e');
  305. LCD_DATA('l');
  306. LCD_DATA('l');
  307. LCD_DATA('o');
  308. LCD_DATA(' ');
  309. LCD_DATA('W');
  310. LCD_DATA('o');
  311. LCD_DATA('r');
  312. LCD_DATA('l');
  313. LCD_DATA('d');
  314. LCD_DATA(' ');
  315. }
  316.  
  317. cursor(1000);
  318. LCD_CMD(0x42);
  319. LCD_DATA('C');
  320.  
  321. graphics_clear();
  322. write_pixel(100,100);
  323.  
  324. //nastavení PLLky na 1GHz
  325. /*
  326. send_PLL(0x00000004); //reg 4 neg current bleeding on
  327. send_PLL(0x00000003); //reg 3
  328. send_PLL(0x0E008002); //reg 2
  329. send_PLL(0x00000001); //reg 1
  330. send_PLL(0x30500000); //reg 0
  331. */
  332. PLL1_FREQ(1599001234);
  333. /*
  334. while(1)
  335. {
  336.  
  337.     /*
  338. for(frekvence=800000000;frekvence<=1600000000;frekvence++)
  339. {
  340.     PLL1_FREQ(frekvence);
  341.     frekvence=frekvence+1000;
  342. }
  343.  
  344. }
  345. */
  346. while(1)
  347. {
  348. if(xpriznak==0)
  349. px++;
  350. if(ypriznak==0)
  351. py++;
  352.  
  353. if(xpriznak!=0)
  354. px--;
  355. if(ypriznak!=0)
  356. py--;
  357.  
  358. if(px==319)
  359. xpriznak=1;
  360. if(py==239)
  361. ypriznak=1;
  362.  
  363. if(px==0)
  364. xpriznak=0;
  365. if(py==0)
  366. ypriznak=0;
  367.  
  368. write_pixel(px,py);
  369. for(i=0;i<4000;i++)
  370. {}
  371.  
  372. }
  373.  
  374.     return 0;
  375. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement