Advertisement
milanmetal

[RSDMK] strLen + intToStr

Apr 22nd, 2018
135
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.46 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.  /*
  15.   * Niz u kome se cuvaju cifre brojeva koji se konvertuju
  16.   * u sringove kako bi se mogli ispisivati.
  17.   */
  18. char cifre[8];
  19.  
  20. // enable flag za ispis uvodne poruke
  21. bit ispisano = 0;
  22.  
  23. int i = 0;
  24.  
  25. char prijem[64];
  26.  
  27. void OSCILLATOR_Init (void);          
  28. void PORT_Init (void);
  29.  
  30. void main(void)
  31. {
  32.     OSCILLATOR_Init();  // Inicijalizacija oscilatora (Fosc = 22.1184 MHz)
  33.     TIME_Init();        // Inicijalizacija sistemskog vremena (koristi se prekid tajmera 2)
  34.     PORT_Init();        // Inicijalizacija portova
  35.  
  36.     UART0_Init();
  37.  
  38.     while (1)
  39.     {
  40.         if(!ispisano) {
  41.             UART0_PutString("Unesite tekst za provjeru: \n");
  42.             ispisano = 1;
  43.         }
  44.  
  45.         cekaj_prijem();
  46.  
  47.         if(primljen_karakter()) {
  48.             delay_ms(100);
  49.             UART0_GetString(prijem);
  50.         }
  51.  
  52.         UART0_PutString("Unijeli ste: ");
  53.         UART0_PutString(prijem);
  54.         UART0_PutString("\n\n");
  55.  
  56.         UART0_PutString("Duzina unosa je: ");
  57.         // + 0 vrsi konverziju char tipa u integer.
  58.         UART0_PutString(intToStr(strLen(prijem) + 0, cifre));
  59.         UART0_PutString("\n\n");  
  60.        
  61.         // pretvaram broj string cifara kako bih ga ispisao.
  62.         intToStr(12345, cifre);
  63.  
  64.         UART0_PutString("Uneseni broj kao string: ");
  65.         UART0_PutString(cifre);
  66.         UART0_PutString("\n\n");
  67.            
  68.         /* --- */
  69.  
  70.  
  71.         /* --- */
  72.  
  73.         // dozvoli ponovni ispis pocetne poruke
  74.         ispisano = 0;
  75.  
  76.     }                            
  77.  }
  78.  
  79. char strLen(char *str) {
  80.     char len = 0;
  81.     while(*str) {
  82.         len++;
  83.         str++;
  84.     }
  85.     // Ovaj -1 je kompenzacija za '\0' character
  86.     return len - 1;
  87. }
  88.  
  89. /*
  90.  * Integer proizvoljne duzine prebacuje u string.
  91.  * Nije trazeno u zadatku, ali sto da ne.
  92.  * Sto da ne? Sto da ne kolega...
  93.  */
  94. char* intToStr(int num, char *digits) {
  95.     // broj cifara
  96.     char digitCnt   = 0;
  97.     // pomocna cifra
  98.     char digitTmp;
  99.  
  100.     char i = 0;
  101.  
  102.     while(num) {
  103.         // +'0' prisiljava konverziju integera u char,
  104.         // kastovanje iz nekog razloga ne radi.
  105.         digitTmp = (num % 10)+'0';
  106.         num = num / 10;
  107.        
  108.         /*
  109.          * Za one koji zele da vide kako radi ovaj while(num)
  110.          * Ispisuje jednu po jednu cifru... Radice dobro samo ako se
  111.          * koristi van neke druge funkcije, pozoves samu negdje npr.
  112.          */
  113.         #ifdef CURIOUS_MODE
  114.             UART0_PutString("Cifra: ");
  115.             UART0_PutChar(digitTmp);
  116.             UART0_PutChar('\n');
  117.             delay_ms(500);
  118.         #endif
  119.        
  120.         *(digits+digitCnt) = digitTmp;
  121.         digitCnt++;
  122.     }
  123.  
  124.     // u ovom trenutku imamo sve cifre, ali naopako poslagane. Obrcem.
  125.     for(i = 0; i < digitCnt / 2; i++) {
  126.                                                     // komentari za prvi prolaz petlje:
  127.         digitTmp = *(digits+i);                     // uzmem prvu cifru niza
  128.         /*
  129.          * -1 postoji da se odmaknem korak nazad
  130.          * od terminacionog karaktera
  131.          */
  132.         *(digits+i) = *(digits+digitCnt-1-i);       // na prvu stavim poslednju
  133.         *(digits+digitCnt-1-i) = digitTmp;          // na poslednju stavim prvu
  134.                                                     // i proces se ponavlja sa 2. i n-1, sa 3. i n-2 cifrom itd.
  135.     }
  136.     // pravim string, dodajem terminacioni karakter na kraj.
  137.     *(digits+digitCnt) = '\0';
  138.     return digits;
  139. }
  140.  
  141.  
  142. void PORT_Init (void)
  143. {
  144.    //P2MDIN |= 0x0F;                // 4 najniza bita porta P2 -> digitalni
  145.    //P2MDOUT = 0x0C;                // Pinovi za LED -> push-pull izlazi
  146.  
  147.    // Crossbar inicijalizacija
  148.    //XBR1    = 0x40;                // Dozvola crossbar-a i slabih pull-up otpornika
  149. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement