برنامه زیر به زبان سی و با 8051 برای یک پروژه قفل رمز نوشته شده است که در همین سایت فایل پروتئوس آن نیز وجود دارد . از دوستان خواهش میکنم کمکم کنند . من این برنامه را با فرانکلین اجرا میکنم تا فایل هگز بگیرم اما ارور های زیادی میده که نمیدونم از چیه ؟!!! اگه کسی میدونه خواهش میکنم کمکم کنه . در ضمن میخوام یه خط برنامه اضاف کنم به این برنامه به این صورت که هر وقت رمز صحیح وارد شده یکی از پورت ها موتور دی سی را که به آن وصل هست را روشن کند و در غیر اینصورت خیر .. بازم خواهش میکنم راهنماییم کنید . فرصت جندانی ندارم .. ممنونم
#include <AT89X51.H>
#define EE_SCL P1_0
#define EE_SDA P1_1
#define LCD_E P1_7
#define LCD_RW P1_6
#define LCD_RS P1_5
#define LCD_DATA P3
void cmnwrt(int);
void datawrt(char);
char keypad_refresh();
void init();
void delay(unsigned i);
void get_sntnc(char *);
void print_msg(char*,char);
void EE_write(unsigned int, char);
char EE_read(unsigned int);
void EE_strt();
void EE_stop();
char EE_shin();
void EE_shout(char);
//----------------------------------------
//----------------------------------------
int main(){
char tmp[17],i,j;
init();
cmnwrt(0x80);
while(1){
if(EE_read(0) != 'p' || EE_read(1) != '='
{
np: cmnwrt(1);
print_msg("Enter new pass:\0",0x80);
get_sntnc(tmp);
EE_write(0,'p'
;
EE_write(1,'='
;
for(i=0; tmp[i]; i++)
EE_write(i+2,tmp[i]);
EE_write(i+2,0);
}
rpa:
cmnwrt(1);
print_msg("Enter the pass:\0",0x80);
get_sntnc(tmp);
for(i=0,j=0;;i++){
if(tmp[i] != EE_read(i+2)){
j=-1;
break;
}
if(!tmp[i])
break;
}
cmnwrt(1);
if(j==-1){
//******************* Agar password eshtebah bood in dastoorat ejra beshe: ***************************************
print_msg("Pass is wrong!\0",0x80);
delay(1000);
goto rpa;
}
//******************* Agar password dorost bood in dastoorat ejra beshe: *****************************************
print_msg("Pass is right!\0",0x80);
delay(1000);
//******************* Hala az karbar soal mishe ke mikhad pass ro taghyeer bede ya na? ***************************
cmnwrt(1);
print_msg("*=change pass\0",0x80);
print_msg("#=back\0",0xc0);
ka:
do
i=keypad_refresh();
while(i==-1);
if(i==0x3a) //agar kelide * feshar dade shode:
goto np;
else if(i==0x3c) //agar kelide # feshar dade shode:
goto rpa;
else
goto ka;
}
}
//------------------------------------
//------------------------------------
void print_msg(char *msg, char line){
char i;
cmnwrt(line);
for(i=0; *(msg+i); i++)
datawrt(*(msg+i));
}
//------------------------------------
//------------------------------------
char keypad_refresh(){
char tmp,row,cl;
P2 = 0xf0;
if(!P2_4)
row = 0;
else if(!P2_5)
row = 1;
else if(!P2_6)
row = 2;
else if(!P2_7)
row = 3;
else
return -1;
P2 = 0xff;
P2 = 0x0f;
if(!P2_2)
cl = 0;
else if(!P2_1)
cl = 1;
else if(!P2_0)
cl = 2;
else
return -1;
tmp = row*3+cl+1;
if(tmp == 11)
tmp = 0;
return tmp|0x30;
}
//--------------------------------------------------
//--------------------------------------------------
void get_sntnc(char *str) {
char i,j,z;
for(i=0; i<17; i++)
*(str+i) = 0;
i=0;
while(1){
cmnwrt(0xc0);
for(z=0; z<16; z++)
if(*(str+z))
datawrt(*(str+z));
else
datawrt(' '
;
delay(70);
do
j = keypad_refresh();
while(j==-1);
if(j==0x3c){ //agar kelide # feshar dade shode:
*(str+i) = 0;
break;
}else if(j==0x3a){ //agar kelide * feshar dade shode:
if(i>0){
i--;
*(str+i) = 0;
}
}else{
if(i<=15){
*(str+i) = j;
i++;
}
}
}
}
//--------------------------------------------------
//--------------------------------------------------
void init() {
int i;
P0=P1=P2=P3=0;
//initialize LCD
LCD_RS = 0;
LCD_RW = 0;
delay(30);
cmnwrt(0x3f);
delay(20);
cmnwrt(0x3f);
delay(10);
cmnwrt(0x3f);
delay(5);
cmnwrt(0x38);
cmnwrt(0x01);
cmnwrt(0x0c);
//initialize EEPROM
EE_SDA = 1;
for (i=0; i<10; i++) {
EE_SCL = 1;
i=i; //delay
EE_SCL = 0;
}
}
//--------------------------------------------------
//--------------------------------------------------
void delay(unsigned i) {
TMOD = 1;
for (;i>0;i--) {
TH0 = 0xFc; //0xFFFF - 0xFc17 = 1000 (decimal) -> 1ms for 12MH crystal
TL0 = 0x17;
TR0 = 1;
while(!TF0);
TR0 = 0;
TF0 = 0;
}
}
//--------------------------------------------------
//--------------------------------------------------
void cmnwrt(int cmn) {
LCD_DATA = cmn;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 0;
delay(2);
}
void datawrt(char ch) {
LCD_DATA = ch;
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 0;
delay(2);
}
//---------------------------------------------------
//---------------------------------------------------
//Write into EEPROM
void EE_write(unsigned int addr, char dta){
char chtmp;
CY = 0;
EE_strt();
EE_shout(0xA0);
chtmp = addr>>8;
EE_shout(chtmp);
chtmp = addr;
EE_shout(chtmp);
EE_shout(dta);
EE_stop();
delay(13);
}
//Reading from EEPROM
char EE_read (unsigned int addr) {
char chtmp;
CY = 0;
EE_strt();
EE_shout(0xA0);
chtmp = addr>>8;
EE_shout(chtmp);
chtmp = addr;
EE_shout(chtmp);
EE_strt();
EE_shout(0xA1);
chtmp = EE_shin();
EE_stop();
return chtmp;
}
//Start
void EE_strt() {
EE_SDA = 1;
EE_SCL = 1;
EE_SDA = 0;
EE_SCL = 0;
}
//Stop
void EE_stop() {
EE_SCL = 0;
EE_SDA = 0;
EE_SCL = 1;
EE_SDA = 1;
}
//Shift out
void EE_shout(char sho) {
unsigned char i,j;
for (j=0, i=0; i<8; i++) {
j /= 2;
if (!j)
j=128;
if (sho&j)
CY = 1;
else
CY = 0;
EE_SDA = CY;
EE_SCL = 1;
j = j; //delay
EE_SCL = 0;
}
EE_SDA = 1;
EE_SCL = 1;
j=j; //delay
CY = EE_SDA;
EE_SCL = 0;
}
//Shift in
char EE_shin() {
char i,shi = 0;
EE_SDA = 1;
for (i=0; i<8; i++) {
CY = 10;
shi <<= 1;
EE_SCL = 1;
i=i;
CY = EE_SDA;
EE_SCL = 0;
if (CY)
shi++;
}
EE_SDA = 1;
EE_SCL = 1;
i=i; //delay
EE_SCL = 10;
return shi;
}
#include <AT89X51.H>
#define EE_SCL P1_0
#define EE_SDA P1_1
#define LCD_E P1_7
#define LCD_RW P1_6
#define LCD_RS P1_5
#define LCD_DATA P3
void cmnwrt(int);
void datawrt(char);
char keypad_refresh();
void init();
void delay(unsigned i);
void get_sntnc(char *);
void print_msg(char*,char);
void EE_write(unsigned int, char);
char EE_read(unsigned int);
void EE_strt();
void EE_stop();
char EE_shin();
void EE_shout(char);
//----------------------------------------
//----------------------------------------
int main(){
char tmp[17],i,j;
init();
cmnwrt(0x80);
while(1){
if(EE_read(0) != 'p' || EE_read(1) != '='
{np: cmnwrt(1);
print_msg("Enter new pass:\0",0x80);
get_sntnc(tmp);
EE_write(0,'p'
;EE_write(1,'='
;for(i=0; tmp[i]; i++)
EE_write(i+2,tmp[i]);
EE_write(i+2,0);
}
rpa:
cmnwrt(1);
print_msg("Enter the pass:\0",0x80);
get_sntnc(tmp);
for(i=0,j=0;;i++){
if(tmp[i] != EE_read(i+2)){
j=-1;
break;
}
if(!tmp[i])
break;
}
cmnwrt(1);
if(j==-1){
//******************* Agar password eshtebah bood in dastoorat ejra beshe: ***************************************
print_msg("Pass is wrong!\0",0x80);
delay(1000);
goto rpa;
}
//******************* Agar password dorost bood in dastoorat ejra beshe: *****************************************
print_msg("Pass is right!\0",0x80);
delay(1000);
//******************* Hala az karbar soal mishe ke mikhad pass ro taghyeer bede ya na? ***************************
cmnwrt(1);
print_msg("*=change pass\0",0x80);
print_msg("#=back\0",0xc0);
ka:
do
i=keypad_refresh();
while(i==-1);
if(i==0x3a) //agar kelide * feshar dade shode:
goto np;
else if(i==0x3c) //agar kelide # feshar dade shode:
goto rpa;
else
goto ka;
}
}
//------------------------------------
//------------------------------------
void print_msg(char *msg, char line){
char i;
cmnwrt(line);
for(i=0; *(msg+i); i++)
datawrt(*(msg+i));
}
//------------------------------------
//------------------------------------
char keypad_refresh(){
char tmp,row,cl;
P2 = 0xf0;
if(!P2_4)
row = 0;
else if(!P2_5)
row = 1;
else if(!P2_6)
row = 2;
else if(!P2_7)
row = 3;
else
return -1;
P2 = 0xff;
P2 = 0x0f;
if(!P2_2)
cl = 0;
else if(!P2_1)
cl = 1;
else if(!P2_0)
cl = 2;
else
return -1;
tmp = row*3+cl+1;
if(tmp == 11)
tmp = 0;
return tmp|0x30;
}
//--------------------------------------------------
//--------------------------------------------------
void get_sntnc(char *str) {
char i,j,z;
for(i=0; i<17; i++)
*(str+i) = 0;
i=0;
while(1){
cmnwrt(0xc0);
for(z=0; z<16; z++)
if(*(str+z))
datawrt(*(str+z));
else
datawrt(' '
;delay(70);
do
j = keypad_refresh();
while(j==-1);
if(j==0x3c){ //agar kelide # feshar dade shode:
*(str+i) = 0;
break;
}else if(j==0x3a){ //agar kelide * feshar dade shode:
if(i>0){
i--;
*(str+i) = 0;
}
}else{
if(i<=15){
*(str+i) = j;
i++;
}
}
}
}
//--------------------------------------------------
//--------------------------------------------------
void init() {
int i;
P0=P1=P2=P3=0;
//initialize LCD
LCD_RS = 0;
LCD_RW = 0;
delay(30);
cmnwrt(0x3f);
delay(20);
cmnwrt(0x3f);
delay(10);
cmnwrt(0x3f);
delay(5);
cmnwrt(0x38);
cmnwrt(0x01);
cmnwrt(0x0c);
//initialize EEPROM
EE_SDA = 1;
for (i=0; i<10; i++) {
EE_SCL = 1;
i=i; //delay
EE_SCL = 0;
}
}
//--------------------------------------------------
//--------------------------------------------------
void delay(unsigned i) {
TMOD = 1;
for (;i>0;i--) {
TH0 = 0xFc; //0xFFFF - 0xFc17 = 1000 (decimal) -> 1ms for 12MH crystal
TL0 = 0x17;
TR0 = 1;
while(!TF0);
TR0 = 0;
TF0 = 0;
}
}
//--------------------------------------------------
//--------------------------------------------------
void cmnwrt(int cmn) {
LCD_DATA = cmn;
LCD_RS = 0;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 0;
delay(2);
}
void datawrt(char ch) {
LCD_DATA = ch;
LCD_RS = 1;
LCD_RW = 0;
LCD_E = 1;
LCD_E = 0;
delay(2);
}
//---------------------------------------------------
//---------------------------------------------------
//Write into EEPROM
void EE_write(unsigned int addr, char dta){
char chtmp;
CY = 0;
EE_strt();
EE_shout(0xA0);
chtmp = addr>>8;
EE_shout(chtmp);
chtmp = addr;
EE_shout(chtmp);
EE_shout(dta);
EE_stop();
delay(13);
}
//Reading from EEPROM
char EE_read (unsigned int addr) {
char chtmp;
CY = 0;
EE_strt();
EE_shout(0xA0);
chtmp = addr>>8;
EE_shout(chtmp);
chtmp = addr;
EE_shout(chtmp);
EE_strt();
EE_shout(0xA1);
chtmp = EE_shin();
EE_stop();
return chtmp;
}
//Start
void EE_strt() {
EE_SDA = 1;
EE_SCL = 1;
EE_SDA = 0;
EE_SCL = 0;
}
//Stop
void EE_stop() {
EE_SCL = 0;
EE_SDA = 0;
EE_SCL = 1;
EE_SDA = 1;
}
//Shift out
void EE_shout(char sho) {
unsigned char i,j;
for (j=0, i=0; i<8; i++) {
j /= 2;
if (!j)
j=128;
if (sho&j)
CY = 1;
else
CY = 0;
EE_SDA = CY;
EE_SCL = 1;
j = j; //delay
EE_SCL = 0;
}
EE_SDA = 1;
EE_SCL = 1;
j=j; //delay
CY = EE_SDA;
EE_SCL = 0;
}
//Shift in
char EE_shin() {
char i,shi = 0;
EE_SDA = 1;
for (i=0; i<8; i++) {
CY = 10;
shi <<= 1;
EE_SCL = 1;
i=i;
CY = EE_SDA;
EE_SCL = 0;
if (CY)
shi++;
}
EE_SDA = 1;
EE_SCL = 1;
i=i; //delay
EE_SCL = 10;
return shi;
}


دیدگاه