milanmetal

[RSDMK] UART 3. Palindrom + strLen()

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