?? bc2018.c
字號:
/**************************************************************************************
程序對象:指紋密碼一體機程序(800組開門用戶及1個管理用戶)
功能:管理用戶能進行設置;普通用戶能通過指紋或密碼開門。
最后修改時間:2006.11.3
(1)繼電器控制反過來,韋根輸出奇檢驗位出錯,重新起一變量JiChecksum作為奇校標志.
(2)指紋錄入等待時間加長,按鍵及蜂鳴器粘連現象改一共用變量TimeNumCnt為NumCnt.
(3)防ID號超出范圍而造成前面某用戶第二枚指紋被覆蓋.加if((UserId>800)||(UserId==0))限定
(4)開門方式字限定輸入為0--------#或2--------#
(5)同一枚指紋不允許存放兩個ID位置,添加搜索過程,
但可以重錄存同一個ID位置的指紋(改共用變量MinuteCnt_LastRevDat為Good_Good).
(6)11OR22...號輸出卡號出錯問題的解決,改寫CS256的延時.
(7)有效按鍵中有按鍵無聲,改延時去抖同時按鍵聲重置,管理員進入按鍵改由主程序來發聲.
(8)改4次密碼錯誤隨便一鍵就能解警的問題.
(9)防誤打卡(需解碼個別ID號).2006-12-15
編者:ZSJ
版本:V0.1
***************************************************************************************/
#pragma ot(6,SIZE)
#include <W78E516.H>
#include <intrins.h>
#include <absacc.h>
/********P4口定義********/
sbit LED1 = P4^0;
sbit LED2 = P4^1;
//sbit D1_OUT = P4^0;
//sbit D0_OUT = P4^1;
sbit ALARM_1 = P4^3;
sbit EN = P4^2;
/******部分P3口定義******/
sbit DOG = P3^2;
sbit SOUND = P3^3;
sbit D1_OUT = P3^4;
sbit D0_OUT = P3^5;
//sbit LED1 = P3^4;
//sbit LED2 = P3^5;
/******部分P2口定義******/
sbit CS256_EN244 = P2^7;
/******部分P1口定義******/
sbit RELAY = P1^7;
/******P0口使用說明******/
/*P0口不僅地址數據復用,還會
P00-----RESET狀態的讀入;
P01-----Demolish狀態的讀入;
P02-----D_IN_1狀態的讀入;
P03-----OPEN_1狀態的讀入;
注:
RESET恢復出廠設置功能鍵檢測端;
Demolish防拆按鈕按鍵檢測端;
D_IN_1門狀態檢測端;
OPEN_1手動開門按鍵檢測端。
********************************************/
#define GreenLedOk LED1//LED2
#define RedLedMode LED2//LED1
#define BuzzerCtl SOUND
#define NOUSE 0
/*********返回碼定義************/
#define MX_OK 0x00 //獲取數據成功ok;
#define MX_NOT_MATCH 0x08 //指紋不匹配;
#define Uchar unsigned char
#define Uint unsigned int
#define Ulong unsigned long
#define RevEepPagDatLenth 16
//*************************以前的結構*******************************
/********************************************************************
頭13頁放開門方式字(1B),后25頁存放用戶開門密碼(2B),
再50頁放卡號(為防止同一卡號跨頁存放,將3B改為4B來放),第89頁放改動設置:
開門方式字存放地址由下面函數直接得出(注:x為代碼號);
用戶開門密碼存放地址由下面函數直接得出(注:x為代碼號);
卡號存放地址由下面函數直接得出(注:x為代碼號);
第89頁改動設置存放安排如下:
1.改動設置 5632~5638
地址5632,5633單元:放ProgramPassword管理員操作密碼(0~9999);
地址5634單元: 放DoorOpenTime門開時間(0~99);
地址5635單元: 放AlarmTime報警持續時間(0~99);
地址5636單元: 放OP模式字ModeSetRecord(0x40~0xff);
地址5637,5638單元:放AlarmReleasePassword報警解除密碼(0~9999);
********************************************************************
#define At28c256PageLenth 64 //at28c256頁長
#define OpenDoorModePageNum 13 //頭13頁放開門方式字
#define OpenDoorPasswordPageNum 25 //后25頁存放用戶開門密碼
#define OutputCardNumberPageNum 50 //再50頁放卡號
//n為用戶ID號,OpenDoorModeAddr(n)為開門方式字物理存儲單元地址,范圍在0~799
#define OpenDoorModeAddr(n) (n-1)
//n為用戶ID號,OpenDoorPasswordAddr為用戶開門密碼低字節物理存儲單元地址,范圍在832~2368
#define OpenDoorPasswordAddr(n) (OpenDoorModePageNum*At28c256PageLenth-1+2*n-1)
//n為用戶ID號,OutputCardNumberAddr(n)為卡號低字節物理存儲單元地址,范圍在2432~5568
#define OutputCardNumberAddr(n) ((OpenDoorPasswordPageNum+OpenDoorModePageNum)*At28c256PageLenth-3+4*n-1)
/*************有關AT28C256定義******************************************************************************/
//*************************現在的結構*******************************
/*******************************************************************
由0頁開始算起,第200頁開始放數據.頭13頁放開門方式字(1B),
再50頁放卡號(為防止同一卡號跨頁存放,將3B改為4B來放),第263頁放改動設置:
開門方式字存放地址由下面函數直接得出(注:x為代碼號);
用戶開門密碼存放地址由下面函數直接得出(注:x為代碼號);
卡號存放地址由下面函數直接得出(注:x為代碼號);
第263頁改動設置存放安排如下:
1.改動設置 16832~16840
地址16832,16833單元:放ProgramPassword管理員操作密碼(0~9999);
地址16834,16835單元:放OpenDoorPassword用戶開門密碼(0~9999);
地址16836,16837單元:放AlarmReleasePassword解警密碼(0~9999);
地址16838單元: 放DoorOpenTime門開時間(0~99);
地址16839單元: 放AlarmTime報警持續時間(0~99);
地址16840單元: 放OP模式字ModeSetRecord(0x40~0xff);
*******************************************************************/
#define At28c256PageLenth 64 //at28c256頁長 共512頁
#define StartPageNumber 200 //起始頁號
#define OpenDoorModePageNum 13 //頭13頁放開門方式字
#define OutputCardNumberPageNum 50 //再50頁放卡號
//n為用戶ID號,OpenDoorModeAddr(n)為開門方式字物理存儲單元地址,范圍在12800~13600
//#define OpenDoorModeAddr(n) (StartPageNumber*At28c256PageLenth-1+n-1)
//n為用戶ID號,OutputCardNumberAddr(n)為卡號最高字節物理存儲單元地址,范圍在13632~16828
//#define OutputCardNumberAddr(n) ((StartPageNumber+OpenDoorModePageNum)*At28c256PageLenth-3+4*n-1)
#define AT28C256_COM1 XBYTE[0X5555]
#define AT28C256_COM2 XBYTE[0X2AAA]
//#define PAGE_ADDR(x) ((x/64)*64)
//#define INSIDEPAGE_UINTADDR(x) (x-((x/64)*64))
/*
//x為物理存儲單元地址0~(4K-1),PAGE_ADDR(x)為頁地址即物理存儲單元地址除去頁內單元地址剩下的地址部分
#define PAGE_ADDR(x) (x-(x%64))
//x為物理存儲單元地址0~(4K-1),INSIDEPAGE_UINTADDR(x)為頁內單元地址0~63
#define INSIDEPAGE_UINTADDR(x) (x%64)
//x為物理存儲單元地址0~(4K-1),PAGE_NUMBER(x)為x單元在at28c256上的頁號
*/
//#define PAGE_NUMBER(x) (x/64+1)
//ModeSetRecord<--->MS
/* MS7 MS6 MS5 MS4 MS3 MS2 MS1 MS0
| | | | | | | |_ _ _安全模式記錄位.0時,關閉此功能;
| | | | | | |_ _ _ _ _1時,連續4次密碼錯誤,死鎖10分鐘;2時,連續4次密碼錯誤,啟動報警.
| | | | | |_ _ _ _ _ _ _門狀態監視記錄位.0時,關閉此功能;1時,門非法打開啟動報警.
| | | | |_ _ _ _ _ _ _ _ _卡號輸出格式記錄位.0時,以韋根26方式輸出卡號;1時,以韋根34方式輸出卡號.
| | | |_ _ _ _ _ _ _ _ _ _ _報警時間改動記錄位.0時,改過;1時,為缺省的報警時間.
| | |_ _ _ _ _ _ _ _ _ _ _ _ _門開時間改動記錄位.0時,改過;1時,為缺省的門開時間.
| |_ _ _ _ _ _ _ _ _ _ _ _ _ _ _空.
|_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _設置種類記錄位.1時,出廠設置;0時管理員設置.
*************************************************************************************************/
Uchar idata BMaybeRecord;
Uchar RevEepPageBytDatBuf[16];
Uchar *PtRevOrSendDat;
Uchar RecordInputCondit_CodingDatCnt;
Uchar MarkKeyNum_SendDatLenth;
Uchar InputPwCnt_RevDatLenth;
Uchar BuzzerCnt_DecodeDatCnt;
Uchar BuzzerEvent_RevSameDatCnt;
Uchar LedEvent_TimeBuzzerCnt;
Uchar MinuteCnt_LastRevDat;
Uchar idata Good_Good;
Uchar TempVar_TimeGlintCnt;
Uint TimeDoorOpenCnt;
Uint TimeOneMinuteCnt_PageId;
Uint EveryOneMinuteCnt_TimeCnt;
Uchar AffairDone;
Uchar LableBitVar;
//Uint idata CardNumHighWord;
//Uint idata CardNumLowWord;
Uint idata TimeNumCnt;
Uint idata NumCnt;
Uchar idata PressKeyCnt;
Uchar idata JiChecksum;
//bit BStartOneMinuteTime;
//bit BStartTenMinuteTime;
//bit BOneSetFail;
//bit BOtherAlarmEnd;
//bit BSuccessInputPassword;
//bit DatOk; ==Wg34LowWordOddVerfBit 奇校驗位
//bit BStartTime; ==Wg34HighWordEvenVerfBit 偶校驗位
//bit BDatRevOk; //數據接收完成標志
bit BStartBuzzerTime;
bit BStopCheckBuz;
bit BStopCheck;
bit BStartLedGlintTime;
bit BStartTimeCnt;
bit BstartDoorOpenTime;
bit BstartLawlessOpenDoorTime;
bit BEndOneMinuteTime;
bit BPressKey;
bit BWaitForSetAffairBring;
bit BOpenDoorAffairBring;
bit BLawlessOpenDoor;
bit BEndPwInput;
bit BForgetCloseDoor;
bit BBrokeDoor;
bit BAvoidBackout;
bit BOverForTimes;
bit BStartTime;
bit DatOk;
Uchar TimeCnt;
bit BForthFinger;
bit BPreventStop;
void InitSoftware();
void Delay_163us();
void DelayNuS(Uint n);
bit CmdDetectFinger();
bit CmdGetImage(/*Uchar* areaBorder*/);
bit CmdGenTemplet(Uchar iBufferID);
bit CmdLoadTemple(Uint iTimeOneMinuteCnt_PageId);
bit CmdMoveTemplet(Uchar iScrBufferID,Uchar iDstBufferID);
bit CmdMatchTwoTemplet(/*Uint* iScore*/);
bit CmdSearch(Uchar iBufferID,Uint iStartPage,Uint iPageNum/*,Uint *iMbAddress,Uchar* sUserInfo*/);
bit CmdMergeTwoTemple();
bit CmdStoreTemplet(Uchar iBufferID,Uint iTimeOneMinuteCnt_PageId);
bit CmdDeletOneTemplet(Uint iTimeOneMinuteCnt_PageId);
bit CmdEraseAllTemple();
bit CmdSetSecurLevel(Uchar iSecurLevel);
bit CmdFlashLED(Uchar iCode,Uchar iTime);
void GetDatFromFingerprintModule();
void SendNextDatToFingerprintModule();
void OpenTheDoor(void);
void AdministratorsProgramOperate(void);
Uint ReadStateofSwitch(void);
void DetectAndDealAlarm(bit BAlarmType,bit BDoorBroke);
bit ReadDataFromAt28c256(Uint PageAddr,Uint UintAddr,Uchar PageOrByteWrite,Uchar ReadType);
void Delay(Uint n);
Uint OpenDoorModeAddr(Uint n)
{
return(StartPageNumber*At28c256PageLenth+n-1);
}
Uint OutputCardNumberAddr(Uint n)
{
return((StartPageNumber+OpenDoorModePageNum)*At28c256PageLenth-3+4*n-1);
}
Uint PAGE_ADDR(Uint x)
{
return((x/64)*64);
}
Uint INSIDEPAGE_UINTADDR(Uint x)
{
return(x-((x/64)*64));
}
//////////////////////////////////////////
/**********韋根卡號輸出子程序***********/
/////////////////////////////////////////
/**********將卡號轉換成韋根數據*********/
//Uint TimeOneMinuteCnt_PageId 卡號高字部分
//Uint TimeDoorOpenCnt 卡號低字部分
void ConverIntoWgData(Uchar WgType)
{ /*以下為添加檢驗位*/
register i;
Uchar TempData;
TempData=0;
DOG=~DOG;
if(!WgType)//韋根26檢驗位添加
{ for(i=0;i<12;i++)//低12位
{ if((TimeDoorOpenCnt>>i)&0x0001)
{TempData+=1;}
}
//if(TempData%2)/*不被2整除,奇數個1*/
//{LableBitVar&=0xfd;}/*奇校驗位補0*/
if(TempData%2)/*不被2整除,奇數個1*/
{JiChecksum=0;}/*奇校驗位補0*/
else
{JiChecksum=1;}/*奇校驗位補1*/
//{LableBitVar|=0x02;}/*奇校驗位補1*/
TempData=0;
for(i=0;i<4;i++)
{ if((TimeDoorOpenCnt<<i)&0x8000)
{TempData+=1;}
}
for(i=0;i<8;i++)
{ if((EveryOneMinuteCnt_TimeCnt>>i)&0x0001)
{TempData+=1;}
}
if(TempData%2)/*不被2整除,奇數個1*/
{LableBitVar|=0x04;}/*偶校驗位補1*/
else
{LableBitVar&=0xfb;}/*偶校驗位補0*/
}
else
{ for(i=0;i<16;i++)//低16位
{ if((TimeDoorOpenCnt>>i)&0x0001)
{TempData+=1;}
}
if(TempData%2)/*不被2整除,奇數個1*/
//{LableBitVar&=0xfd;}/*奇校驗位補0*/
{JiChecksum=0;}/*奇校驗位補0*/
else
//{LableBitVar|=0x02;}/*奇校驗位補1*/
{JiChecksum=1;}/*奇校驗位補0*/
TempData=0;
for(i=0;i<16;i++)//高16位
{ if((EveryOneMinuteCnt_TimeCnt<<i)&0x8000)
{TempData+=1;}
}
if(TempData%2)/*不被2整除,奇數個1*/
{LableBitVar|=0x04;}/*偶校驗位補1*/
else
{LableBitVar&=0xfb;}/*偶校驗位補0*/
}
}
void OutputWgDat()
{ register i;
//先輸出偶校驗位
DOG=~DOG;
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
if((LableBitVar&0x04)==0x00)
{ D0_OUT=0;
D1_OUT=1;
Delay_163us();
D1_OUT=1;
D0_OUT=1;
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
}
else
{ D1_OUT=0;
D0_OUT=1;
Delay_163us();
D1_OUT=1;
D0_OUT=1;
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
}
if(!BForthFinger)//韋根26輸出
{ EveryOneMinuteCnt_TimeCnt<<=8;
for(i=0;i<8;i++)
{ if(EveryOneMinuteCnt_TimeCnt&0x8000)
{ D1_OUT=0;
D0_OUT=1;
Delay_163us();
D1_OUT=1;
D0_OUT=1;
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
}
else
{ D0_OUT=0;
D1_OUT=1;
Delay_163us();
D1_OUT=1;
D0_OUT=1;
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
Delay_163us();
}
EveryOneMinuteCnt_TimeCnt<<=1;
}
for(i=0;i<16;i++)
{ if(TimeDoorOpenCnt&0x8000)
{ D1_OUT=0;
D0_OUT=1;
Delay_163us();
D1_OUT=1;
D0_OUT=1;
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -