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

📄 main.c

📁 An applicaion that utilize a fingerprint scanner to turn off the PC
💻 C
字号:
char data_frame[8];
unsigned short user_number,response,count,event;
char lcd_message[16],buffer;
unsigned int frequency;

#define header 0xF5
#define pc_power_source PORTA.F0
#define pc_supply_control PORTC.F3
#define button1 PORTD.F3
#define button2 PORTC.F4
#define button3 PORTC.F5
#define on 1
#define off 0
//------------------------------------------------------------------------------
void Show_Splash_message()
     {
     LCD_Out(1,1,"  FINGER PRINT  ");
     LCD_Out(2,1,"   ENROLLMENT   ");
     }

void Show_Welcome_String()
     {
     LCD_Out(1,1,"    WELCOME!    ");
     }

void Show_EEPROM_Stored_Messages(short row, unsigned short location)
     {
     unsigned column;
     column = 1;
     while (column < 17)
           {
           buffer = EEprom_Read(location);
           LCD_Chr(row,column,buffer);
           location++;
           column++;
           }
     }
//------------------------------------------------------------------------------
void Clear_Buffer_Registers()
     {
     data_frame[0] = 0;
     data_frame[1] = 0;
     data_frame[2] = 0;
     data_frame[3] = 0;
     data_frame[4] = 0;
     data_frame[5] = 0;
     data_frame[6] = 0;
     data_frame[7] = 0;
     }

void Seconds_Delay(unsigned short length)
     {
     while (length > 0)
           {
           Delay_ms(1000);
           length--;
           }
     }

void Transmit_Command_to_Scanner()
     {
     count = 0;
     while (count < 8)
           {
           Usart_Write(data_frame[count]);
           count++;
           }
     }

void Receive_Response_from_Scanner()
     {
     Clear_Buffer_Registers();
     count = 0;
     while (data_frame[count] != 0xf5)
           {
           if (PIR1.RCIF)
              {
              data_frame[count] = Usart_Read();
              }
           }
     count++;
     while (count < 8)
           {
           if (PIR1.RCIF)
              {
              data_frame[count] = Usart_Read();
              count++;
              }
           }
     }

void Boot_Computer()
     {
     pc_supply_control = on;
     while (!pc_power_source)
           {
           asm nop;
           }
     LCD_Cmd(LCD_CLEAR);
     pc_supply_control = off;
     PWM_Stop();
     while (pc_power_source)
           {
           asm nop;
           }
     clear_buffer_registers();
     PWM_Start();
     }

//------------------------------------------------------------------------------

void Determine_Checksum_of_Data_frame()
     {
     data_frame[6] = data_frame[1]
                   ^ data_frame[2]
                   ^ data_frame[3]
                   ^ data_frame[4]
                   ^ data_frame[5];
     }

void Construct_Scanner_Command()
     {
     data_frame[0] = header;
     data_frame[5] = 0;
     data_frame[7] = header;
     Determine_Checksum_of_Data_frame();
     }

void Delete_Specific_User(unsigned short number)
     {
     data_frame[1] = 0x04; // delete user command
     data_frame[2] = 0; // this byte is MSB of the user number
     data_frame[3] = number; // this byte is LSB of the user number
     data_frame[4] = 0;
     Construct_Scanner_Command();
retry1:Transmit_Command_to_Scanner();
     Receive_Response_from_Scanner();
     if (data_frame[4])
        {
        goto retry1
        }
     }

void Disable_Scanners_Timeout()
     {
     data_frame[1] = 0x2e; // change timeout command
     data_frame[2] = 0;
     data_frame[3] = 0; // timeout is disabled
     data_frame[4] = 0; // write data
     Construct_Scanner_Command();
retry2:Transmit_Command_to_Scanner();
     Receive_Response_from_Scanner();
     if (data_frame[4])
        {
        goto retry2
        }
     }

void Set_Enroll_Sampling_Counts()
     {
     data_frame[1] = 0x2d; // enroll sampling command
     data_frame[2] = 0;
     data_frame[3] = 0;  //scan sample up to three times
     data_frame[4] = 0;  //write data
     Construct_Scanner_Command();
retry3:Transmit_Command_to_Scanner();
     Receive_Response_from_Scanner();
     if (data_frame[4])
        {
        goto retry3
        }
     }

unsigned short Enroll_Users_Fingerprint(unsigned short number)
     {
     unsigned short error;
     error = 0;
     Clear_Buffer_Registers();
     if (number <= 3)
        {
        Show_EEPROM_Stored_Messages(1,0x40);
        Show_EEPROM_Stored_Messages(2,0x50);
        }
     if (number >= 4)
        {
        Show_EEPROM_Stored_Messages(1,0x60);
        Show_EEPROM_Stored_Messages(2,0x70);
        }
     data_frame[1] = 0x01; //scan for the 1st time
     data_frame[2] = 0; // this byte is MSB of the user number
     data_frame[3] = number; // this byte is LSB of the user number
     data_frame[4] = 1;   // set priveledge to 1 (optional)
     Construct_Scanner_Command();
     Transmit_Command_to_Scanner();
     Receive_Response_from_Scanner();
     if (data_frame[4])
        {
        error = 1;
        return error;
        }
     LCD_Cmd(LCD_CLEAR);
     Clear_Buffer_Registers();
     seconds_delay(1);
     Show_EEPROM_Stored_Messages(1,0x80);
     Show_EEPROM_Stored_Messages(2,0x90);
     data_frame[1] = 0x02;  //scan for the second time
     data_frame[2] = 0; // this byte is MSB of the user number
     data_frame[3] = number; // this byte is LSB of the user number
     data_frame[4] = 1;   // set priveledge to 1
     Construct_Scanner_Command();
     Transmit_Command_to_Scanner();
     Receive_Response_from_Scanner();
     if (data_frame[4])
        {
        error = 1;
        return error;
        }
     LCD_Cmd(LCD_CLEAR);
     seconds_delay(1);
     Clear_Buffer_Registers();
     Show_EEPROM_Stored_Messages(1,0x80);
     Show_EEPROM_Stored_Messages(2,0xa0);
     data_frame[1] = 0x03;  //scan for the last time
     data_frame[2] = 0; // this byte is MSB of the user number
     data_frame[3] = number; // this byte is LSB of the user number
     data_frame[4] = 1;   // set priveledge to 1
     Construct_Scanner_Command();
     Transmit_Command_to_Scanner();
     Receive_Response_from_Scanner();
     if (data_frame[4])
        {
        error = 1;
        }
     return error;
     LCD_Cmd(LCD_CLEAR);
     seconds_delay(2);
     }

void Adjust_Acceptance_level()
     {
     data_frame[1] = 0x28; // adjust recognitio level command
     data_frame[2] = 0; // this byte is MSB of the user number
     data_frame[3] = 9; // strictest level
     data_frame[4] = 0;
     Construct_Scanner_Command();
retry4:Transmit_Command_to_Scanner();
     Receive_Response_from_Scanner();
     if (data_frame[4])
        {
        goto retry4
        }
     }
     
void Send_Scan_Fingerprint_Command()
     {
     unsigned short error;
     error = 0;
     data_frame[1] = 0x0c; // scan finger print command
     data_frame[2] = 0;
     data_frame[3] = 0;  //scan sample up to three times
     data_frame[4] = 0;  //write data
     Construct_Scanner_Command();
     Transmit_Command_to_Scanner();
     Receive_Response_from_Scanner();
     }
     
//------------------------------------------------------------------------------

void main ()
     {
     ADCON1 = 0x06;
     TRISA = 0x01;
     TRISB = 0;
     TRISC = 0x30;
     TRISD = 0x04;
     TRISE = 0;
     PORTA = 0;
     PORTB = 0;
     PORTC = 0;
     PORTD = 0;
     PORTE = 0;
     Seconds_Delay(2);
     user_number = 0;
     Usart_Init(19200);
     PIE1.RCIE = 1;
     LCD_Init (&PORTB);
     LCD_Cmd(LCD_CURSOR_OFF);
     LCD_Cmd(LCD_CLEAR);
     LCD_Out(1,1,"  INITIALIZING  ");
     LCD_Out(2,1,"  PLEASE  WAIT  ");
     PWM_Init (1000);
     Pwm_Change_Duty(50);
     PWM_Start();
     Seconds_Delay(4);
     Delete_Specific_User(0);
     Set_Enroll_Sampling_Counts();
     Disable_Scanners_Timeout();
     Adjust_Acceptance_level();
     LCD_Cmd(LCD_CLEAR);
     while (1)
           {
           event = 0;
           pc_supply_control = off;
           while (!event)
                 {
                 if (PORTD.F3)
                    {
                    LCD_Cmd(LCD_CLEAR);
                    Show_Splash_message();
                    seconds_delay(1);
                    Delete_Specific_User(1);
                    Delete_Specific_User(4);
                    user_number = 1; //user1 right finger print location
                    Enroll_Users_Fingerprint(user_number); //enroll the finger print user 1
                    user_number = 4; //user1 left finger print location
                    Enroll_Users_Fingerprint(user_number); //enroll the finger print user 1
                    LCD_Cmd(LCD_CLEAR);
                    Show_EEPROM_Stored_Messages(1,0xb0);
                    seconds_delay(5);
                    LCD_Cmd(LCD_CLEAR);
                    event = 1;
                    }
                 if ((PORTC & 0x30) == 0x10)
                    {
                    LCD_Cmd(LCD_CLEAR);
                    Show_Splash_message();
                    seconds_delay(1);
                    Delete_Specific_User(2);
                    Delete_Specific_User(5);
                    user_number = 2; //user1 right finger print location
                    Enroll_Users_Fingerprint(user_number); //enroll the finger print user 1
                    user_number = 5; //user1 left finger print location
                    Enroll_Users_Fingerprint(user_number); //enroll the finger print user 1
                    LCD_Cmd(LCD_CLEAR);
                    Show_EEPROM_Stored_Messages(1,0xb0);
                    seconds_delay(5);
                    LCD_Cmd(LCD_CLEAR);
                    event = 1;
                    }
                 if ((PORTC & 0x30) == 0x20)
                    {
                    LCD_Cmd(LCD_CLEAR);
                    Show_Splash_message();
                    seconds_delay(1);
                    Delete_Specific_User(3);
                    Delete_Specific_User(6);
                    user_number = 3; //user1 right finger print location
                    Enroll_Users_Fingerprint(user_number); //enroll the finger print user 1
                    user_number = 6; //user1 left finger print location
                    Enroll_Users_Fingerprint(user_number); //enroll the finger print user 1
                    LCD_Cmd(LCD_CLEAR);
                    Show_EEPROM_Stored_Messages(1,0xb0);
                    seconds_delay(5);
                    LCD_Cmd(LCD_CLEAR);
                    event = 1;
                    }
                 if ((PORTC & 0x30) == 0x30)//PIR1.RCIF)
                    {
                    LCD_Out(1,1,"  PLACE FINGER  ");
                    LCD_Out(2,1," ON THE SCANNER ");
                    Send_Scan_Fingerprint_Command();
                    LCD_Cmd(LCD_CLEAR);
                    if (data_frame[3] == 1 ||data_frame[3] == 4)
                       {
                       Show_Welcome_String();
                       Show_EEPROM_Stored_Messages(2,0);
                       Boot_Computer();
                       goto exit
                       }
                    if (data_frame[3] == 2 || data_frame[3] == 5)
                       {
                       Show_Welcome_String();
                       Show_EEPROM_Stored_Messages(2,0x10);
                       Boot_Computer();
                       goto exit
                       }
                    if (data_frame[3] == 3 ||data_frame[3] == 6)
                       {
                       Show_Welcome_String();
                       Show_EEPROM_Stored_Messages(2,0x20);
                       Boot_Computer();
                       goto exit
                       }
                    Show_EEPROM_Stored_Messages(1,0x30);
                    exit: Seconds_Delay (3);
                    LCD_Cmd(LCD_CLEAR);
                    Clear_Buffer_Registers();
                    event = 1;
                    }
                 }
           }
     }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -