📄 main.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 + -