Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <c8051f340.h>
- #include "time.h"
- #include "uart.h"
- // [RSDMK] Bankomat, test II 2017
- #include "mojefje.h"
- #include <stdio.h>
- #include <string.h>
- void OSCILLATOR_Init (void);
- void PORT_Init (void);
- #define BR_KORISNIKA 5
- char code korisnici[BR_KORISNIKA][32] = {
- "Milan\0",
- "Kim Dzong Un\0",
- "Bond. Dzejms Bond\0",
- "Saban\n",
- "Dino\0"
- };
- char code PIN[BR_KORISNIKA][5] = {"1234\0", "5678\0", "3141\0", "2712\0", "0000\0"};
- bit ispisano = 0;
- char imePrezime[32];
- char userID = 0; // redni broj korisnika u nizu
- // potrebno pri poredjenju pina
- char pinKod[5];
- char pinDuzinaUnosa = 0;
- char pinUnosGotov = 0;
- char taster;
- char taster_prev;
- bit jesteKorisnik = 0;
- // znojimo preprocesor
- #define cekaj_prijem() while(!UART0_Available())
- #define primljen_karakter() UART0_Available() > 0
- void main(void)
- {
- int i = 0;
- PCA0MD &= ~0x40; // Watchdog tajmer iskljucen
- OSCILLATOR_Init(); // Inicijalizacija oscilatora (Fosc = 22.1184 MHz)
- TIME_Init(); // Inicijalizacija sistemskog vremena (koristi se prekid tajmera 2)
- PORT_Init(); // Inicijalizacija portova
- UART0_Init(); //startuje UART0
- while(1) {
- taster_prev = taster;
- taster = Keypad_Scan();
- if(taster && (!taster_prev)) {
- if(pinDuzinaUnosa < 4) {
- pinKod[pinDuzinaUnosa++] = taster;
- UART0_PutChar('*');
- }
- pinKod[4] = '\0';
- if(taster == '#') {
- pinUnosGotov = 1;
- }
- }
- if(!ispisano) {
- UART0_PutString("Unesite ime i prezime:\n\0");
- ispisano = 1;
- }
- /*
- * cekaj_prijem(); nema potrebe sada, a cak i ometa rad jer
- * stalluje procesor dok ceka prijem
- * ----------------------------------------
- * ako je primljen karakter, onda zadrzi 100ms u slucaju da ih ima jos
- */
- if(primljen_karakter()) {
- delay_ms(100);
- UART0_GetString(imePrezime);
- ispisano = 0; // ponovo dozovli ispis, za liniju ispod
- }
- // ako je primljen podatak, ispis je dozvoljen ponovo
- if(!ispisano) {
- UART0_PutString("\nUnijeli ste: ");
- UART0_PutString(imePrezime);
- UART0_PutString("\n");
- //ispisano = 1; // ne setujem sada jer zelim odmah i
- // ispis informacije o statusu korisnika
- }
- /*
- // strlen vraca duzinu stringa ne racunajuci \0. ali uracunava \n
- // koji nastaje kada udaris enter u terminalu. Znaci -1 treba
- // sve ovo pod uslovom da su setovani neki checkboxovi u terminalu
- // koji omogucavaju da salje i te specijalne karaktere.
- // ovo ce za unos Milan ispisati 5 puta Milan.
- for(i = 0; i < strlen(imePrezime) -1; i++) {
- UART0_PutString(imePrezime);
- }
- */
- if(!ispisano) {
- if(checkUser(imePrezime, &userID)) {
- jesteKorisnik = 1;
- UART0_PutString(imePrezime);
- UART0_PutString(" jeste korisnik.\n");
- /* Dio za unos PIN-a
- **/
- UART0_PutString("\t\nUnesite svoj PIN:\n");
- } else {
- UART0_PutString(imePrezime);
- UART0_PutString(" nije korisnik.\n");
- }
- }
- // dozovli ispis poruke o tacnosti pina ukoliko je unesen
- if(pinUnosGotov) {
- ispisano = 0;
- } else ispisano = 1;
- if(!ispisano) {
- if(strcmp(pinKod, PIN[userID]) == 0) {
- UART0_PutString("\n---- Unijeli ste ispravan PIN kod!\n");
- } else {
- UART0_PutString("\n---- Unijeli ste pogresan PIN kod!\n");
- }
- //pinUnosGotov = 0; // resetujes flag da ti ne ispisuje vise
- resetujUnos();
- ispisano = 1;
- }
- }
- }
- void resetujUnos() {
- pinUnosGotov = 0; // resetujes flag da ti ne ispisuje vise
- pinDuzinaUnosa = 0;
- // nema potrbe brisati buffer za pin, prepisivace preko starih unosa
- // potrebno je samo resetovati broj unesenih karaktera
- }
- char checkUser(char *name, char *user_id) {
- char i = 0;
- /*
- * da bi radilo ispravno poredjenje, u terminalu je potrebno iskljuciti
- * dva checkboxa. To su: CR=CR+LF i +CR koji je pored SEND dugmeta.
- * tada nece prenositi specijalne karaktere, kao npr /n kada udaris enter.
- */
- for(i = 0; i < BR_KORISNIKA; i++) {
- if(strcmp(name, korisnici[i]) == 0) {
- *user_id = i; // ovo je pozicija korisnika u nizu
- // na istoj poziciji se nalazi i njegov pin kod.
- return 1;
- }
- }
- return 0;
- }
- void PORT_Init (void)
- {
- P2MDIN |= 0x0F; // 4 najniza bita porta P2 -> digitalni
- P2MDOUT = 0x0C; // Pinovi za LED -> push-pull izlazi
- // Crossbar inicijalizacija
- XBR1 = 0x40; // Dozvola crossbar-a i slabih pull-up otpornika
- }
- char Keypad_Scan()
- {
- unsigned char col;
- XBR1 = 0x40; //dozvola crossbar-a i pull-up otpornika
- P1MDOUT = 0x00; //svi pinovi su open-drain
- for(col = 0x01; col != 0x10; col <<= 1)
- {
- P1MDIN = col | 0xf0; //nule u masci su HiZ pinovi
- P1 = ~col; //adresiranje kolone
- delay_ms(2);
- //visi nibl predstavlja kolonu, a nizi stanja tastera:
- switch((col << 4) | ((~P1) >> 4))
- {
- //prva kolona:
- case 0x11:
- return '1';
- case 0x12:
- return '2';
- case 0x14:
- return '3';
- case 0x18:
- return 'A';
- //druga kolona:
- case 0x21:
- return '4';
- case 0x22:
- return '5';
- case 0x24:
- return '6';
- case 0x28:
- return 'B';
- //treca kolona:
- case 0x41:
- return '7';
- case 0x42:
- return '8';
- case 0x44:
- return '9';
- case 0x48:
- return 'C';
- //cetvrta kolona:
- case 0x81:
- return '*';
- case 0x82:
- return '0';
- case 0x84:
- return '#';
- case 0x88:
- return 'D';
- }
- }
- return 0; //nije detektovan nijedan taster
- }
Add Comment
Please, Sign In to add comment