First, I must say that I know very few things about programming a microcontroller in C, but I would like to learn.
The following program is not written by me, but I have to write a similiar one (when I press 4 keys from a mini keyboard with 12 keys it activates a cylinder lock who will remain open for a certain amount of time) . In order to do this, I have to understand how this program works (this program is written for a keyboard with 16 keys).
If is somebody among you who knows how to program a microcontroller in C, and has enough patience to explain the program listed(I'm reffering to every line of code), I would really appreciate it.
Code:#pragma chip PIC16F84, core 14, code 1024, ram 12 : 0x4F mapped_into_bank_1 #define INT_min_style #pragma config_def 0x0111 /* registers from bank 1*/ #pragma char TMR0 @ 0x1 #pragma char PCL0 @ 0x2 #pragma char STATUS0 @ 0x3 #pragma char FSR0 @ 0x4 #pragma char PORTA @ 0x5 #pragma char PORTB @ 0x6 #pragma char EEDATA @ 0x8 #pragma char EEADR @ 0x9 #pragma char PCLAT0 @ 0x0A /* registers from bank 2*/ #pragma char OPTION @ 0x81 #pragma char PCL1 @ 0x82 #pragma char STATUS1 @ 0x83 #pragma char FSR1 @ 0x84 #pragma char TRISA @ 0x85 #pragma char TRISB @ 0x86 #pragma char EECON1 @ 0x88 #pragma char EECON2 @ 0x89 #pragma char PCLATH1 @ 0x8A /*define bits port B*/ #pragma bit RB4 @ 6.4 #pragma bit RB5 @ 6.5 #pragma bit RB6 @ 6.6 #pragma bit RB7 @ 6.7 /*define signals for LED-s, buzz, sensor,cylinder lock and selection*/ #pragma bit SUPER_LED @ 5.3 #pragma bit POWER_LED @ 5.4 #pragma bit FULL_LED @ 6.0 #pragma bit OPEN_LED @ 6.1 #pragma bit SOUND_SIG @ 5.0 #pragma bit YALE_SIG @ 5.1 #pragma bit SENZOR_SIG @ 5.2 #pragma bit SEL0 @ 6.2 #pragma bit SEL1 @ 6.3 /*functions definitions for turning ON/OFF LED-S*/ #define SUPER_LED_ON output_low(SUPER_LED) #define SUPER_LED_OFF output_high(SUPER_LED) #define POWER_LED_ON output_low(POWER_LED) #define POWER_LED_OFF output_high(POWER_LED) #define FULL_LED_ON output_low(FULL_LED) #define FULL_LED_OFF output_high(FULL_LED) #define OPEN_LED_ON output_low(OPEN_LED) #define OPEN_LED_OFF output_high(OPEN_LED) /*functions definitions for activation/deactivation signal commands) #define SOUND_SIG_ON output_high(SOUND_SIG) #define SOUND_SIG_OFF output_low(SOUND_SIG) #define YALE_SIG_ON output_high(YALE_SIG) #define YALE_SIG_OFF output_low(YALE_SIG) /*signals selection for activation of a column*/ #define COL1 (output_low(SEL0);output_low(SEL1);) #define COL2 (output_low(SEL0);output_high(SEL1);) #define COL3 (output_high(SEL0);output_low(SEL1);) #define COL4 (output_high(SEL0);output_high(SEL1);) /*read signals from the keyboard line*/ #define LINE1 (!input(RB7)) #define LINE2 (!input(RB6)) #define LINE3 (!input(RB5)) #define LINE4 (!input(RB4)) #define SENSOR_READ (input(SENSOR_SIG)) /*sensor: 1- door open; 0- door close */ /*set direction ports PIC: 1 - enter; 0 - exit*/ #define TRISB_VAL 0b00000000 #define TRISA_VAL 0b00000000 /*structure of the control register for interuptions*/ struct ( short int RBIF; short int INTF; short int TOIF; short int RBIE; short int INTE; short int TOIE; short int PEIE; short int GIE; ) INTCON; #define byte INTCON = 0x0B /*******************************yale.c**********************************/ #include "16F84.h" #fuses HS,NOWDT, NOPROTECT, PUT #use DELAY(clock=10000000) #use fast_io(A) #use fast_io(B) int StareInt; int NrCodes; void SleepInterrupt() { int code; if(!LINE4) StareInt=3; /*if LINE4 is not active, button # hasn't been pressed and goes into sleep again*/ else { INTCON.RBIF=0; POWER_LED_ON; COL1; code=ReadCode(); if(cod==-1) StareInt=3; /*Cancel*/ else StareInt=VerifyCode(code); } return; } int ReadCodeMem(int index) { int adr=index*2, vall,valh; valh=read_EEPROM(adr); vall=read_EEPROM(adr+1); return valh*256+vall; } void WriteCodeMem(int index, int val) { int valh, vall, adr; adr=index * 2; vall=val / 256; valh=val % 256; write_EEPROM(adr, valh); write_EEPROM(adr+1,vall); } int VerifyCode(int code) { int i; if(ReadCodeMem(0)==code || ReadCodeMem(1)==cod) return 1; /*supervisor*/ for(i=2;i<16;i++) if(ReadCodeMem(i)==code) return 2; /*user*/ return 0; } void InitSleep() { POWER_LED_OFF; COL1; INTCON.RBIF=1; /*keyboard interrupt active*/ StareInt=-1; Sleep(); } int ReadKey() { /*it activates the columns one by one and tests the lines*/ COL1; if(LINE1) return 1; /*1*/ if(LINE2) return 2; /*2*/ if(LINE3) return 3; /*3*/ if(LINE4) return 4; /*SUPER*/ COL2; if(LINE1) return 5; /*4*/ if(LINE2) return 6; /*5*/ if(LINE3) return 7; /*6*/ if(LINE4) return 8; /*NEW*/ COL3; if(LINE1) return 9; /*7*/ if(LINE2) return 10; /*8*/ if(LINE3) return 11; /*9*/ if(LINE4) return 12; /*DELETE*/ COL4; if(LINE1) return 13; /*#*/ if(LINE2) return 14; /*0*/ if(LINE3) return 15; /*EXIT*/ if(LINE4) return 16; /*CANCEL*/ return 0; int IsKey() { if(( key >=1 && key <=3) || (key>=5 && key<=7) || (key>=9 && key<=11) || key==14) return 1; return 0; } void Beep(int time) { SOUND_SIG_ON; delay_ms(time); SOUND_SIG_OFF; } int ReadCode() { int NrCifre=4; int key=0; int t,time; int Result=0; /*DIV_64: 25.6 uSec per tic, 6.5536 mSec to roll over setup_counters(RTCC_INTERNAL,RTCC_DIV_64); */ do{ set_rtcc(0); /*start counting*/ key=0; time=153*3; do { key=ReadKey(); t=get_rtcc(); if(t==0) time--; }while (key && time) /*reads until a key is pressed or time expires*/ if(key!=0) { if (IsKey(key)) { Result=Result*10+key; } else if(key==16) return -1; /*Cancel*/ else { Beep(100); NrCifre++; } NrCifre--; } else return -1; }while (NrCifre); return Result; } void OpenDoor() { int t, time; YALE_SIG_ON; /*door open*/ OPEN_LED_ON; /*LED ON - the door is open*/ Beep(300); /*sound signal*/ set_rtcc(0); /*start counting*/ key=0; time=153*10; /*door remains unlock for 10 seconds*/ do { t=get_rtcc(); if( t==0 ) time--; }while (SENSOR_READ && time) /*reads until a person open the door or time expires*/ if(time) /*a person opened the door*/ { time=153*300; /*after 30 seconds - beeps*/ do { t=get_rtcc(); if(t==0) time--; }while(SENSOR_READ && time); /*reads until a person close the door or time expires*/ if(!time) /*time expires*/ { while(!SENSOR_READ) { Beep(100); /*beeps until door is closed*/ }/*door closed*/ }/*door must be closed*/ YALE_SIG_OFF; OPEN_LED_OFF; Beep(200); } void Edit(); { int t, key, counter, state; SUPER_LED_ON; do { set_rtcc(0); counter=153*10; /*waiting time 10 seconds*/ if(NrCodes==30) FULL_LED_ON; else FULL_LED_OFF; do { key=ReadKey(); t=get_rtcc(); if(t==0) counter--; }while(!key && counter); /*until a key is pressed or time expires*/ if (counter) { if(key) { switch(key) { case 8 : /*NEW*/ if(NrCodes=30) Beep(200); else { key=ReadCode(); /*reads a code*/ if(key != -1) state=VerifyCode(key); if(state!=0) Beep(200); else { counter=153*3; set_rtcc(); do { state=ReadKey(); t=get_rtcc(0); if(t==0) counter--; }while(!state && counter); if(state!=4 !counter) { NrCodes++; for (t=2; t<=31 && ReadCodeMem(t) !=0; t++) if(t!=32) WriteCodeMem(t,key); } else if(state==4) { if(ReadCodeMem(0)==-1) WriteCodeMem(0,key); else if(ReadCodeMem(1)==-1) WriteCodeMem(1,key); } Beep(300); } } break; /*NEW*/ case 12: /*Del*/ if (NrCodes>0) key=ReadKey(); /*read code*/ if (key!=-1) state=VerifyCode(); if (state==0) Beep(200); /*code dosn't exist*/ else { if(state==2) /*a user is deleted*/ { for(t=2; t<=31 && ReadCodeMem(t) != key; t++); WriteCodeMem(t,0); /*user t deleted*/ NrCodes--; } else { if(ReadCodeMem(0)==key && ReadCodeMem(1)!=-1) WriteCodeMem(0,0); else if(ReadCodeMem(1)==key && ReadCodeMem(0)!=-1) WriteCodeMem(1,0); } } Beep(300); break; case 16: Beep(100); break; /*Cancel*/ } } } }while(key!=15 && counter); /*Exit*/ Beep(300); SUPER_LED_OFF; FULL_LED_OFF; } void main { int time,t,key; set_trisa(TRISA_VAL); set_trisb(TRISB_VAL); WriteCodeMem(0,1234); /*initial code for first suprvisor*/ for(t=1; t<=31; t++) WriteCodeMem(t,0); NrCodes=0; InitSleep(); StateInt=-1; while(1) { switch (StateInt) { case 3 : Beep(300); /*Cancel*/ case 2 : OpenDoor(); break; /*user*/ case 1 : set_rtcc(0); /*supervisor*/ time=153*3; do { key=ReadKey(); t=get_rtcc(); if(t==0) time--; }while(key && time); /*read untile a key is pressed or time expires*/ if (time && key==4) /*SUPER is pressed*/ OpenDoor(); else if(!time) /*goes into EDIT mode*/ Edit(); else Beep(200); break; } InitSleep(); } }



LinkBack URL
About LinkBacks
), I would really appreciate it.


