milanmetal

[RSDMK] Bankomat, test II 2017 i 2018

May 8th, 2018
113
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 5.83 KB | None | 0 0
  1. #include <c8051f340.h>        
  2. #include "time.h"
  3. #include "uart.h"
  4.  
  5. // [RSDMK] Bankomat, test II 2017
  6.  
  7. #include "mojefje.h"
  8.  
  9. #include <stdio.h>
  10. #include <string.h>
  11.  
  12. void OSCILLATOR_Init (void);          
  13. void PORT_Init (void);
  14.  
  15. #define BR_KORISNIKA 5
  16.  
  17.  
  18. char code korisnici[BR_KORISNIKA][32] = {
  19.     "Milan\0",
  20.     "Kim Dzong Un\0",
  21.     "Bond. Dzejms Bond\0",
  22.     "Saban\n",
  23.     "Dino\0"
  24. };
  25.  
  26. char code PIN[BR_KORISNIKA][5] = {"1234\0", "5678\0", "3141\0", "2712\0", "0000\0"};
  27.  
  28. bit ispisano = 0;
  29. char imePrezime[32];
  30. char userID = 0;                // redni broj korisnika u nizu
  31.                                 // potrebno pri poredjenju pina
  32. char pinKod[5];
  33. char pinDuzinaUnosa = 0;
  34. char pinUnosGotov = 0;
  35.  
  36. char taster;
  37. char taster_prev;
  38.  
  39. bit jesteKorisnik = 0;
  40.  
  41.  
  42.  
  43. // znojimo preprocesor
  44. #define cekaj_prijem()          while(!UART0_Available())
  45. #define primljen_karakter()     UART0_Available() > 0
  46.  
  47. void main(void)
  48. {
  49.     int i = 0;
  50.  
  51.     PCA0MD &= ~0x40;    // Watchdog tajmer iskljucen
  52.  
  53.     OSCILLATOR_Init();  // Inicijalizacija oscilatora (Fosc = 22.1184 MHz)
  54.     TIME_Init();        // Inicijalizacija sistemskog vremena (koristi se prekid tajmera 2)
  55.     PORT_Init();        // Inicijalizacija portova
  56.     UART0_Init();       //startuje UART0
  57.  
  58.     while(1) {
  59.  
  60.         taster_prev = taster;
  61.         taster = Keypad_Scan();
  62.  
  63.         if(taster && (!taster_prev)) {
  64.             if(pinDuzinaUnosa < 4) {
  65.                 pinKod[pinDuzinaUnosa++] = taster;
  66.                 UART0_PutChar('*');
  67.             }
  68.  
  69.             pinKod[4] = '\0';
  70.  
  71.             if(taster == '#') {
  72.                 pinUnosGotov = 1;
  73.             }
  74.         }      
  75.  
  76.         if(!ispisano) {
  77.             UART0_PutString("Unesite ime i prezime:\n\0");
  78.             ispisano = 1;
  79.         }
  80.  
  81.         /*
  82.          * cekaj_prijem();  nema potrebe sada, a cak i ometa rad jer
  83.          * stalluje procesor dok ceka prijem  
  84.          * ----------------------------------------
  85.          * ako je primljen karakter, onda zadrzi 100ms u slucaju da ih ima jos
  86.          */
  87.         if(primljen_karakter()) {
  88.             delay_ms(100);
  89.             UART0_GetString(imePrezime);
  90.             ispisano = 0;       // ponovo dozovli ispis, za liniju ispod
  91.         }
  92.  
  93.         // ako je primljen podatak, ispis je dozvoljen ponovo
  94.         if(!ispisano) {
  95.             UART0_PutString("\nUnijeli ste: ");
  96.             UART0_PutString(imePrezime);
  97.             UART0_PutString("\n");
  98.  
  99.             //ispisano = 1;     // ne setujem sada jer zelim odmah i
  100.                                 // ispis informacije o statusu korisnika
  101.         }
  102.         /*
  103.             // strlen vraca duzinu stringa ne racunajuci \0. ali uracunava \n
  104.             // koji nastaje kada udaris enter u terminalu. Znaci -1 treba
  105.             // sve ovo pod uslovom da su setovani neki checkboxovi u terminalu
  106.             // koji omogucavaju da salje i te specijalne karaktere.
  107.            
  108.             // ovo ce za unos Milan ispisati 5 puta Milan.
  109.             for(i = 0; i < strlen(imePrezime) -1; i++) {
  110.                 UART0_PutString(imePrezime);   
  111.             }  
  112.         */
  113.  
  114.         if(!ispisano) {
  115.             if(checkUser(imePrezime, &userID)) {
  116.                 jesteKorisnik = 1;
  117.                 UART0_PutString(imePrezime);
  118.                 UART0_PutString(" jeste korisnik.\n");
  119.                
  120.                 /* Dio za unos PIN-a
  121.                  **/
  122.                 UART0_PutString("\t\nUnesite svoj PIN:\n");
  123.             } else {
  124.                 UART0_PutString(imePrezime);
  125.                 UART0_PutString(" nije korisnik.\n");
  126.             }
  127.         }
  128.  
  129.         // dozovli ispis poruke o tacnosti pina ukoliko je unesen
  130.         if(pinUnosGotov) {
  131.             ispisano = 0;
  132.         }  else ispisano = 1;
  133.  
  134.         if(!ispisano) {
  135.             if(strcmp(pinKod, PIN[userID]) == 0) {
  136.                 UART0_PutString("\n---- Unijeli ste ispravan PIN kod!\n"); 
  137.             } else {
  138.                 UART0_PutString("\n---- Unijeli ste pogresan PIN kod!\n"); 
  139.             }
  140.            
  141.             //pinUnosGotov = 0; // resetujes flag da ti ne ispisuje vise
  142.             resetujUnos();
  143.             ispisano = 1;  
  144.         }
  145.     }                    
  146.  }
  147.  
  148. void resetujUnos() {
  149.     pinUnosGotov = 0;   // resetujes flag da ti ne ispisuje vise
  150.     pinDuzinaUnosa = 0;
  151.  
  152.     // nema potrbe brisati buffer za pin, prepisivace preko starih unosa
  153.     // potrebno je samo resetovati broj unesenih karaktera
  154.        
  155. }
  156. char checkUser(char *name, char *user_id) {
  157.     char i = 0;
  158.  
  159.     /*
  160.      * da bi radilo ispravno poredjenje, u terminalu je potrebno iskljuciti
  161.      * dva checkboxa. To su: CR=CR+LF i +CR koji je pored SEND dugmeta.
  162.      * tada nece prenositi specijalne karaktere, kao npr /n kada udaris enter.
  163.      */
  164.     for(i = 0; i < BR_KORISNIKA; i++) {
  165.         if(strcmp(name, korisnici[i]) == 0) {
  166.             *user_id = i;                       // ovo je pozicija korisnika u nizu
  167.                                                 // na istoj poziciji se nalazi i njegov pin kod.
  168.             return 1;
  169.         }
  170.     }
  171.  
  172.     return 0;
  173. }
  174.  
  175. void PORT_Init (void)
  176. {
  177.    P2MDIN |= 0x0F;              // 4 najniza bita porta P2 -> digitalni
  178.    P2MDOUT = 0x0C;              // Pinovi za LED -> push-pull izlazi
  179.  
  180.    // Crossbar inicijalizacija
  181.    XBR1    = 0x40;              // Dozvola crossbar-a i slabih pull-up otpornika
  182. }
  183.  
  184.  
  185. char Keypad_Scan()
  186. {
  187.  unsigned char col;
  188.  XBR1 = 0x40; //dozvola crossbar-a i pull-up otpornika
  189.  P1MDOUT = 0x00; //svi pinovi su open-drain
  190.  for(col = 0x01; col != 0x10; col <<= 1)
  191.  {
  192.      P1MDIN = col | 0xf0; //nule u masci su HiZ pinovi
  193.      P1 = ~col; //adresiranje kolone
  194.      delay_ms(2);
  195.      //visi nibl predstavlja kolonu, a nizi stanja tastera:
  196.      switch((col << 4) | ((~P1) >> 4))
  197.      {
  198.          //prva kolona:
  199.          case 0x11:
  200.             return '1';
  201.          case 0x12:
  202.             return '2';
  203.          case 0x14:
  204.             return '3';
  205.          case 0x18:
  206.             return 'A';
  207.        
  208.          //druga kolona:
  209.          case 0x21:
  210.          return '4';
  211.          case 0x22:
  212.             return '5';
  213.          case 0x24:
  214.             return '6';
  215.          case 0x28:
  216.             return 'B';
  217.          //treca kolona:
  218.          case 0x41:
  219.             return '7';
  220.          case 0x42:
  221.             return '8';
  222.          case 0x44:
  223.             return '9';
  224.          case 0x48:
  225.             return 'C';
  226.          //cetvrta kolona:
  227.          case 0x81:
  228.             return '*';
  229.          case 0x82:
  230.             return '0';
  231.          case 0x84:
  232.             return '#';
  233.          case 0x88:
  234.             return 'D';
  235.      }
  236.  }
  237.  return 0; //nije detektovan nijedan taster
  238. }
Add Comment
Please, Sign In to add comment