📄 readermodule.c.bak
字号:
/*****************************************************************************************************
This is the source code for keypad reader
******************************************************************************************************/
#include <REG52.H>
#include <stdio.h> /* prototype declarations for I/O functions */
sbit P00 = P0^0;
sbit P01 = P0^1;
sbit P02 = P0^2;
sbit P03 = P0^3;
sbit P04 = P0^4;
sbit P05 = P0^5;
sbit P06 = P0^6;
sbit P07 = P0^7;
sbit PUSHBUTTON = P2^0;//P1^0;
sbit BUZZER = P1^0;//P1^1;
sbit LED0 = P1^2;
sbit LED_GREEN = P1^4;//P1^3;
//sbit LED_RED = P1^2;//P1^4;
sbit DOORSENSOR = P2^1;//P2^0;
sbit TAMPER = P2^4;//P2^1;
sbit DOORRELAY = P2^2;
sbit ALARMRELAY = P2^3;
sbit LED3 = P2^7;
sbit EXT = P3^2;
sbit SDA = P3^7;
sbit SCL = P3^6;
sbit SHD = P3^3;//P3^0;
#define RELAY_ON 0
#define RELAY_OFF 1
#define LED_ON 0
#define LED_OFF 1
#define SLEEP 1
#define WAKEUP 0
#define BUZZ_CNT 50
#define ON 1
#define OFF 0
#define HIGH 1
#define LOW 0
#define MAXCARDCHAR 10
#define CLOCKINTERVAL 25
#define CARDTIMELIMIT 20//22 kk changed 14/4/06 sort of too insensitive
#define MAXKEYCHAR 10
#define O_CARDnPIN 0x01 // Normal Card Mode 0x01 = 0
#define O_AUTOPIN 0x02 // 1 -> On
#define O_LOCKOUT 0x04 // 1 -> LockOut
#define O_SECURITYOFF 0x08 // 1 -> off
#define O_ARM 0x10 // 1 -> Arm
#define O_CARD 0x20 //CARD
#define O_CARDorPIN 0x22
//#define E_RELEASE 0x01
//#define E_FACCODE 0x02
//#define E_PIN 0x04
#define MAX_LOCK_RELEASE_TIME 0x60 // second
#define MAX_DOOR_OPEN_TIME 0x99 // second
#define MAX_SOUNDER_TIME 0x30 // minute
#define high_byte(x) ((x & 0xFF00) >> 8)// Get high byte macro
#define MAX_PINNO 10
#define MAX_CARD_ADD 4028 //5027-jah
#define EEPROM_LAST_BYTE 9//4032
#define TIMER0CNT 0x56;
#define START_CARD_ADD 32
#define TESTING
void put_c(unsigned char buf);
void beep (unsigned char duration);
void longtos (char* ddata, unsigned long *tno);
void beepbeep (unsigned char count);
void ClearBuzz(void);
void process_button(void);
void process_led(void);
void process_buzzer(void);
void initmcu(void);
void ResetUserEvent (void);
void I2C_Start(void);
void I2C_Stop(void);
char I2C_Write(unsigned char byte);
unsigned char I2C_Read(void);
//void ACK(void);
void NAK(void);
char write_eeprom_bytes(unsigned int add, unsigned char dataout);
unsigned char get_eeprom_bytes (unsigned int add);
//char write_block(unsigned char page, unsigned char *dataout, char count);
unsigned char get_eeprom_bytes1 (void);
void InitDB(void);
void WriteSysDB(void);
void GetSysDB (void);
void ClearUserDB(void);
unsigned char InstallThisCard(void);
unsigned char DeleteThisCard (void);
unsigned char FindThisCard(void);
void Process_Input(void);
void flush_keypad(void);
void turn_relay_on (void);
void ReloadKeyTimeOut (void);
char write_block(unsigned int startadd, unsigned char *dataout, char count); //12/15/2005 9:24PM
void RestoreCardPos(void);
//void ProcessUserEvent(void);
//void checkcollision(void);
//variable for process_buzzer
#define BUZZCOUNTER 90 //10
idata char buzzer_type=0;
idata unsigned char buzz_duration;
idata unsigned int buzz_counter;
//variables for card
idata unsigned int cardpos=0;
unsigned int cardpos_last; //12/18/2005 9:43PM
idata unsigned char lockoutcount=0;
//idata unsigned char comsinbuffer;
idata unsigned char ledcount0=0;
char ColdStartCheck=1,tempi;
unsigned char door_relay_duration;
idata unsigned char dooropentime;
//unsigned char EmptyFlag
/*==============================================================================
KEYPAD READER REALATED VARIABLES
================================================================================*/
struct TOperationFlag
{
unsigned gnewcard : 1;
unsigned WaitingKey : 1;
unsigned DoorOpen : 1;
unsigned doorwasopened : 1;
unsigned char EmptySign; //12/19/2005 10:43PM
} ;
idata struct TOperationFlag Flags;
struct DHeader
{
unsigned char OperationMode;
unsigned char MasterPin [3];
unsigned char AutoPin [MAX_PINNO][2];
unsigned char DoorOpenTime;
unsigned char LockReleaseTime;
};
idata struct DHeader SystemDatabase;
typedef struct
{
char CardNo [3];
char Lockcount;
}TCardRec;
TCardRec gcrec;
unsigned char ch=0,bit_keyhold=0,key_count,button_state=1,KeyChar [MAXKEYCHAR];
unsigned int keytimeout;
unsigned char idata secdly;
/*********************************************************************************
MENU RELATED VARIABLES
*********************************************************************************/
unsigned char MainMenuItem;
unsigned char SubMenuItem;
/*=============================================================================
CARD RELATED VARIABLES
=============================================================================*/
unsigned int clock_isr_counter1 = 0,rdr=0;
unsigned char card_exist=0, cardbitBufer[10],previousstate,anticollision=0;
unsigned char cardtime =18,bitcount=0,cbitcount=0,nibin=0,parity=0,bytecount=0;
unsigned char cardbytein[MAXCARDCHAR+2],CardDataIn=0,startpattern=0,columnparity=0;
//unsigned int cpin; //12/4/2005 10:34AM
//unsigned int dpin; //12/4/2005 10:34AM
/**************************************************************************************
MEMORY RELATED VARIABLES
**************************************************************************************/
char idata temp_masterpin1[3],temp_masterpin2[3],masterpinCount=0;
/*
data signal 75clock
<------->;If data signal interval exceeded 70clocks then refer to previousstate
___ ___ ___ ______ ______
| | | | | | | |
|___| |___| |___| |______|
<---> <---------->
32clock 96clock
<----->
<------> 50clock ; for every 50clock after falling interval of data signal, record the previousstate
64clock
Remarks:Data read in upon falling edge detection
*/
void timer0_ISR (void) interrupt 1 //interrupt every 200us -- 25clock cycles
{
if(++clock_isr_counter1 == 3)//(50/CLOCKINTERVAL) ) //equivalent to 2
previousstate=EXT;
else if(clock_isr_counter1==250)
{
clock_isr_counter1=0;
TR0=0;
}
TH0 = 0xff;//(65536 - 146) / 256;
TL0 = TIMER0CNT;//-123;//(65536 - 146) % 256;
}
/******************************************************************************
Interrupt 1, INT1-not using here
*******************************************************************************/
void ex1_isr (void) interrupt 2
{
}
/***********************************************************************************
Timer 2 overflow interrupt at 0.039s
byte start from 4, as the cardbytein contain start byte
**********************************************************************************/
unsigned char xorbit;
void timer2_overflow(void) interrupt 5
{
TF2 = 0; /* Clear the interrupt request */
secdly++;
if(++ledcount0>=40) //35
{
ledcount0=0;
LED0^=1;
if(Flags.DoorOpen)
{
xorbit^=1;
if(xorbit)
BUZZER=1;
else
BUZZER=0;
//BUZZER^=1;
put_c('X');
}
}
cardtime++;
/*
if(cardtime++ >CARDTIMELIMIT )
cardtime=CARDTIMELIMIT; //jah
*/
if (keytimeout>1) keytimeout--; //leave 1 for keytimeout to be detected and deduct
} //at checkkeytimeout()
/****************************************************************************************************
External interrupt 0
Take care of the DEMOD_IN input from the EM4095
*****************************************************************************************************/
void ex0_isr (void) interrupt 0//void ex1_isr (void) interrupt 2
{
cardtime = 0; //11/19/2005 4:21PM removed to prevent some noise signal IN
TR0=0;
TH0 = 0xff;
TL0 = TIMER0CNT;
TR0=1;
if(!anticollision) //kk 21/10/05
{
if(clock_isr_counter1 >= 4) //600us ;phase change in data format
{
//P02^=1;
if((previousstate==HIGH)||(clock_isr_counter1>=6))//7//(100/CLOCKINTERVAL)))//change state from 1 to 0, read in 1 follow by 0
{
nibin |= 0x01;
cbitcount++;
bitcount++;
nibin = nibin <<1;
parity++;
if ((cbitcount <=60) && (cbitcount >=11))
{
if (bitcount == 5)
{
if(parity & 0x01) //odd parity
{
cardbytein[bytecount++]= (~(nibin>>2)) & 0x0f;
if (bytecount>=MAXCARDCHAR)
{
cardbytein[bytecount+1]=0;
CardDataIn = 1;
anticollision =1; //kk 21/10/05
cardtime = 18;
SHD=SLEEP; //11/28/2005 9:05PM
}
}
else
{
cbitcount = 0;
startpattern=0;
rdr=0; //redetect upon state change of 1 to 0
}
bitcount = 0; //after every 5 bits reset bit count
nibin = 0; //after every 5 bits reset nibin
parity = 0;
}
nibin &= 0xfe;
cbitcount++;
bitcount++;
nibin = nibin <<1;
ch=0;
}
else if(cbitcount >=61)
{
if (bitcount == 5) //after 1 bit shifted, bit count up to 5
{ //take care of the 0 bit left behind!!
if(1)//!ch) //stop bit
{
cbitcount = 0;
//CardDataIn = 1;
rdr = 0;
columnparity = nibin&0x0f;
cardtime = 18;
startpattern = 0;
bytecount=0;
bitcount = 0; //reset all parameter, search for the
nibin = 0; //correct start pattern
}
}
else
{
cbitcount++;
bitcount++;
nibin &= 0xfe;
nibin = nibin <<1;
ch=0; //subsequent data will decoded as 0
}
}
else //especially for start pattern detection
{
if(startpattern<9)//if(!startpattern)
{
startpattern=1;
rdr=1;
cbitcount=1;
}
cbitcount++;
bitcount++;
nibin &= 0xfe;
nibin = nibin <<1;
ch=0; //subsequent data will decoded as 0
}
}
else //change state from 0 to 1, read in 1
{
if(rdr) //start all data decoding upon the possible of start pattern detection
{
if(cbitcount<10) //change state before start pattern detected
{
bitcount = 0; //reset all parameter, search for the
nibin = 0; //correct start pattern
cbitcount = 0;
parity = 0;
startpattern=0;
rdr=0;
}
else
{
nibin |= 0x01;
bitcount++;
cbitcount++;
nibin = nibin << 1; //shift data 1 to buffer
ch=1; //subsequent signal will decoded as 1
parity++;
}
}
}
}
else //in normal data cycle
{
if(rdr) //once a 1 to 0 state change was detected, enable
{ //subsequent incoming data
if(!ch) //9/10/2005 10:09AM // data 0
{
if(cbitcount<=10)
startpattern++;
nibin &= 0xfe;
}
else //if(ch)//(ch==1)-9/4/2005 10:48PM
{
nibin |= 0x01; //data 1
parity++;
}
bitcount++;
cbitcount++;
nibin = nibin << 1;
nibin &= 0x3f; //If bitcount count up to five then 00xx xxxx
}
}
if (cbitcount==10) //after 9 bits received -included 1 high from interchange state
{
if(startpattern == 9) //but not all 0(count from 1)
{
}
else
{
cbitcount = 0;
startpattern=0;
rdr=0; //redetect upon state change of 1 to 0
}
bytecount=0;
bitcount = 0; //reset all parameter, search for the
nibin = 0; //correct start pattern
parity = 0;
}
else if ((cbitcount <=60) && (cbitcount >=11))
{
if (bitcount == 5)
{
if(parity & 0x01) //odd parity
{
cardbytein[bytecount++]= (~(nibin>>2)) & 0x0f;
if (bytecount>=MAXCARDCHAR)
{
cardbytein[bytecount+1]=0;
CardDataIn = 1;
anticollision=1; //kk 21/10/05
cardtime = 18;
SHD=SLEEP; //11/28/2005 9:05PM
}
}
else
{
cbitcount = 0;
startpattern=0;
rdr=0; //redetect upon state change of 1 to 0
}
bitcount = 0; //reset all parameter, search for the
nibin = 0; //correct start pattern
parity =0;
}
}
else if(cbitcount >=61)
{
if (bitcount == 5)
{
if(1)//!ch) //stop bit
{
cbitcount = 0;
//CardDataIn = 1;
rdr = 0;
columnparity = nibin&0x0f;
cardtime = 18;
bytecount=0;
startpattern = 0;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -