⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 finger.c

📁 MSP430设计的继电保护控制和通信程序
💻 C
📖 第 1 页 / 共 5 页
字号:
#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 + -