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

📄 module.c

📁 程序是智能指纹锁的
💻 C
📖 第 1 页 / 共 2 页
字号:
#include "Include.h"
extern uchar FingerRecord[26];//指纹记录数组,每位代表对应编号指纹有无
extern uchar xdata CommBuf[MAX_BUF_NUMBER];//串口缓冲
extern uchar xdata SCC;//串口接收和校验
extern uchar BellTimer;
extern uint Tc;//超时计时器
extern uchar NowKey;//当前按键
extern	bit	ReceiveOK;//数据包接收完成标志位  
/**********************************/
bit	Add_Deal = 0;				//线程标志位1
bit Add_Deal2 = 0;			//线程标志位2
bit Add_Deal3 = 0; 			//线程标志位3
/**********************************/
//显示操作成功
//P00,P02和PO4交错闪烁4次
void DisplayOK(void)
{       uchar i = 0;
        for(i=0;i<4;i++)
        {       BellOn();
                LedBlueOn();
				LedRedOff();
                DelayNmS(250);
                BellOff();
                LedBlueOff();
				LedRedOn();
                DelayNmS(250);
        }
		LedRedOff();}
//显示操作失败
//P04闪烁2次
void DisplayFail(void)
{       uchar i = 0;
        for(i=0;i<2;i++)
        {       BellOn();
                LedRedOff();
                DelayNmS(250);
                BellOff();
                LedRedOn();
                DelayNmS(250);}
		LedRedOff();}
//显示通讯错误
//P02P04闪烁4次
void DisplayErr(void)
{       uchar i = 0;
        for(i=0;i<4;i++)
        {       BellOn();
                LedRedOn();
                DelayNmS(250);
                BellOff();
                LedRedOff();
                DelayNmS(250);}
}
//显示超时
//P00,P02和P04同时闪烁2次
void DisplayOutTime(void)
{       uchar i = 0;
        for(i=0;i<2;i++)
        {       BellOn();
				LedBlueOn();
                LedRedOn();
                DelayNmS(250);
                BellOff();
				LedBlueOff();
                LedRedOff();
                DelayNmS(250);}}
//显示一次操作成功
//P00,P02和P04流水一次
void DisplayWater(void)
{		LedBlueOn();
		DelayNmS(250);//1
		LedBlueOff();
		BellOn();
		DelayNmS(250);//2
		BellOff();
		LedRedOn();
        DelayNmS(250);//3
		LedRedOff();
}						 
//显示提示按下指纹
//P02先闪烁一次,P00,P02和P04闪烁一次
void DisplayFinger(void)
{		BellOn();
		DelayNmS(250);//1
		BellOff();
		DelayNmS(250);//2
		BellOn();
		LedRedOn();		
		LedBlueOn();
		DelayNmS(250);//3
		BellOff();
		LedRedOff();
		LedBlueOff();}
//清空指纹库
//1号键,将指纹与现有指纹库对比,成功开门,否则不动作。
void SearchFingerModule(void)
{		if(!Add_Deal)
		{   FingerOn();
			BellOn();
	        DelayNmS(200);
			BellOff();
	        CommBuf[0] = C_SEARCH_FINGER;
	        CommBuf[1] = 0;
	        CommBuf[2] = 0;
	        CommBuf[3] = 0;
	        CommBuf[4] = MAX_FINGER;//最大指纹数
			Clear_Uart_Variable();
	        SendCommand(C_COMMAND,5,CommBuf);//发送搜索命令	
			//等待接收返回
			Tc = 2;
			while(!ReceiveOK&&Tc);
			Clear_Uart_Variable();
			if((SCC==CommBuf[CommBuf[3]+4])&&Tc)	//数据包和校验判断 和 接收超时判断
			{	if((C_ANSWER==CommBuf[2])&&(0x01==CommBuf[4]))
				{	Add_Deal = 1;Add_Deal2 = 1;}
				else{Add_Deal = 0;
					Add_Deal2 = 0;
					DisplayErr();
	                FingerOff();
					NowKey = NO_KEY;
					return;}}
			else{
				Add_Deal = 0;
				Add_Deal2 = 0;
				DisplayErr();
                FingerOff();
				NowKey = NO_KEY;
				return;}}
		//探测手指
		if(Add_Deal2&&ReceiveOK){
			Clear_Uart_Variable();
			if(SCC==CommBuf[CommBuf[3]+4]){//数据包和校验判断		
                if((C_ANSWER == CommBuf[2])&&(0x02 == CommBuf[3])&&(C_SEARCH_FINGER == CommBuf[4]))
                {      //接收正确
						switch(CommBuf[5])
						{	//指纹处理成功
							case ANSWER_OK:
                                BellOn();
                                BellTimer = 6;//中断中关闭Bell
								Add_Deal2 = 0;
								Add_Deal3 = 1;
								break;
							case ANSWER_OUT_TIME:
								DisplayOutTime();
		                        break;
							case ANSWER_FAIL:
							case ANSWER_NUMBER_E:
								DisplayFail();//增加失败
								break; 
						}
						if(Add_Deal2)
						{	Add_Deal = 0;
							Add_Deal2 = 0;
	                        FingerOff();
							NowKey = NO_KEY;							
							return;}}
                else{	Add_Deal = 0;
						Add_Deal2 = 0;
						DisplayErr();
			            FingerOff();
						NowKey = NO_KEY;
						return;}}
			else{
				Add_Deal = 0;
				Add_Deal2 = 0;
				DisplayErr();
	            FingerOff();
				NowKey = NO_KEY;
				return;}}
		//等待搜索结果
		if(Add_Deal3&&ReceiveOK)
		{	Add_Deal3 = 0;
			Add_Deal = 0;
			if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
			{   if((C_ANSWER == CommBuf[2])&&(C_SEARCH_FINGER == CommBuf[4]))
                {   //接收正确
					switch(CommBuf[5])
					{	//指纹处理成功
						case ANSWER_SEARCH_OK:
							leftmotor();
							DisplayOK();
							INITmotor();
							break;
						case ANSWER_OUT_TIME:
							DisplayOutTime();
	                        break;
						case ANSWER_FAIL:
						case ANSWER_SEARCH_FAIL:
							DisplayFail();//增加失败
							break;}}
                else DisplayErr();}
			else DisplayErr();
	        FingerOff();
			NowKey = NO_KEY;}}
//2号键具有的功能,添加管理员
void Add_Adm(void) 
{
		if(NOFINGER==Find_Finger())
		{	AddFingerModule();//如果没有记录在(0,0)处,添加一个指纹到(0,0)处
			NowKey = NO_KEY;
			FingerOff();}
		if(OK==Find_Finger())
		{	/*相应语音提示*/
			if(OK==Search_Super_Adm())
			{	AddFinger_Adm();//增加一般管理员指纹信息
				NowKey = NO_KEY;
				DisplayWater();
				FingerOff();}
			else	{   FingerOff();
					 	NowKey = NO_KEY;}}}
//查找高级管理员
//返回值:
//OK:找到对应的指纹信息
//其他:出错了
uchar Search_Super_Adm(void)
{		if(!Add_Deal)
		{	FingerOn();
			CommBuf[0] = C_SEARCH_FINGER;//0x44搜索指纹
	        CommBuf[1] = 0;
	        CommBuf[2] = 0;
	        CommBuf[3] = 0;
	        CommBuf[4] = 0;//高级管理员
			Clear_Uart_Variable();
	        SendCommand(C_COMMAND,5,CommBuf);//发送搜索命令	
			//等待接收返回
			Tc = 2;
			while(!ReceiveOK&&Tc);
			Clear_Uart_Variable();
			if((SCC==CommBuf[CommBuf[3]+4])&&Tc)//数据包和校验判断 和 接收超时判断
			{
				if((C_ANSWER==CommBuf[2])&&(0x01==CommBuf[4]))//正确
				{	Add_Deal = 1;
					Add_Deal2 = 1;}
				else{
					Add_Deal = 0;
					Add_Deal2 = 0;
					FingerOff();
					return FALSE;}}
			else{
				Add_Deal = 0;
				Add_Deal2 = 0;
                FingerOff();
				return FALSE;}}
		//探测手指
		if(Add_Deal2&&ReceiveOK)
		{	Clear_Uart_Variable();
			if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
			{   if((C_ANSWER == CommBuf[2])&&(0x02 == CommBuf[3])&&(C_SEARCH_FINGER == CommBuf[4]))
                {       //接收正确
						switch(CommBuf[5])
						{	//指纹处理成功
							case ANSWER_OK://0X31
								/*提示声音*/
								Add_Deal2 = 0;
								Add_Deal3 = 1;
								break;
							case ANSWER_OUT_TIME:
								FingerOff();
								return FALSE;	
							case ANSWER_FAIL:
							case ANSWER_NUMBER_E:
								FingerOff();
								return FALSE;}
						if(Add_Deal2){
							Add_Deal = 0;
							Add_Deal2 = 0;
	                        FingerOff();		
							return FALSE;}}else{
						Add_Deal = 0;
						Add_Deal2 = 0;
			            FingerOff();
						return FALSE;}}	else{
				Add_Deal = 0;
				Add_Deal2 = 0;
	            FingerOff();
				return FALSE;}}
		//等待搜索结果
		if(Add_Deal3&&ReceiveOK)
		{	Add_Deal3 = 0;
			Add_Deal = 0;
			if(SCC==CommBuf[CommBuf[3]+4])//数据包和校验判断
			{   if((C_ANSWER == CommBuf[2])&&(C_SEARCH_FINGER == CommBuf[4]))
                {//接收正确
					switch(CommBuf[5])
					{	//指纹处理成功
						case ANSWER_SEARCH_OK:DisplayFinger();//提示按指纹
							return OK;
						case ANSWER_OUT_TIME:
	                        FingerOff();

⌨️ 快捷键说明

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