yaikkss... mukang saLA PALA answer ko... medyo mahaba ang code mo...
bale nirevise ko yan...
ito sureness na... i explain briefly for you
void code_enter(void)
{
while(1)
{
unsigned char key;
i=0;
scanned_key = scan_keypad();
decoded_key = decode_key(scanned_key);
display_key(decoded_key);
code1 = decoded_key;
i++;
}
}
1. what kind of loop is code above?finite loop or infinite loop...
--->ayun infinite loop nga. ibig sabihin nyan ay natrap na ang execution sa code_enter procedure at hindi na babalik kahit kelan sa main procedure...ang dahilan nyan ay while(1). wala kang condition para makaalis ng loop... try mo nga ito kung gagana....
ito ang revise version
#include<pic.h>
#include <htc.h> // Required to interface with delay routines
#ifndef _XTAL_FREQ
// Unless already defined assume 4MHz system frequency
// This definition is required to calibrate __delay_us() and __delay_ms()
#define _XTAL_FREQ 4000000
#endif
__CONFIG(XT & WDTDIS & LVPDIS & UNPROTECT);
int i=0,j,m=0;
unsigned char code1[10] ,user1[4];
unsigned char scanned_key = 0x00;
unsigned char decoded_key = 0x00;
void init_LED(void)
{
PORTB = 0xF0;
TRISB = 0xF0;
}
void init_KEYPAD(void)
{
TRISD = 0x70; //PORTD<6:4> input, COLUMNS
TRISD = ~0x0F; //PORTD<3:0> output, ROWS
PORTD = 0b00001111; //PORTD<3:0> initially high
}
unsigned char decode_key(unsigned char val)
{
unsigned char key;
switch(val)
{
case 0x60: //0
key = 0x01;
break;
case 0x50: //1
key = 0x02;
break;
case 0x30: //2
key = 0x03;
break;
case 0x61: //3
key = 0x04;
break;
case 0x51: //4
key = 0x05;
break;
case 0x31: //5
key = 0x06;
break;
case 0x62: //6
key = 0x07;
break;
case 0x52: //7
key = 0x08;
break;
case 0x32: //8
key = 0x09;
break;
case 0x63: //9
key = 0x0A;
break;
case 0x53: //10
key = 0x0B;
break;
case 0x33: //11
key = 0x0C;
break;
default:
key = decoded_key;
break;
}
return key;
}
void display_key(unsigned char key)
{
PORTB = key;
}
unsigned char scan_keypad()
{
unsigned char val_1 = 0x00;
unsigned char val_2 = 0x00;
unsigned char count1;
for(count1=0;count1 < 4;count1++)
{
PORTD = ~(0x01 << count1); //scan row
__delay_ms(35);
val_1 = PORTD & 0x70; //read column, RD<6:4>
//while clearing RD<7> &
//RD<3:0>
if (val_1 != 0x70) //if a column is pressed
{
val_2 = (val_1 | count1); //column (high-nibble) and count (low-nibble)
return val_2; //return value
}
}
return 0xFF; //return any value
}
void code_enter(void)
{
i=0; //on the first character of code1 has been position... reading of value of code[0]
while(decoded!=0x0a) //if the enter button is not press then wait for input, else stop looping and return to main...
{
scanned_key = scan_keypad();
decoded_key = decode_key(scanned_key);
code1
= display_key; //store one character/number of code to their designated array index..
display_key(decoded_key); //display nga ba ito hehehe di ko alam ang gamit nito eh?
i++;
}
}
void code_read(void) //Read data from EEPROM
{
__delay_ms(20);
user1[0] = eeprom_read(0x00); // Read data from address 0
__delay_ms(20);
user1[1] = eeprom_read(0x01); // Read data from address 2
__delay_ms(20);
user1[2] = eeprom_read(0x02); // Read data from address 4
__delay_ms(20);
user1[3] = eeprom_read(0x03); // Read data from address 8
__delay_ms(20);
}
void code_write(void) //Write data from EEPROM
{
__delay_ms(20);
eeprom_write(0x00,code1[1]); // Write some data at address 00
__delay_ms(20);
eeprom_write(0x01,code1[2]); // Write some data at address 02
__delay_ms(20);
eeprom_write(0x02,code1[3]); // Write some data at address 04
__delay_ms(20);
eeprom_write(0x03,code1[4]); // Write some data at address 08
}
void change_code(void)
{
i=1;
code_enter();
code_write();
code_read();
}
void main()
{
ADCON1 = 0x07; // Configure AN pins as digital
TRISA = 0x00; // set direction to be output
RA0 =1;
init_KEYPAD();
init_LED(); // Initialize Keypad
code_read();
//If no code is stored then default is 1234
if(user1[0] == 0xFF && user1[1] == 0xFF && user1[2] == 0xFF && user1[3] == 0xFF )
{
eeprom_write(0x00,1); // Write some data at address 00
__delay_ms(20);
eeprom_write(0x01,2); // Write some data at address 02
__delay_ms(20);
eeprom_write(0x02,3); // Write some data at address 04
__delay_ms(20);
eeprom_write(0x03,4); // Write some data at address 08
}
code_read();
__delay_ms(100);
do
{
i = 0;
code_enter();
if((code1[4] == 0x0A) || code1[4]==0x0C) //if i push enter key/change code key after the 4-digit password...so the enter key/change code key must be located at code1[4]
{
if(code1[0] == 1 && code1[1] == 2 && code1[2] == 3 && code1[3] == 4)
{
if(code1[4] == 0x0C)
{change_code();}
if(code1[4]==0x0a)
{RA0=0;}
}
if(code1[0] == user1[0] && code1[1] == user1[1] && code1[2] == user1[2] && code1[3] == user1[3] )//compare code with store one
{
if(code1[4] == 0x0C)
{change_code();}
if(code1[4] == 0x0A)
{RA0 =0;
__delay_ms(50);}
}
else
{RA0=1;}
}
}
while(1);
}
hope na gumana.... kasakit naman sa ulo ung code mo....