📄 reader.c
字号:
des_offset[1]=cmd_buffer[5];
des_offset[2]=cmd_buffer[6];
des_read_len=cmd_buffer[7];
deskey_address=key_buffer+cmd_buffer[8]*32;
read_Flash(deskey_address,select_key,17);
// des_key_no=select_key[16];
//des_key_index=u_ram.host.RxBuffer[15];
//=======================================================================
read_Flash(S_WIEGAND_MODE,&u_ram.host.RxBuffer[0],10);
if (u_ram.host.RxBuffer[4] != 0x55 ||u_ram.host.RxBuffer[5] != 0xAA)
{
Initialwiegand(); //初始化wiegand 配置
}
else
{
wiegand_mode = u_ram.host.RxBuffer[0]; //WIEGAND输出格式
wiegand_block = u_ram.host.RxBuffer[1]; //读MIFARE块号
wiegand_requst = u_ram.host.RxBuffer[2]; //请求模式
weigandFlag = u_ram.host.RxBuffer[3]; //IO 输出模式
//u_ram.host.RxBuffer[4]; //0x55
//u_ram.host.RxBuffer[5]; //0xaa
key_outmode = u_ram.host.RxBuffer[6]; //key mode
csn_outmode = u_ram.host.RxBuffer[7]; //csn mode
iso15693block = u_ram.host.RxBuffer[8];
}
//=======================================================================
Wei_D0=HIGH;
Wei_D1=HIGH;
CP =HIGH;
// WDTD=0x87; WDTC=0x1F; //set watchdog timer,3s
DecodeFlag=0;
DlyforWiegand = 0;
while(1)
{
// for(i=0;i<8;i++)
// card_buffer[i]=i;
// WDTD=0x87;
// WDTC=0x1F; //Reset watchdog timer
if(DecodeFlag)
{
SEQ=u_ram.host.RxBuffer[0];
if ((SlaveADR==u_ram.host.RxBuffer[1])||(u_ram.host.RxBuffer[1]==0)) //设备地址判断
funtions();
DecodeFlag=0;
} /*end of check DecodeFlag*/
if(weigandFlag & 0x10)
{
weigand();
key_bcdweigand();
}
else KeyBuffer_Manage();
} /*forever loop */
} // End Main BLock
// 键盘缓冲区管理
void KeyBuffer_Manage(void)
{
unsigned char temp,i;
temp=getkey();
if (temp!=0)
{
// for (i=0;i<35;i++)
for (i=0;i<10;i++)
KeyBuffer[i]=KeyBuffer[i+1];
// KeyBuffer[34]=temp;
KeyBuffer[9]=temp;
LCD_PWR=ON;
Buzzer = ON;
delay_1ms(200);
Buzzer = OFF;
}
delay_1ms(3);
}
/*
void KeyBuffer_Manage(void)
{
unsigned char i;
key_temp=getkey();
if(key_temp!=0)
{
SecondCNT_t1=0;
LCD_PWR=ON;
if(key_temp=='*')
{
for (i=0;i<35;i++)
KeyBuffer[i]=0;
key_i=0;
}
else if(key_temp=='#')
{
if(key_i>0)
{
SendNumber(key_i,KeyBuffer);
for (i=0;i<35;i++)
KeyBuffer[i]=0;
key_i=0;
}
}
else
{
KeyBuffer[key_i]=key_temp;
key_i++;
if(key_i>35)
key_i=0;
}
//Display_Flag=1;
if(csn_outmode&0x04)
{
Buzzer = ON;
delay_1ms(200);
Buzzer = OFF;
}
}
delay_1ms(3);
}
*/
void getkeys(void)
{
unsigned char i,l;
// for (i=0;i<35;i++)
for (i=0;i<10;i++)
{
if (KeyBuffer[i]!=0) break;
}
// l=35-i;
l=10-i;
TxOut(l,0,&KeyBuffer[i]);
// for (i=0;i<35;i++)
for (i=0;i<10;i++)
KeyBuffer[i]=0;
}
void Initial(void)
{
unsigned char i;
AUXR = 0x01;
P1 = 0xFF;
Buzzer= ON;
LED_R = OFF;
LED_G = ON;
// P4=P4&0xF7;
P4=P4|0x08;
IE = 0 ;
IP = 0x11;
IE = 0x9A;
// TH0 = 0x3c;
// TL0 = 0x60; //20ms
TH0 = 0x28;
TL0 = 0x00; //20ms
// IT0 = 1; /*Falling edge active */
// IT1 = 1; /*Falling edge active */
TR0 = 1;
TL1=0;
TH1=1;
TR1=1;
TxFlag1 = 0;
// for (i=0;i<35;i++)
for (i=0;i<10;i++)
KeyBuffer[i]=0;
XICON=0x50;
PX3=1;
}
//-------------------------------------------------------------------------------------------------------
// This function for setting baud rate generate
// Parameter 9600bps=96 19200bps=192 38400bps=384 57600bps=576 115200bps=1152
//-------------------------------------------------------------------------------------------------------
void InitialUART(unsigned char baudRate)
{
int BaudRate;
switch(baudRate)
{
case 1:BaudRate=96;
break;
case 2:BaudRate=192;
break;
case 3:BaudRate=384;
break;
case 4:BaudRate=576;
break;
default:BaudRate=1152;
}
SCON = 0X50; /*Serial mode : 8 data 1 start bit & 1 stop bit */
TMOD = 0X01; /* Timer 0 set to 16 bits timer */
RCAP2H=0xFF;
RCAP2L=256-(6912/BaudRate*6/2); //22.1184 MHz/32=691200 for 12 clock
T2CON=0x34; //Set baud rate generate auto reload from timer 2
RS485=0;
}
void Initialwiegand (void)
{
u_ram.host.RxBuffer[0] = s_weigand_26;
wiegand_mode = s_weigand_26;
u_ram.host.RxBuffer[1] = 0;
wiegand_block = 0;
u_ram.host.RxBuffer[2] = R_idle;
wiegand_requst = R_idle;
u_ram.host.RxBuffer[3] = 0X13;
weigandFlag = 0X13;
u_ram.host.RxBuffer[4] = 0x55;
u_ram.host.RxBuffer[5] = 0xaa;
u_ram.host.RxBuffer[6] = 0; //key out format
key_outmode = 1;
u_ram.host.RxBuffer[7] = 0X06; //csn direct
csn_outmode = 0X06;
u_ram.host.RxBuffer[8] = 0XFF; //r
iso15693block = 0XFF;
u_ram.host.RxBuffer[9] = 0; //r
write_Flash(S_WIEGAND_MODE,&u_ram.host.RxBuffer[0],10);
}
//--------------------------------------------------------------------------------------------------------
//22.1184MHz delay 20ms TH0= x70 TL0=00 1sec= 50 interrups
void Timer0(void) interrupt 1 using 1
{
TH0=0X28;
delay_times++;
if (delay_times==2)
{
delay_times=0;
}
else return;
//weigand 超时处理
if (wtimeoutw)
{
wtimeoutw--;
TW_flag=0;
}
else
{
TW_flag=1;
int0bitptr=0;
}
//------------------Start of check receiver time out
if(!DecodeFlag)
{
if(Rec_Status) //The Rec_Status != 0 in received mode then check byte time out
{
Regetrc500EEPROMTimeOut--;
if(Regetrc500EEPROMTimeOut==0)Rec_Status=0; //if time out error then reset Rec_Status to re_synchronous
}
}
//------------------End of check receiver time out
if(TxFlag)
{
Regetrc500EEPROMTimeOut--;
if(Regetrc500EEPROMTimeOut==0)
{
ETX_Pointer=0;
STX_Pointer=0;
}
}
if (DlyforWiegand) DlyforWiegand--;
SecondCNT++;
switch(SecondCNT)//***********************Start SecondCNT switch decode
{
case 50 :
SecondCNT=0; // One second
// CheckTimeOutIO(); // Now to check I/O ports time out
if(RedLED_Flag) //**************Start red LED routine
{
LED_R=ON; //ON Red LED
if(NumPeriodLED_R != 0xFF)
{
if(NumPeriodLED_R == 0)
{
RedLED_Flag=0;
LED_R=OFF; //OFF red LED
}
NumPeriodLED_R--;
}
} //**************************End of red LED routine
if(GreenLED_Flag) //**************Start green LED routine
{
LED_G=ON; //ON green LED
if(NumPeriodLED_G != 0xFF)
{
if(NumPeriodLED_G == 0)
{
GreenLED_Flag=0;
LED_G=OFF; //OFF green LED
}
NumPeriodLED_G--;
}
} //**************************End of green LED routine
case 5 : case 10 :
case 15 : case 20 :
case 25 : case 30 :
case 35 : case 40 :
case 45 :
if(BuzFlag)
{
Buz_CNT++;
switch(Buz_Step)
{
case 0:
if(Buz_CNT >=Buz_T1)
{
Buzzer=OFF;Buz_Step=1; //OFF
Buz_CNT=0x00;
}
else Buzzer=ON; //ON
break;
case 1://OFF Status
if(Buz_CNT >=Buz_T2)
{
Buz_CNT=0xFF;Buz_Step=2;
if(Buz_T3)Buzzer=ON; //ON
}
break;
case 2://ON status
if(Buz_CNT >=Buz_T3)
{
Buzzer=OFF; Buz_Step=3; //OFF
Buz_CNT=0xFF;
}
else Buzzer=ON; //ON
break;
case 3:
if(Buz_CNT >=Buz_T4)
{
Buzzer=OFF; Buz_Step=0; //OFF
Buz_CNT=0xFF;
Buz_Period--;
if(Buz_Period == 0x00) BuzFlag=0;
}
} //end of switch Buz_Step
} //end of if BuzFlag
} //*************************End of SecondCNT switch decode
if(RedLED_Flag && (SecondCNT == DutyTimeLED_R))LED_R=OFF; //OFF LED
if(GreenLED_Flag && (SecondCNT == DutyTimeLED_G))LED_G=OFF; //OFF LED
}
//22.1184MHz delay 25ms (19456)TH1= x70 TL0=00 1sec= 50 interrups
void Timer1(void) interrupt 3 using 2
{
// WDTD=0x87;
// WDTC=0x1F; //Reset watchdog timer
// TMOD = 0x11;
// IE=0x98;
TH1=00;
TL1=00;
SecondCNT_t1++;
C_ext_CNT--;
if(C_ext_CNT==0)
{
if(C_ExtFlag==1)
{
// P4=P4&0xF7;
P4=P4|0x08;
}
}
if(SecondCNT_t1>2000)
{
LCD_PWR=OFF;
if (Display_Flag)
{
DisplayLcd(cls,16,0x00);
DisplayLcd(display1,16,0x00);
DisplayLcd(cls,16,0x40);
DisplayLcd(display4,16,0x40);
Display_Flag=0;
}
}
}
void int0(void) interrupt 0 //外部中断
{
}
void int1(void) interrupt 2
{
}
//---------------------------------------------------------------------------------------------------------
// The serial interrupt function provide receiver and transmiter cases
// Receiver case perform received host package data.
// When received ETX code and BCC is sucss then set DecodFlag.
// Transmiter case handle data transmitted. To transmit data before will send STX to SBUF and set TxFlag.
// And then call CheckControlCode rountin to fill data to TxBuffer.
// Transmitted at last data will auto reload ETX code to SBUF.
//---------------------------------------------------------------------------------------------------------
void CommPC(void) interrupt 4 using 3
{
Regetrc500EEPROMTimeOut=C_UART_TimeOut; //set byte time out value. The time count down at timer 0
if (RI == 1)
//---------------------------start received
{
if (RD2IDLEFlag) {RD2IDLEFlag=0;}
RI = 0;
if(!DecodeFlag) //DecodeFlag used for protect RxBuffer data.
{
switch(Rec_Status)
{
case 0:
if(SBUF == STX) //check the starting code of a package
{
ReceivCNT = 0;
CheckSum=0;
Rec_Status=1;
}
break;
case 1:
if(ReceivCNT >= u_ram.host.RxBuffer[3] + 5 )
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -