Advertisement
milanmetal

[RSDMK] Poceo 4. UART

Apr 22nd, 2018
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 7.57 KB | None | 0 0
  1. #include <c8051f340.h>        
  2. #include "time.h"
  3. #include "uart.h"
  4.  
  5. // znojimo preprocesor
  6. #define cekaj_prijem()          while(!UART0_Available())
  7. #define primljen_karakter()     UART0_Available() > 0
  8.  
  9. //#define CURIOUS_MODE
  10.  
  11. char strLen(char *str);
  12. char* intToStr(int num, char *digits);
  13.  
  14. char* intToHex(int num, char *digits);
  15. int strToInt(char *str);
  16. int pow(int sta, char na_sta);
  17.  
  18.  /*
  19.   * Niz u kome se cuvaju cifre brojeva koji se konvertuju
  20.   * u sringove kako bi se mogli ispisivati.
  21.   */
  22. char cifre[8];
  23.  
  24. // enable flag za ispis uvodne poruke
  25. bit ispisano = 0;
  26.  
  27. int i = 0;
  28.  
  29. char prijem[64];
  30.  
  31. void OSCILLATOR_Init (void);          
  32. void PORT_Init (void);
  33.  
  34. void main(void)
  35. {
  36.     OSCILLATOR_Init();  // Inicijalizacija oscilatora (Fosc = 22.1184 MHz)
  37.     TIME_Init();        // Inicijalizacija sistemskog vremena (koristi se prekid tajmera 2)
  38.     PORT_Init();        // Inicijalizacija portova
  39.  
  40.     UART0_Init();
  41.  
  42.     while (1)
  43.     {
  44.         if(!ispisano) {
  45.             UART0_PutString("Unesite tekst za provjeru: \n");
  46.             ispisano = 1;
  47.         }
  48.  
  49.         cekaj_prijem();
  50.  
  51.         if(primljen_karakter()) {
  52.             delay_ms(100);
  53.             UART0_GetString(prijem);
  54.         }
  55.  
  56.         intToStr(strToInt(prijem), cifre);
  57.         //intToStr(1000, cifre);
  58.         UART0_PutString("\nUneseni broj kao string: ");
  59.         UART0_PutString(cifre);
  60.         UART0_PutString("\n\n");
  61.         UART0_PutString("\n\n");
  62.  
  63.  
  64.         /*UART0_PutString("Unijeli ste: ");
  65.         UART0_PutString(prijem);
  66.         UART0_PutString("\n");
  67.  
  68.         UART0_PutString("Duzina unosa je: ");
  69.         // + 0 vrsi konverziju char tipa u integer.
  70.         UART0_PutString(intToStr(strLen(prijem) + 0, cifre));
  71.         UART0_PutString("\n\n"); */
  72.        
  73.         //intToHex(1000, cifre);
  74.         UART0_PutString("\nUnijeli ste ");
  75.         UART0_PutString(prijem);
  76.         UART0_PutString(" = 0x");
  77.  
  78.         //intToHex(strToInt(prijem), cifre);
  79.         intToHex(1000, cifre);
  80.         UART0_PutString(cifre);
  81.         UART0_PutString("\n\n");
  82.  
  83.  
  84.     /*  UART0_PutString("\nDuzina stringa intToStr(1000, cifre) : ");
  85.         UART0_PutString(intToStr(strLen(intToStr(1000, cifre)) + 0, cifre));
  86.         UART0_PutString("\n\n");  */
  87.  
  88.  
  89.         /*
  90.         // pretvaram broj string cifara kako bih ga ispisao.
  91.         intToStr(12345, cifre);
  92.  
  93.         UART0_PutString("Uneseni broj kao string: ");
  94.         UART0_PutString(cifre);
  95.         UART0_PutString("\n\n");  */
  96.            
  97.         /* --- */
  98.  
  99.         /* --- */
  100.  
  101.         // dozvoli ponovni ispis pocetne poruke
  102.         ispisano = 0;
  103.  
  104.     }                            
  105.  }
  106.  
  107. /*
  108.  * Vraca duzinu stringa. You dont say?
  109.  */
  110. char strLen(char *str) {
  111.     char len = 0;
  112.     while(*str) {
  113.         len++;
  114.         str++;
  115.     }
  116.     // Ovaj -1 je kompenzacija za '\0' character
  117.     //return len - 1;
  118.     return len;
  119. }
  120.  
  121. /*
  122.  * Nisam probavao math.h, cak i ako ima njen pow je slozeniji
  123.  * jer mozes stpenovati i sa realnim brojem, meni treba jednostavno
  124.  * stepenovanje cijelim brojem.
  125.  */
  126. int pow(int sta, char na_sta) {
  127.     char i = 0;
  128.     int rezultat = 1;
  129.  
  130.     for(i = 0; i < na_sta; i++) {
  131.         rezultat *= sta;
  132.     }
  133.  
  134.     return rezultat;
  135. }
  136.  
  137. /*
  138.  * Konverzija stringa u integer broj.
  139.  * Potrebno iz razloga sto podatke koje primis preko UARTA,
  140.  * program vidi kao ASCII karaktere koji mu nemaju nikakvo znacenje
  141.  * ne zna sta je 2367 nego zna sta su 2, 3, 6, 7
  142.  */
  143. int strToInt(char *str) {
  144.     char duzina = strLen(str);
  145.  
  146.     int rezultat = 0;
  147.     char i = 0;
  148.    
  149.     /*for(i = 0; i < duzina; i++) {
  150.         rezultat += ((*(str+i))+0) * pow(10, (duzina-i-1)+0);  
  151.     } */
  152.     rezultat += *(str+0) * 100;
  153.     rezultat += *(str+1) * 10;
  154.     rezultat += *(str+2) * 1;
  155.  
  156.     /*rezultat += 2 * 100;
  157.     rezultat += 3 * 10;
  158.     rezultat += 4 * 1; */
  159.    
  160.     return rezultat;
  161. }
  162.  
  163. /*
  164.  * Konverzija proizvoljnog integera u hex zapis.
  165.  */
  166. char* intToHex(int num, char *digits) {
  167.     // broj cifara
  168.     char digitCnt   = 0;
  169.     // pomocna cifra
  170.     char digitTmp;
  171.  
  172.     int ostatak;
  173.  
  174.     char i = 0;
  175.  
  176.     while(num) {
  177.         // +'0' prisiljava konverziju integera u char,
  178.         // kastovanje iz nekog razloga ne radi.
  179.         ostatak = (num % 16);
  180.         num = num / 16;
  181.  
  182.         switch(ostatak) {
  183.             /*
  184.              * U krstenom kompajleru i alatu ovo radi. Stop. Keilu.
  185.                 case 0 ... 9:
  186.                     digitTmp = digitTmp;            // zadrzava svoju vrijednost
  187.                 break;
  188.             *
  189.             */
  190.  
  191.             /*
  192.              * Al bi bilo fantasticno da ovo mozeeeeee...
  193.                 for(i = 0; i < 10; i++) {
  194.                     case i: digitTmp = i + '0'; break;
  195.                 }
  196.             */
  197.            
  198.  
  199.             /*
  200.              * Mozeo ovako sljakerski...
  201.             case 0: digitTmp = '0'; break;
  202.             case 1: digitTmp = '1'; break;
  203.             case 2: digitTmp = '2'; break;
  204.             case 3: digitTmp = '3'; break;
  205.             case 4: digitTmp = '4'; break;
  206.             case 5: digitTmp = '5'; break;
  207.             case 6: digitTmp = '6'; break;
  208.             case 7: digitTmp = '7'; break;
  209.             case 8: digitTmp = '8'; break;
  210.             case 9: digitTmp = '9'; break; */
  211.             case 10: digitTmp = 'A'; break;
  212.             case 11: digitTmp = 'B'; break;
  213.             case 12: digitTmp = 'C'; break;
  214.             case 13: digitTmp = 'D'; break;
  215.             case 14: digitTmp = 'E'; break;
  216.             case 15: digitTmp = 'F'; break;
  217.  
  218.             // najelegantnije od svih preostalih koji rade.
  219.             default:
  220.                 digitTmp = ostatak + '0';
  221.             break;
  222.         }
  223.  
  224.         /*
  225.          * Za one koji zele da vide kako radi ovaj while(num)
  226.          * Ispisuje jednu po jednu cifru... Radice dobro samo ako se
  227.          * koristi van neke druge funkcije, pozoves samu negdje npr.
  228.          */
  229.         #ifdef CURIOUS_MODE
  230.             UART0_PutString("Cifra: ");
  231.             UART0_PutChar(digitTmp);
  232.             UART0_PutChar('\n');
  233.             delay_ms(500);
  234.         #endif
  235.  
  236.         *(digits+digitCnt) = digitTmp;
  237.         digitCnt++;
  238.     }
  239.    
  240.     // u ovom trenutku imamo sve cifre, ali naopako poslagane. Obrcem.
  241.     for(i = 0; i < digitCnt / 2; i++) {
  242.                                                     // komentari za prvi prolaz petlje:
  243.         digitTmp = *(digits+i);                     // uzmem prvu cifru niza
  244.         /*
  245.          * -1 postoji da se odmaknem korak nazad
  246.          * od terminacionog karaktera
  247.          */
  248.         *(digits+i) = *(digits+digitCnt-1-i);       // na prvu stavim poslednju
  249.         *(digits+digitCnt-1-i) = digitTmp;          // na poslednju stavim prvu
  250.                                                     // i proces se ponavlja sa 2. i n-1, sa 3. i n-2 cifrom itd.
  251.     }  
  252.     // pravim string, dodajem terminacioni karakter na kraj.
  253.     *(digits+digitCnt) = '\0';
  254.     return digits;
  255. }
  256.  
  257. /*
  258.  * Integer proizvoljne duzine prebacuje u string.
  259.  * Nije trazeno u zadatku, ali sto da ne.
  260.  * Sto da ne? Sto da ne kolega...
  261.  */
  262. char* intToStr(int num, char *digits) {
  263.     // broj cifara
  264.     char digitCnt   = 0;
  265.     // pomocna cifra
  266.     char digitTmp;
  267.  
  268.     char i = 0;
  269.  
  270.     while(num) {
  271.         // +'0' prisiljava konverziju integera u char,
  272.         // kastovanje iz nekog razloga ne radi.
  273.         digitTmp = (num % 10)+'0';
  274.         num = num / 10;
  275.        
  276.         /*
  277.          * Za one koji zele da vide kako radi ovaj while(num)
  278.          * Ispisuje jednu po jednu cifru... Radice dobro samo ako se
  279.          * koristi van neke druge funkcije, pozoves samu negdje npr.
  280.          */
  281.         #ifdef CURIOUS_MODE
  282.             UART0_PutString("Cifra: ");
  283.             UART0_PutChar(digitTmp);
  284.             UART0_PutChar('\n');
  285.             delay_ms(500);
  286.         #endif
  287.        
  288.         *(digits+digitCnt) = digitTmp;
  289.         digitCnt++;
  290.     }
  291.  
  292.     // u ovom trenutku imamo sve cifre, ali naopako poslagane. Obrcem.
  293.     for(i = 0; i < digitCnt / 2; i++) {
  294.                                                     // komentari za prvi prolaz petlje:
  295.         digitTmp = *(digits+i);                     // uzmem prvu cifru niza
  296.         /*
  297.          * -1 postoji da se odmaknem korak nazad
  298.          * od terminacionog karaktera
  299.          */
  300.         *(digits+i) = *(digits+digitCnt-1-i);       // na prvu stavim poslednju
  301.         *(digits+digitCnt-1-i) = digitTmp;          // na poslednju stavim prvu
  302.                                                     // i proces se ponavlja sa 2. i n-1, sa 3. i n-2 cifrom itd.
  303.     }
  304.     // pravim string, dodajem terminacioni karakter na kraj.
  305.     *(digits+digitCnt) = '\0';
  306.     return digits;
  307. }
  308.  
  309.  
  310. void PORT_Init (void)
  311. {
  312.    //P2MDIN |= 0x0F;                // 4 najniza bita porta P2 -> digitalni
  313.    //P2MDOUT = 0x0C;                // Pinovi za LED -> push-pull izlazi
  314.  
  315.    // Crossbar inicijalizacija
  316.    //XBR1    = 0x40;                // Dozvola crossbar-a i slabih pull-up otpornika
  317. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement