PURS_seminar

Dependents:   TipkovnicaZadnje

Embed: (wiki syntax)

« Back to documentation index

Show/hide line numbers KEY_PAD.cpp Source File

KEY_PAD.cpp

00001 #include "mbed.h"
00002 #include "KEY_PAD.h"
00003 #include "TextLCD.h"
00004 
00005 volatile int row=0;
00006 volatile int col=0;
00007 volatile int key=0;
00008 volatile int step=0;
00009 volatile int code=0;
00010 volatile int pass_code=0;
00011 
00012 KEY_PAD::KEY_PAD(PinName stupac3Pin, PinName stupac2Pin, PinName stupac1Pin, PinName red4Pin, PinName red3Pin, PinName red2Pin, PinName red1Pin) : stupac3(stupac3Pin), stupac2(stupac2Pin), stupac1(stupac1Pin), red4(red4Pin), red3(red3Pin), red2(red2Pin), red1(red1Pin) {
00013     init();
00014 }
00015 
00016 void KEY_PAD::init() {
00017     
00018     stupci.mode(OpenDrain);
00019     stupci.mode(PullUp);
00020     
00021     red1.mode(PullUp);
00022     red2.mode(PullUp);
00023     red3.mode(PullUp);
00024     red4.mode(PullUp);
00025     
00026     red1.fall(this, &get_row1);
00027     red2.fall(this, &get_row2);
00028     red3.fall(this, &get_row3);
00029     red4.fall(this, &get_row4);
00030 }
00031 void KEY_PAD::make_num(){
00032     switch(step){
00033         case(0):
00034             code=code+key*100;
00035             step++;
00036         break;
00037         
00038         case(1):
00039             code=code+key*10;
00040             step++;
00041         break;
00042         
00043         case(2):
00044             code=code+key;
00045             step++;
00046         break;
00047         
00048         case(3):
00049             step++;
00050         break;
00051         
00052         case(4):
00053             step=0;
00054             code=0;
00055         break;
00056     }
00057 }
00058 
00059 void KEY_PAD::make_code(){
00060     switch(key){
00061         case(1):
00062             make_num();
00063         break;
00064         
00065         case(2):
00066             make_num();
00067         break;
00068         
00069         case(3):
00070             make_num();
00071         break;
00072         
00073         case(4):
00074             make_num();
00075         break;
00076         
00077         case(5):
00078             make_num();
00079         break;
00080         
00081         case(6):
00082             make_num();
00083         break;
00084         
00085         case(7):
00086             make_num();
00087         break;
00088         
00089         case(8):
00090             make_num();
00091         break;
00092         
00093         case(9):
00094             make_num();
00095         break;
00096         
00097         case(10):
00098             step=0;
00099             code=0;
00100         break;
00101         
00102         case(11):
00103             pass_code=0;
00104             code=0;
00105             step=0;
00106         break;
00107         
00108         case(12):
00109             step=0;
00110             if(code==123 || code==456 || code==789){
00111                 pass_code=code;
00112                 code=0;
00113             }
00114             else{
00115                 step=0;
00116                 code=0;
00117                 lcd.locate(0,3);
00118                 lcd.printf("Pogresna lozinka");             
00119             }
00120                 //pogresna lozinka
00121         break;
00122     }
00123 }
00124 
00125 
00126 /////////////////////////////////////////////////
00127 
00128 void KEY_PAD::shift(){
00129         stupci = stupci<<1;
00130         
00131         stupci = stupci & 0b00000111;
00132         
00133         wait_ms(2);
00134 }
00135 
00136 void KEY_PAD::get_key(){
00137   int table[4][3]{{1, 2, 3},
00138                   {4, 5, 6},
00139                   {7, 8, 9},
00140                   {10, 11, 12}};
00141     
00142     key=table[row-1][col-1];
00143     
00144     row=0;
00145     col=0;
00146     
00147     make_code();
00148 }
00149 
00150 void KEY_PAD::get_row1(){
00151     red1.fall(NULL);
00152     red2.fall(NULL);
00153     red3.fall(NULL);
00154     red4.fall(NULL);
00155     
00156     row=1;
00157     stupci=1;
00158     
00159     wait_ms(1);
00160     
00161     for(int i=1; i<=3; i++){
00162         if(red1!=0){
00163             col=i;
00164             break;
00165         }
00166         shift();
00167     }
00168     get_key();
00169     stupci=0;
00170 }
00171 
00172 void KEY_PAD::get_row2(){
00173     red1.fall(NULL);
00174     red2.fall(NULL);
00175     red3.fall(NULL);
00176     red4.fall(NULL);
00177     
00178     row=2;
00179     stupci=1;
00180     
00181     wait_ms(1);
00182     
00183     for(int i=1; i<=3; i++){
00184         if(red2!=0 && i!=3){
00185             col=i;
00186             break;
00187         }
00188         if(i==3){
00189             col=3;
00190             break;
00191         }
00192         shift();
00193     }
00194     get_key();
00195     stupci=0;
00196 }
00197 
00198 void KEY_PAD::get_row3(){
00199     red1.fall(NULL);
00200     red2.fall(NULL);
00201     red3.fall(NULL);
00202     red4.fall(NULL);
00203     
00204     row=3;
00205     stupci=1;
00206     
00207     wait_ms(1);
00208     
00209     for(int i=1; i<=3; i++){
00210         if(red3!=0 && i!=3){
00211             col=i;
00212             break;
00213         }
00214         if(i==3){
00215             col=3;
00216             break;
00217         }
00218         shift();
00219     }
00220     get_key();
00221     stupci=0;
00222 }
00223 
00224 void KEY_PAD::get_row4(){
00225     red1.fall(NULL);
00226     red2.fall(NULL);
00227     red3.fall(NULL);
00228     red4.fall(NULL);
00229     
00230     row=4;
00231     stupci=1;
00232     
00233     wait_ms(1);
00234     
00235     for(int i=1; i<=3; i++){
00236         if(red4!=0 && i!=3){
00237             col=i;
00238             break;
00239         }
00240         if(i==3){
00241             col=3;
00242             break;
00243         }
00244         shift();
00245     }
00246     get_key();
00247     stupci=0;
00248 }