Evo neka verzija blizu konačne...
Code:
char keypadPort at PORTD; //inicijalizacija za keypad 4x4
char keypadPort_Direction at DDRD;
sbit LCD_RS at PORTA2_bit; //inicijalizacija za LCD displej
sbit LCD_EN at PORTA3_bit;
sbit LCD_D4 at PORTA4_bit;
sbit LCD_D5 at PORTA5_bit;
sbit LCD_D6 at PORTA6_bit;
sbit LCD_D7 at PORTA7_bit;
sbit LCD_RS_Direction at DDA2_bit;
sbit LCD_EN_Direction at DDA3_bit;
sbit LCD_D4_Direction at DDA4_bit;
sbit LCD_D5_Direction at DDA5_bit;
sbit LCD_D6_Direction at DDA6_bit;
sbit LCD_D7_Direction at DDA7_bit;
char PIN[4], UPIN[4], PUK[8], UPUK[8], p, e; //inicijalizacija promenjivih
unsigned short int k=0,znak=0, BNP=0, BNP2=0;
int Broj(unsigned short int k){ // f-ja koja vraca vrednost unetu sa tastature
switch (k) {
case 1: p = '1'; break; // koju vrednost vraca keypad 4x3
case 2: p = '2'; break;
case 3: p = '3'; break;
case 5: p = '4'; break;
case 6: p = '5'; break;
case 7: p = '6'; break;
case 9: p = '7'; break;
case 10: p = '8'; break;
case 11: p = '9'; break;
case 14: p = '0'; break;
}
return p;
}
void main(){
DDRA=255;
DDRD=0;
Keypad_init();
Lcd_Init();
PIN[0]='1'; //postavljanje PIN-a
PIN[1]='9';
PIN[2]='0';
PIN[3]='5';
PUK[0]='1';
PUK[1]='1';
PUK[2]='1';
PUK[3]='1';
PUK[4]='1';
PUK[5]='1';
PUK[6]='1';
PUK[7]='1';
znak=0;
e=EEPROM_Read(0x00); //ucitavanje podataka sa EEPROM-a
if(e=0xFF){ //ukoliko je EEPROM prazan
EEPROM_Write(0x00, BNP);
EEPROM_Write(0x01, BNP2);
}
BNP=EEPROM_Read(0x00);
BNP=EEPROM_Read(0x00);
while(1){
if(BNP<3){ //ukoliko je br neuspesnih pokusaja unosa PIN-a manji od 3
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
Lcd_Out(1,6,"PIN:");
while(k<4){ //unos PIN-a
znak = Keypad_Key_Press(); //promeljivoj znak dodeljuje se vrednost koju vraca f-ja Keypad_Key_Press()
Broj(znak); //f-ja koja transformise vrednost unetu sa tastature u realnu vrednost
while(znak!=0){ //unos PIN-a
UPIN[k]=p;
Lcd_Chr(2, k+1,'*');
delay_ms(400);
znak=0;
k++;
}
}
if(k==4){ // unesen poslednji deo PIN-a
k=0; //postavlja se brojac na nulu
while(1){ //beskonacna petlja
if(PIN[0]==UPIN[0] &&
PIN[1]==UPIN[1] &&
PIN[2]==UPIN[2] &&
PIN[3]==UPIN[3]){ // provera PIN-a sa UPIN-om
Lcd_Cmd(_LCD_CLEAR);
while(1){
LCD_Out(1, 2, "PIN prihvacen"); // Ukoliko se PIN i UPIN poklapaju ispisuje se poruka na displeju
LCD_Out(2, 3, "DOBRODOSLI");
delay_ms(3000);
}
}
else{ // ukoliko je PIN pogresan
Lcd_Cmd(_LCD_CLEAR);
LCD_Out(1, 1, "Pogresan PIN");
LCD_Out(2, 1, "Pokusajte ponovo");
delay_ms(3000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
BNP++;
EEPROM_Write(0x00, BNP);
}
break;
}
} //eof if(k==4)
} //eof if(BNP<3)
else if(BNP2<9){
Lcd_Out(1,6,"PUK:");
while(k<8){
znak = Keypad_Key_Press(); //promeljivoj znak dodeljuje se vrednost koju vraca f-ja Keypad_Key_Press()
Broj(znak); //f-ja koja transformise vrednost unetu sa tastature u realnu vrednost
while(znak!=0){ //unos PIN-a
UPUK[k]=p;
Lcd_Chr(2, k+1,'*');
delay_ms(400);
znak=0;
k++;
}
}
if(k==8){ // unesen poslednji deo PIN-a
k=0;
while(1){
if(PUK[0]==UPUK[0] &&
PUK[1]==UPUK[1] &&
PUK[2]==UPUK[2] &&
PUK[3]==UPUK[3] &&
PUK[4]==UPUK[4] &&
PUK[5]==UPUK[5] &&
PUK[6]==UPUK[6] &&
PUK[7]==UPUK[7]) { // provera PUK-a sa UPUK-om
Lcd_Cmd(_LCD_CLEAR);
while(1){
LCD_Out(1, 2, "PUK prihvacen");
LCD_Out(2, 3, "DOBRODOSLI");
delay_ms(3000);
}
}
else{ // pogresan unos PUK-a
Lcd_Cmd(_LCD_CLEAR);
LCD_Out(1, 1, "Pogresan PUK");
if(BNP2<8) LCD_Out(2, 1, "Pokusajte ponovo");
delay_ms(2000);
Lcd_Cmd(_LCD_CLEAR);
Lcd_Cmd(_LCD_CURSOR_OFF);
BNP2++;
EEPROM_Write(0x01, BNP2);
}
break;
}
}
} //eof else if
else if(BNP2==9){
Lcd_Cmd(_LCD_CLEAR);
while(1){
LCD_Out(1, 2, "Pogresan PUK");
LCD_Out(2, 1, "KARTICA BLOKIRANA");
}
}
} //eof while(1)
} //eof void main()
Prihvatio sam sugestioje, malo preuredio itd.
E sad mi se javlja jedan problem koji ne znam kako da ga resim, mozda sam ga i ranije pominjao.
Dakle, ploča nije moja, da kazem da je za javnu upotrebu, znaci na njoj i drugi razvijaju projekte itd. Tu se javlja moj problem zbog EEPROM-a (dakle EEPROM moram da koristim jer je jedini vid stalne memorije na ploči EASYAVR5 koju koristimo). Moj program bi trebalo da radi ako se uzme pretpostavka da je EEPROM prazan, dakle ili da pre toga nije korišćen ili da je bačen pod UV lampu. Pošto je mala mogućnost tako nečemu, ne znam ako da napravim da on može da radi i ako je npr na 0x00 upisano br 415 od ranijeg korišćenja. :/