📄 finger.c
字号:
#include <msp430x14x.h>
#include <In430.h>
#define uint unsigned int
#define uchar unsigned char
//LCM显示模块定义
#define SetRS P5OUT|=BIT5
#define SetRW P5OUT|=BIT6
#define SetE P5OUT|=BIT7
#define ClrRS P5OUT &= (~BIT5)
#define ClrRW P5OUT &= (~BIT6)
#define ClrE P5OUT &= (~BIT7)
#define BUSY 0x01
#define FREE 0x00
//通讯口切换
#define ComMaster_Slave P5OUT &= ~BIT4
#define ComFinger P5OUT |= BIT4
//定时时间
#define Time100ms 3277
//定义车灯
#define FOOTBRAK P3IN&BIT2
#define KEYON3 P3IN&BIT1
#define SIDEDOOR P3IN&BIT0
#define SetLEARN P2OUT|=BIT6
#define ClrLEARN P2OUT &= (~BIT6)
#define LATCHTYPE P3IN&BIT3
//定义防盗状态
#define QuiteAlarm 0x01
#define CryAlarm 0x00
#define NoneAlarm 0x02
//键盘定义
#define KeyA P1IN&BIT2 //A
#define KeyC P1IN&BIT3 //C
#define KeyB P1IN&BIT4 //B
#define KeyD P1IN&BIT5 //D
/////////////////////////////////////////
#define Vibricate P1IN&BIT6
#define Contrast P1IN&BIT7
//ISD4003语音命令
/*#define POWERUP 0x20
#define SETPLAY 0xe0
#define PLAY 0xf0
#define STOP 0x30
#define POWERDN 0x10*/
//定义错误类型
#define ComErr 0xee
#define ERROR 0x00
#define RIGHT 0x01
#define CheckSumErr 0xff
#define M2ERROR_NONE 0x00 //NO ERROR
#define M2ERROR_FLASH_OPEN 0x01 //SYSTEM FLASH ERROR
#define M2ERROR_SENSOR_OPEN 0x02 //SYSTEM SENSOR ERROR
#define M2ERROR_REGISYTERED_FAILED 0x03 //FINGERPRINT LOGON FAILED
#define M2ERROR_VERIFY_FAILED 0x04 //FINGERPRINT VERIFY FAILED
#define M2ERROR_ALREADY_REGISYTERED_USER 0x05 //FINGERPRINT ID HAVE LOGON
#define M2ERROR_TIMEOUT 0x08 //TIMEOUT
#define M2ERROR_DB_FULL 0x09 //FINGERPRINT DATABASE IS FULL
#define M2ERROR_FLASH_WRITE_ERROR 0x12 //FLASH WRITE ERROR
#define M2ERROR_MASTERFP_NOT_FOUND 0x15 //NO FINGERPRINT OF MASTER IN SYSTEM
#define M2ERROR_MASTER_COUNT_EXCEED 0x16 //FINGERPRINT OF MASTER IS FULL
#define M2ERROR_IDENTIFY_FAILED 0x1B //FINGERPRINT IDENTIFY ERROR
#define M2ERROR_CODE_CHECKSUM_ERROR 0x29 //CHECKSUM ERROR
//定义命令数组
uchar CMD_IS_ROOT_MASTER[12]= {0,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_DEVICE_TEST[12] = {0,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_SET_SYSTEM_INFO[12]= {0,0x20,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_GET_SYSTEM_INFO[12]= {0,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_GET_REC_COUNT[12] = {0,0x46,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_GET_MASTER_COUNT[12]= {0,0x47,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_FP_REGISTER_START[12]={0,0x50,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_FP_REGISTER_END[12] = {0,0x51,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_FP_DELETE[12] = {0,0x54,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_FP_VERIFY[12] = {0,0x55,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_FP_IDENTIFY[12] = {0x00,0x56,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
//uchar CMD_FP_IDENTIFY[12] = {0x30,0x31,0x32,0x33,0x34,0x35,0x36,0x37,0x38,0x39,0x39};
uchar CMD_FP_VERIFY_MASTER[12] ={0,0x57,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_FP_VERIFY_END[12] = {0,0x58,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_FP_IDENTIFY_EX[12] = {0,0x59,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_GET_IMAGE[12] = {0,0x43,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar CMD_DB_ADD_REC[12] = {0,0x71,0x01,0x00,0x00,0x00,0x03,0x30,0x00,0x00,0x00};
uchar CMD_DB_GET_REC[12] = {0,0x73,0x01,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
uchar pBitCode32[4];
uchar pConfigPass1[8]={1,1,1,1,1,1,1,1};
uchar pConfigPass2[8]={1,1,1,1,1,1,1,1};
uchar config_flag;
uchar RecCount=0; //定义全局变量中断接受字符数
uchar FrameCount=12;
uint delay_count;
uchar SPI_count;
uint Time_count;
uchar RecComm[25]; //接受的报文数组
uchar Param1_L,Param1_H,Param2_L,Param2_H;
uchar UserTwoCode;
uchar UserTwoCode_Flag[50];
uchar POWERUP = 0x20;
uchar SETPLAY = 0xe0;
uchar PLAY = 0xf0;
uchar STOP = 0x30;
uchar POWERDN = 0x10;
//flash数据保存数组用于擦除时临时中转
uchar FlashData[128];
//应急密码建立机和修改参数
uchar UnlockPassFlag;
uchar UnlockPass[6];
uchar PrivateUnlockPass[6];
uchar AlarmStatus = CryAlarm; /* 初始化为鸣叫报警状态 */
uchar pAlarmStatus=CryAlarm;
uchar FindCarLongKeyFlag = 0;
uchar KEYON3Flag = 0;
uchar AutoLatch = 0; /* 用于踩刹车后自动锁车门 */
uchar AutoAlarm = 0; /* 用于人离开车后 30秒自动锁车并进入防盗状态 */
uchar FOOTBRAKFlag = 1;
uchar VerifyFingerStatus = ERROR;
void delay(uint time);
void SendFrame(uchar *Frame,uchar CountFrame);
void SendFrame1(uchar *Frame,uchar CountFrame);
uchar CheckSum(uchar *pFrame,uint Count);
void Com0Init(void); //串口通讯初始化程序
void Com1Init(void); //串口通讯初始化程序
//interrupt[TIMERA0_VECTOR] void TimerA(void);
//interrupt[UART0RX_VECTOR] void usart0_rx (void); //通讯0中断服务程序
//interrupt[UART1RX_VECTOR] void usart1_rx (void); //通讯1中断服务程序
uchar CMDIsRooMaster() ;
uchar CMDDeviceTest(); //还应该加入接受等待延时
uchar CMDSetSystemInfo(uchar Param2L,uchar Param2H); //还应该加入接受等待延时
uchar CMDGetSystemInfo();
uchar CMDGetRecCount();
uchar CMDGetMasterCount();
uchar CMDFpRegisterStart(uchar Param1L,uchar Param1H,uchar Param2L,uchar Param2H);
uchar CMDFpRegisterEnd(uchar Param1L,uchar Param1H,uchar Param2L,uchar Param2H);
uchar CMDFpDelete(uchar Param1L,uchar Param1H);
uchar CMDFpVerify(uchar Param1L,uchar Param1H);
uchar CMDFpIdentify();
uchar CMDFpVerifyMaster(uchar Param1L,uchar Param1H);
uchar CMDFpVerifyEnd();
uchar CMDFpIdentifyEx(uchar Param1L,uchar Param1H,uchar Param2L,uchar Param2H);
void flash_write(char *pAdd,uchar *Data,uchar count);
uchar flash_read(char *pAdd,uchar *Data,uchar count);
uchar Verify(uchar *Data1,uchar *Data2,uchar count);
void copy(uchar *pData,uchar *newData,uchar count);
uchar Config64Bit();
uchar Master_Slave(uchar Comm);
void isdx(uchar com);
//void isd4003(uchar adds);
void InitSPI();
void SPI(uchar com);
//void play(uchar addsH,uchar addsL);
void play(uint adds);
void play_number(uchar voice_data);
void InitPort();
void InitTimerA(uint time);
uchar InPass(uchar * pTem);
void RegisterMaster();
void RegisterSlave();
void DeleteFinger();
void UpdatePass();
void Unlock_Pass();
void VerifyFinger();
void app_function(uchar Function);
void play_function(uchar NumberFunction);
void key();
uchar wait_free();
void write1_command(uchar commnad);
void write_command(uchar command);
void write_data(uchar data);
void InitLcm();
void DisString(uchar row,uchar line,char *Data_String);
void ClrString(uchar row,uchar line);
void delay(uint time)
{
uint m,n;
for(m=0;m<time;m++)
{
for(n=0;n<125;n++)
{;}
}
}
void InitTimerA(uint time)
{
TACTL = TASSEL0 + TACLR; // ACLK, clear TAR
CCTL0 &= ~CCIE; // CCR0 interrupt disable
CCR0 = time;
TACTL |= MC0; // Start Timer_A in UP mode
//while(!(TACTL & TAIFG))
//{;}
}
void Com0Init(void) //串口通讯初始化程序
{
//while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
//BCSCTL2 |= SELM1+SELM0; // MCLK = LFXT1 (safe)
UCTL0 = CHAR; // 8-bit character
UTCTL0 = SSEL0; // UCLK = ACLK
UBR00 = 0x03; // 32768/9600 - 3.413
UBR10 = 0x00; //
UMCTL0 = 0x49; // modulation
ME1 |= UTXE0 + URXE0; // Enable USART0 TXD/RXD
IE1 |= URXIE0; // Enable USART0 RX interrupt
P3SEL |= 0x30; // P3.4,5 = USART0 TXD/RXD
P3DIR |= 0x10; // P3.4 output direction
_EINT(); // Enable interrupts
}
void Com1Init(void) //串口通讯初始化程序
{
//while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
//BCSCTL2 |= SELM1+SELM0; // MCLK = LFXT1 (safe)
UCTL1 = CHAR; // 8-bit character
UTCTL1 = SSEL0; // UCLK = ACLK
UBR01 = 0x03; // 32768/9600 - 3.413
UBR11 = 0x00; //
UMCTL1 = 0x49; // modulation
ME2 |= UTXE1 + URXE1;
//ME1 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
IE2 |= URXIE1;
//IE1 |= URXIE1; // Enable USART1 RX interrupt
P3SEL |= 0xf0; // P3.6,7 = USART1 TXD/RXD
P3DIR |= 0x50; // P3.6 output direction
_EINT(); // Enable interrupts
}
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA(void)
{
Time_count++;
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx (void) //通讯中断服务程序
{
RecComm[RecCount]=RXBUF0;
RecCount++;
}
/*通讯中断服务程序*/
#pragma vector=UART1RX_VECTOR
__interrupt void usart1_rx (void) //通讯中断服务程序
{
RecComm[RecCount]=RXBUF1;
RecCount++;
}
//send frame use uart0
void SendFrame(uchar *Frame,uchar CountFrame)
{
uchar *pTem,m;
pTem = Frame;
for(m=0;m<CountFrame;m++)
{
while ((IFG1 & UTXIFG0) == 0); // USART0 TX buffer ready?
TXBUF0 = *pTem;
pTem++;
}
;;
}
//send frame use uart1
void SendFrame1(uchar *Frame,uchar CountFrame)
{
uchar *pTem,m;
pTem = Frame;
for(m=0;m<CountFrame;m++)
{
while ((IFG1 & UTXIFG1) == 0); // USART0 TX buffer ready?
TXBUF1 = *pTem;
pTem++;
}
}
///////////////////////////////////////
uchar CheckSum(uchar *pFrame,uint Count)
{
uchar *pTem,m;
uchar Check_Sum;
pTem = pFrame;
Check_Sum =0;
for(m=0;m<Count;m++)
{
Check_Sum += *(pTem++);
}
return Check_Sum;
}
/* 对segB操作 */
void flash_write(char *pAdd,uchar *Data,uchar count)
//void flash_write(int *pAdd,uchar *Data,uchar count)
{
uchar m,n,u;
char *TemAdd;
char *pwrite; /* 定义定义写地址指针 */
uchar *pTemData;
_DINT();
while(FCTL3&BUSY); /* 检测是否为忙 */
flash_read((char *)0x01000,FlashData,128);
while(FCTL3&BUSY); /* wait for free */
FCTL2=FWKEY; /* ACLK,写操作 */
FCTL3 = FWKEY; /* LOCK IS LOW */
FCTL1 = FWKEY+ERASE; /* 擦除一段 */
pwrite = pAdd;
pTemData = Data;
*pwrite=0; /* 空写入启动擦除 */
FCTL1 = FWKEY+WRT; /* 对flash编程 */
m=0;
TemAdd = (char *)0x01000;
while(TemAdd < pwrite) /* 写入不需改变的flash数据 */
{
*TemAdd = *(FlashData + m);
TemAdd++;
m++;
}
for(n=0;n<count;n++)
{
*(pwrite+n)= *(pTemData+n);
}
u = m+n;
TemAdd = pwrite + n;
while(TemAdd < (char *)0x01080) /* end of segB */
{
*TemAdd = FlashData[u];
u++;
TemAdd++;
}
while(FCTL3&BUSY) //等待对flash写结束
{;}
FCTL1=FWKEY;
FCTL3^=(FXKEY+LOCK); //写完了,确定
_EINT();
}
//--------------------------------------------------------
uchar flash_read(char *pAdd,uchar *Data,uchar count)
{
uchar *read_data;
char *pread;
uchar m;
_DINT();
while(FCTL3 & BUSY)
{;}
FCTL3 = FWKEY; //LOCK IS LOW
FCTL2 = FWKEY; //ACLK
FCTL1 = FWKEY;
//pread=(char*)0x01000; //读的起始地址
pread = pAdd;
read_data= Data;
//read_data=*(pread+n); //读地址中的数据
for(m=0;m<count;m++)
{
*(read_data+m)= *(pread+m);
}
while(FCTL3&BUSY)
{;}
FCTL3^=(FXKEY+LOCK); //读完
_EINT();
return(*pread); //返回读出数据
}
/////////////////////////////////////说明:在主函数首先应该读出存入flash的config_flag标志,如不为0X00,则福config_flag=0x01;
uchar Verify(uchar *Data1,uchar *Data2,uchar count)
{
uchar m;
for(m=0;m<count;m++)
{
if((*(Data1+m))!=(*(Data2+m)))
return ERROR;
}
return RIGHT;
}
/////////////////////////////////////////
void copy(uchar *pData,uchar *newData,uchar count)
{
uchar m;
for(m=0;m<count;m++)
{
*(pData+m)=*(newData+m);
}
}
/////////////////////////////////////////接受22数据,返回23数据
uchar Config64Bit()
{
uchar m,n;
uchar BackData[25];
uchar BitCode32[4];
uchar ConfigPass1[8];
uchar ConfigPass2[8];
uchar BackErr;
CCTL0 &= ~CCIE; //关定时器中断
RecCount=0;
FrameCount=22;
//delay_count=8000;
flash_read((char *) 0x01016,&config_flag,1);
if(config_flag != 0x00) //读出配置标志
config_flag =0x01;
Time_count=200;
while((RecCount != FrameCount)&&(Time_count>0)) //20s等待通讯
{
if(TACTL & TAIFG)
{
Time_count--;
TACTL &= ~TAIFG; //轻重断标志
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -