久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊(cè)

QQ登錄

只需一步,快速開(kāi)始

搜索
查看: 4601|回復(fù): 4
打印 上一主題 下一主題
收起左側(cè)

STC89C52單片機(jī)指紋識(shí)別程序 1602顯示

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主

  1. #include <reg52.h>
  2. #include <intrins.h>
  3. #include"lcd1602.h"


  4. sbit buzzer=P2^0;  //蜂鳴器        低電平打開(kāi)蜂鳴器

  5. sbit red=   P1^0;  //紅色燈 表示錄入模式
  6. sbit green= P1^1;  //綠色燈 表示識(shí)別模式

  7. sbit k2=P3^4; //錄入一次指紋
  8. sbit k1=P3^3; //模式識(shí)別轉(zhuǎn)換
  9. sbit k3=P3^2; //清除所有指紋(10個(gè)指紋清除)

  10. #define Max_User 10
  11. #define error 2

  12. unsigned char         SaveNumber=0,searchnum=0;
  13. unsigned int          SearchNumber=0;               
  14. unsigned int         clk0=0;

  15. unsigned char str[3]={0,'\0','\0'};

  16. unsigned char code Identify[16]="Lock:   Idenfity";
  17. unsigned char code Input[16]   ="Lock:   Input   ";

  18. bit modeflag=0,clearallflag=0,changeflag=0;

  19. // modeflag=0 為識(shí)別模式 modeflag=1為錄入指紋模式
  20. //每成功錄入一次指紋 SaveNumber++

  21. //////////////////////////////////////常用指令定義/////////////////////////////

  22. //Verify  Password   :驗(yàn)證設(shè)備握手口令
  23. unsigned char code VPWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x13,0x00,0x00,0x00,0x00,0x00,0x1b};         //回送12個(gè)

  24. //設(shè)置設(shè)備握手口令
  25. unsigned char code STWD[16]={16,0X01 ,0Xff,0xff,0xff,0xff, 0x01,0,7,0x12,0x00,0x00,0x00,0x00,0x00,0x1a};         //回送12個(gè)

  26. //GetImage           :探測(cè)手指并從傳感器上讀入圖像
  27. unsigned char code GIMG[14]={12, 0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,1,0x00,0x05};        //回送12個(gè)

  28. //Gen Templet1        :根據(jù)原始圖像生成指紋特征1
  29. unsigned char code GENT1[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,1,0x00,0x08};        //回送12個(gè)

  30. //Gen Templet2        :根據(jù)原始圖像生成指紋特征2
  31. unsigned char code GENT2[14]={13,0X01 ,0Xff,0xff,0xff,0xff,0x01,0,4,2,2,0x00,0x09}; //回送12個(gè)        

  32.         
  33. //Search Finger      :以CharBufferA或CharBufferB中的特征文件搜索整個(gè)或部分指紋庫(kù)
  34. unsigned char code SEAT[18]={17,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,   0,8, 4,1,0,0,    0,0x65,  0x00,0x73};        //回送16個(gè)


  35. //Merge Templet      ;將CharBufferA與CharBufferB中的特征文件合并生成模板,結(jié)果存于ModelBuffer。
  36. unsigned char code MERG[14]={12,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,  0,3,5 , 0x00,0x09};//回送12個(gè)        

  37. //Store Templet      :將ModelBuffer中的文件儲(chǔ)存到flash指紋庫(kù)中
  38. unsigned char code STOR[16]={15,  0X01 ,0Xff,0xff,0xff,0xff, 0x01,  0,6,6,2,     0x00,0x00,     0x00,0x0f}; //回送12個(gè)

  39. //Read Note
  40. unsigned char code RDNT[14]={13,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,4,0x19,  0, 0x00,0x1e};

  41. //Clear Note
  42. unsigned char code DENT[46]={45,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,36,0x18,0,0,0,
  43. 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0x00,0x3d};

  44. //DEL one templet
  45. unsigned char code DELE_one[16]={16, 0X01 ,0Xff,0xff,0xff,0xff, 0x01,   0,7,  0x0c,    0x00,0x00, 0,1, 0x00,0x15};

  46. //DEL templet      ;清空指紋庫(kù)
  47. unsigned char code DELE_all[12]={12,0X01 ,0Xff,0xff,0xff,0xff, 0x01, 0,3,  0x0d,0x00,0x11};

  48. //////////////////////////////////////常用指令定義-------結(jié)束///////////////////////////////////////////////////////////////////////////////////////


  49. //////////////////////////////////////宏定義////////////////////////////////////////////////////////////////////////
  50. #define FALSE 0
  51. #define TURE  1

  52. //狀態(tài)定義表
  53. #define on            1
  54. #define off           0

  55. #define MAX_NUMBER    63
  56. #define _Nop()  _nop_()


  57. //////////////////////////////////////宏定義------------結(jié)束////////////////////////////////////////////////////////

  58. unsigned char                   FifoNumber=0;
  59. xdata unsigned char   FIFO[MAX_NUMBER+1]={0};

  60. /*********1毫秒延時(shí)程序**********/
  61. void delay1ms(unsigned int t)
  62. {
  63.         unsigned int i,j;
  64.         for(i=0;i<t;i++)
  65.            for(j=0;j<120;j++)
  66.            ;
  67. }


  68. void TxdByte(unsigned char dat)//串口發(fā)送信息,通過(guò)查詢方式發(fā)送一個(gè)字符
  69. {
  70.     TI = 0;                 //讓TI=0
  71.     SBUF = dat;         //讀入數(shù)據(jù)
  72.     while(!TI);         //等待發(fā)送完畢
  73.     TI = 0;                 //清零
  74. }

  75. bit Command(unsigned char *p,unsigned char MaxTime) //命令解析,給模塊發(fā)送一個(gè)命令
  76. {
  77.           unsigned char count=0,tmpdat=0,temp=0,i=0,package=0,flag=0,checksum=0;
  78.                   
  79.         bit result=0, start=0,stop=0;

  80.           TxdByte(0xef);//數(shù)據(jù)包包頭識(shí)別碼
  81.            TxdByte(0x01);//數(shù)據(jù)包包頭識(shí)別碼
  82.           i=*p;         //數(shù)組的第“0”個(gè)元素、里面存放了本數(shù)組的長(zhǎng)度,把這個(gè)長(zhǎng)度給變量i,方便進(jìn)行操作
  83.           p++;
  84.         p++;
  85.           for (count=i-1; count!=1;count--)  //Sent command String
  86.                   {
  87.                          temp=*p++;//取第個(gè)“1”個(gè)元素的內(nèi)容,然后發(fā)送
  88.                     TxdByte(temp);//將數(shù)據(jù)發(fā)送出去
  89.                 }  
  90.           result=TURE;//發(fā)送完成,結(jié)果為真 (真為1)           
  91.           FifoNumber=0;
  92.           for (count=MAX_NUMBER+1; count!=0; count--)//清空所有FIFO[]數(shù)組里面的內(nèi)容,寫(xiě)入0X00
  93.                  FIFO[count-1]=0x00;  
  94.         
  95.           if (result)   
  96.            {               
  97.              result=FALSE;
  98.               start =FALSE;
  99.                    stop  =FALSE;
  100.                count=0;
  101.                clk0=0;        //清零CL0計(jì)數(shù)
  102.                
  103.                do /////////////////////////////do的內(nèi)容////////////////////////////////
  104.                 {        
  105.                         restart0:                                
  106.                          if (RI==1)//如果接收到數(shù)據(jù)
  107.                               {                                 
  108.                                           tmpdat=SBUF;//先把接收到的數(shù)據(jù)放到tmpdat中
  109.                             RI=0;
  110.                             if ((tmpdat==0xef)&&(start==FALSE))//這個(gè)數(shù)據(jù)為第一個(gè)傳回來(lái)的數(shù)據(jù),也就是“指令應(yīng)答”的第一個(gè)字節(jié)
  111.                                     {
  112.                                                         count=0;
  113.                                                     FIFO[0]=tmpdat;//讀入第一個(gè)應(yīng)答字節(jié)(0XEF),存在第“0”個(gè)元素中   
  114.                                                         flag=1;        
  115.                                                         goto
  116.                                                                 restart0;//可以用中斷方式進(jìn)行                        
  117.                                                 
  118.                                      }
  119.                                         if(flag==1)//第一個(gè)字節(jié)已經(jīng)回來(lái),所以flag==1成立
  120.                                                 {  
  121.                                                         if(tmpdat!=0x01)  //接收數(shù)據(jù)錯(cuò)誤,將重新從緩沖區(qū)接收數(shù)據(jù)
  122.                                                         {         
  123.                                                                 flag=0;//接收應(yīng)答失敗
  124.                                                                 result=FALSE;
  125.                                                               start =FALSE;
  126.                                                                    stop=FALSE;
  127.                                                                count=0;
  128.                                                                 goto
  129.                                                                         restart0;                                       
  130.                                                         
  131.                                                         }
  132.                                                         //如果成功接收到0xef01,可以開(kāi)始接收數(shù)據(jù)
  133.                                                         flag=2;//flag=2;表示應(yīng)答成功,可以開(kāi)始接收數(shù)據(jù)了
  134.                                                         count++;//現(xiàn)在count=1;
  135.                                                         FIFO[count]=tmpdat;//讀入第二個(gè)應(yīng)答字節(jié)(0X01),存在第“1”個(gè)元素中   
  136.                                                         start=TURE;        //應(yīng)答成功可以開(kāi)始接收數(shù)據(jù)
  137.                                                             goto
  138.                                                                         restart0;        
  139.                                                 }                  
  140.                              if((flag==2)&&(start==TURE))//flag=2;表示應(yīng)答成功,可以開(kāi)始接收數(shù)據(jù)了
  141.                                      {                                                              
  142.                                                            count++; //數(shù)據(jù)元素下標(biāo)++
  143.                                             FIFO[count]=tmpdat;//存入數(shù)據(jù)
  144.                                                         if(count>=6)
  145.                                                                 {
  146.                                                                         checksum=FIFO[count]+checksum; //計(jì)算校驗(yàn)和
  147.                                                                 }
  148.                                                         if(count==8)
  149.                                                                 {
  150.                                                                         package=FIFO[7]*0X100+FIFO[8];        //計(jì)算包長(zhǎng)度                                                        
  151.                                                                         stop= TURE;
  152.                                                                 }
  153.                                                         if(stop)
  154.                                                                 {                                                
  155.                                                                         if(count==package+8)
  156.                                                                         {
  157.                                                                                 checksum=checksum-FIFO[count-1];
  158.                                                                                 if(checksum!=FIFO[count]&0xff)
  159.                                                                                         result=FALSE; //校驗(yàn)失敗,置結(jié)果標(biāo)志為0                                                        
  160.                                                                                 else
  161.                                                                                         result=TURE;
  162.                                                                                 flag=0;
  163.                                                                                 break;
  164.                                                                         }
  165.                                                                 }
  166.                                      }
  167.                                 }
  168.           }/////////////////////////////do的內(nèi)容----------------結(jié)束////////////////////////////////
  169.                   
  170.                 while ((clk0<=MaxTime)&&(count<=MAX_NUMBER)); //由定時(shí)器以及最大接收數(shù)據(jù)來(lái)控制,保證不會(huì)在此一直循環(huán)
  171.                   
  172.         FifoNumber=count;        //保存接收到的數(shù)據(jù)個(gè)數(shù)
  173.          }
  174.    return (result);
  175. }

  176. bit VefPSW(void)//驗(yàn)證設(shè)備握手口令,成功返回1     
  177. {
  178.          unsigned char  count=0;
  179.         while (1)
  180.            {
  181.              if(Command(VPWD,20) && (FifoNumber==11) && (FIFO[9]==0x00))  
  182.                         return(1);
  183.              count++;
  184.                      if (count>=2)//如果不成功,再驗(yàn)證一次,如果兩次不成功,返回失敗
  185.                 {  
  186.                     return(0);   
  187.                       }
  188.         }
  189. }


  190. void Clear_All(void) //清空所有指紋信息,清空前首先驗(yàn)證和指紋模塊通訊是否正常  
  191. {
  192.         if(VefPSW()!=1)//驗(yàn)證失敗
  193.         {                        
  194.                  
  195.         }
  196.         else                  //驗(yàn)證成功
  197.         {                        
  198.                    Command(DELE_all,50); //清空指紋庫(kù)
  199.                    Command(DENT,20);           //清空用戶記事本
  200.         }
  201. }

  202. unsigned char ImgProcess(unsigned char BUFID)  //發(fā)獲取圖像并生成特征文件,存入BUFID中//輸入?yún)?shù)為緩沖區(qū)號(hào)  
  203. {        
  204.     if(Command(GIMG,89) && (FifoNumber==11) && (FIFO[9]==0x00))  
  205.     {
  206.                 if(BUFID==1)      
  207.                 {                                   
  208.                       if(Command(GENT1,60) && (FifoNumber==11) && (FIFO[9]==0x00))  
  209.                 {                                                        
  210.                                 return 1;
  211.                         }  
  212.                 else
  213.                 {
  214.                                   return 0;
  215.                  }
  216.                  }
  217.                 else if(BUFID==2)
  218.                 {
  219.                           if(Command(GENT2,60) && (FifoNumber==11) && (FIFO[9]==0x00))  
  220.                 {                                
  221.                                 return 1;
  222.                         }  
  223.                 else
  224.                 {
  225.                                   return 0;
  226.                  }                        
  227.                 }
  228.     }
  229.     else
  230.     {
  231.       return 0;      
  232.     }
  233.         return 0;            
  234. }

  235. bit Searchfinger(void)//搜索指紋(發(fā)送搜索命令、以及根據(jù)返回值確定是否存在)        
  236. {               
  237.            if(Command(SEAT,60) && (FifoNumber==15) && (FIFO[9]==0x00) )  
  238.     {
  239.                 SearchNumber=FIFO[10]*0x100+FIFO[11];//搜索到的頁(yè)碼
  240.                 //MatchScore=FIFO[12]*0x100+FIFO[13]   可以在此計(jì)算得分,從而進(jìn)行安全級(jí)別設(shè)定,本程序忽略
  241.                    return 1;
  242.         }     
  243.     else            
  244.     {
  245.                return 0;
  246.     }  
  247. }


  248. unsigned char search(void)//搜索用戶
  249. {
  250.          unsigned char SearchBuf=0,i=0;
  251.           while (i<20)
  252.     {
  253.            if(modeflag==0)//在識(shí)別模式下
  254.            {
  255.                     if (ImgProcess(1)==1)//首先讀入一次指紋  
  256.                 {
  257.                        SearchBuf=Searchfinger();//進(jìn)行指紋比對(duì),如果搜索到,返回搜索到的指紋序號(hào)
  258.                        if(SearchBuf==1)         //成功搜索到指紋號(hào)
  259.                        {
  260.                                return SearchNumber;
  261.                        }
  262.                        else  //如果沒(méi)有搜索到指紋號(hào)
  263.                         {
  264.                            return 255; //由于只能錄入162個(gè)指紋,這時(shí)候如果返回255表示識(shí)別錯(cuò)誤,或者這個(gè)指紋沒(méi)有登記
  265.                         }     
  266.                }
  267.           }
  268.           else
  269.            {
  270.                    break;
  271.                    return 0;
  272.                 }
  273.                 i++;        
  274.     }
  275.    return 255;//這里其實(shí)是超時(shí)了,由于只能錄入162個(gè)指紋,這時(shí)候如果返回255表示識(shí)別錯(cuò)誤,或者這個(gè)指紋沒(méi)有登記
  276. }

  277. bit savefingure(unsigned char ID)//保存指紋
  278. {
  279.          unsigned char i=0;
  280.          //現(xiàn)在開(kāi)始進(jìn)行存儲(chǔ)指紋模板的操作
  281.      for (i=0;i<16;i++)        //保存指紋信息
  282.                  {
  283.                         FIFO[i]=STOR[i];
  284.                 }  
  285.      FIFO[12]=ID; //把指紋模板存放的PAGE_ID也就是FLASH的位置
  286.      FIFO[14]=FIFO[14]+ID;        //校驗(yàn)和
  287.      if (Command(FIFO,70)==1)//不成功返回0        //此處進(jìn)行存放指紋模板的命令
  288.                  {return(1);}  //成功返回1
  289.      else
  290.                  {return(0);} //不成功返回0
  291. }



  292. unsigned char enroll(void) //采集兩次指紋,生成1個(gè) 指紋模板
  293. {
  294.          unsigned char temp=0,count=0;
  295.           while(1)
  296.           {
  297.                    temp=ImgProcess(1); //生成特征1   
  298.                    if (temp==1)//生成特征文件成功            
  299.               {                        
  300.                 break;
  301.                }
  302.              else                  
  303.                {
  304.                 if (temp==0)//采集指紋沒(méi)有成功
  305.                   {
  306.                                 count++;
  307.                     if (count>=40)//如果采集了40次,還不成功,直接采集失敗,直接退出enroll函數(shù)----返回0  
  308.                                         return(0);
  309.             }
  310.         }
  311.            }
  312.         //采集第一個(gè)特征成功

  313.         //開(kāi)始采集第二個(gè)特征
  314.          while(1)
  315.           {
  316.                    temp=ImgProcess(2); //生成特征2   
  317.                    if (temp==1)//生成特征文件2成功
  318.               {
  319.                 if (  (Command(MERG,40)&& (FifoNumber==11) && (FIFO[9]==0x00))==0  ) //合并不成功返回0,成功返回1
  320.                         {
  321.                                 return 0;        //合并不成功
  322.                         }        
  323.                         else//特征文件合并生成模板,結(jié)果存于ModelBuffer
  324.                         {
  325.                                  buzzer=0;
  326.                      delay1ms(100);
  327.                      buzzer=1;
  328.                                  delay1ms(100);
  329.                                  buzzer=0;
  330.                      delay1ms(100);        //響兩聲,表示生成一個(gè)模板成功
  331.                      buzzer=1;
  332.                      return 1;        //合并成功
  333.                         }        
  334.         }
  335.               else      
  336.                {        
  337.                                 count++;                                 
  338.                                 if (count>=25)         return(0);                       
  339.              }
  340.            }
  341. }


  342. void shownum(unsigned char dat)        //顯示指紋編號(hào)
  343. {
  344.         unsigned char numdat=0;
  345.         numdat=dat;
  346.         GotoXY(0,1);//x,y
  347.         Print("Finger:");
  348.         GotoXY(0,8);//x,y
  349.         str[0]=0x30+numdat/10;
  350.         str[1]=0x30+numdat%10;
  351.         Print(str);
  352. }

  353. void changeState(void)//顯示狀態(tài)轉(zhuǎn)換
  354. {
  355.         if(changeflag==1)        //模式識(shí)別鍵按下
  356.         {
  357.            GotoXY(0,0);//x,y
  358.            if(modeflag==0)
  359.            {
  360.                            Print(Identify);//顯示 識(shí)別模式  Indentity
  361.            }
  362.            else
  363.            {
  364.                            Print(Input);   //顯示  輸入模式 Input
  365.            }
  366.            changeflag=0;               
  367.         }
  368.                
  369. }




  370. void main(void)//主函數(shù)
  371. {
  372.         unsigned char i=0;

  373.         ET0=1;     //定時(shí)器0開(kāi)中斷
  374.         TL0=0x97;  //17ms的初值
  375.         TH0=0xBD;
  376.    delay1ms(5);
  377.    LcdRw=0;      //只對(duì)液晶進(jìn)行寫(xiě)操作,不進(jìn)行讀操作
  378.    delay1ms(5);
  379.    LCD_Initial();//液晶初始化
  380.    delay1ms(5);
  381.    GotoXY(0,0);//x,y
  382.    Print(Identify);

  383.     //串口初始化
  384.     SCON=0x50;   //UART方式1:8位UART;   REN=1:允許接收
  385.     PCON=0x00;   //SMOD=0:波特率不加倍
  386.     TMOD=0x21;   //T1方式2,用于UART波特率
  387.     TH1=0xFD;
  388.     TL1=0xFD;   //UART波特率設(shè)置:9600
  389.     TR1=1;
  390.     TR0=1;// 開(kāi)定時(shí)器0
  391.         
  392.         IT0=0;//中斷0低電平中斷
  393.         IT1=1;//中斷1低電平中斷
  394.         EX0=1;//開(kāi)中斷0
  395.         EX1=1;//開(kāi)中斷1
  396.     EA=1;

  397.         

  398.         for(i=0;i<6;i++)//開(kāi)始握手6次,如果沒(méi)有一次成功,表示模塊通信不正常。只要成功就跳出此循環(huán)
  399.         {
  400.                 if(VefPSW())//與模塊握手通過(guò),綠燈亮起。進(jìn)入識(shí)別模式
  401.                   {
  402.                                 green=0; //讀一次
  403.                                 buzzer=0;
  404.                                 shownum(0);
  405.                         delay1ms(300);
  406.                         buzzer=1;
  407.                                 break;        
  408.                   }
  409.             else   //通信握手失敗
  410.                  {
  411.                         red=1;           //紅燈亮
  412.                         green=1;
  413.                         break;

  414.                  }
  415.         }

  416.     while(1)
  417.         {
  418.                
  419.                 if(k2==0)//錄入一個(gè)指紋
  420.                         {
  421.                                   delay1ms(10);        
  422.                                   if(k2==0)//如果仍為低電平,表示按鍵有效
  423.                                           {
  424.                                             while(k2==0);//等待松手
  425.                                           if(VefPSW()==1&&modeflag==1&&SaveNumber<10)//與模塊握手通過(guò)
  426.                                                   {
  427.                                                             if(enroll()==1)//采集兩次,生成1個(gè)指紋模板成功
  428.                                                                   {
  429.                                                                    if(savefingure(SaveNumber+1)==1)//保存也成功
  430.                                                                            {
  431.                                                                                 SaveNumber++;//加一次
  432.                                                                                 shownum(SaveNumber);
  433.                                                                         }
  434.                         
  435.                                                                 }
  436.                                                   }
  437.                                                 else
  438.                                                 {
  439.                                                                 buzzer=0;
  440.                                                                 for(i=0;i<8;i++)
  441.                                                                 {
  442.                                                                   delay1ms(100);
  443.                                                                   red=~red;
  444.                                                                 }
  445.                                                                 red=0;
  446.                                                                 buzzer=1;               
  447.                                                 }         
  448.                                           }
  449.                                        
  450.                         }        //k2==0

  451.                 if(modeflag==0)//為識(shí)別模式
  452.                 {
  453.                           searchnum=search();
  454.                           if(searchnum>=1&&searchnum<=162)//最多只能存儲(chǔ)162個(gè)指紋
  455.                           {
  456.                                       //顯示搜索到的指紋號(hào)
  457.                                         shownum(searchnum);
  458.                                        
  459.                                //蜂鳴器響一聲
  460.                                buzzer=0;
  461.                                delay1ms(100);
  462.                                buzzer=1;
  463.                           }
  464.                           if(searchnum==255)//表示放上了沒(méi)有登記的指紋或者識(shí)別錯(cuò)誤
  465.                           {
  466.                             ;//用戶可以自己處理,比如顯示 指紋是非法的 或者蜂鳴器響三聲,表示錯(cuò)誤等
  467.                           }
  468.                 }

  469.                 if(clearallflag==1)
  470.                 {
  471.                         clearallflag=0;
  472.                         Clear_All();
  473.                     red=0;             //紅色燈亮
  474.                     green=1;
  475.                         //蜂鳴器長(zhǎng)響一次,表示清除所有指紋結(jié)束
  476.                         modeflag=1;//進(jìn)入錄入指紋模式
  477.                         GotoXY(0,0);//x,y
  478.                         Print(Input);
  479.                         shownum(0);
  480.                         buzzer=0;
  481.                         delay1ms(800);
  482.                         buzzer=1;
  483.                         SaveNumber=0;
  484.                 }

  485.         }////////////////////////////while(1)結(jié)束////////////////////////////////
  486.         
  487. }


  488. void int0(void) interrupt 0//中斷0,清除所有指紋
  489. {
  490.         if(k3==0) //清除所有指紋
  491.                 {
  492.                         delay1ms(10);
  493.                         if(k3==0)//如果仍為低電平,表示按鍵有效
  494.                         {
  495.                                 while(k3==0);//等待松手        
  496.                                 clearallflag=1;
  497.                         }        
  498.                 }        
  499. }

  500. void  Timer0(void) interrupt 1//定時(shí)器0中斷函數(shù)
  501. {
  502.          TL0=0x97;
  503.         TH0=0xBD;
  504.         clk0++;   //延時(shí)17ms
  505. }


  506. void int1(void) interrupt 2//外部中斷1,模式轉(zhuǎn)換鍵按下
  507. {
  508.         if(k1==0)//模式轉(zhuǎn)換 其中用modeflag 來(lái)標(biāo)志,默認(rèn)從第1個(gè)指紋開(kāi)始錄入
  509.         {
  510.           delay1ms(10);        
  511.           if(k1==0)//如果仍為低電平,表示按鍵有效
  512.                   {
  513.                         while(k1==0);//等待松手
  514.                         changeflag=1;//表示模式有變化,即K1鍵按下
  515.                          modeflag=~modeflag;//0表示錄入指紋  1表示識(shí)別指紋
  516.                          changeState();//看一下是不是要顯示狀態(tài)轉(zhuǎn)換
  517.                          if(modeflag==0)//根據(jù)模式改變當(dāng)前模式指示燈的顏色
  518.                          {
  519.                                 green=0;                red=1;         //錄入指紋綠燈亮
  520.                          }
  521.                          else
  522.                          {
  523.                                 red=0;                 green=1;  //指紋識(shí)別紅燈燈亮
  524.                          }
  525.                 }        
  526.         }        
  527. }
復(fù)制代碼

1602 指紋識(shí)別 程序.rar

54.92 KB, 下載次數(shù): 92, 下載積分: 黑幣 -5

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏5 分享淘帖 頂 踩
回復(fù)

使用道具 舉報(bào)

沙發(fā)
ID:58591 發(fā)表于 2019-11-15 15:58 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

板凳
ID:243394 發(fā)表于 2019-11-16 12:48 | 只看該作者
看起來(lái)很NB
回復(fù)

使用道具 舉報(bào)

地板
ID:661575 發(fā)表于 2019-12-22 09:41 | 只看該作者
感謝分享
回復(fù)

使用道具 舉報(bào)

5#
ID:666748 發(fā)表于 2019-12-22 16:00 | 只看該作者
請(qǐng)問(wèn)里面有原理圖嗎?
回復(fù)

使用道具 舉報(bào)

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表
主站蜘蛛池模板: 日韩欧美网 | 久色网| 一级毛片视频在线观看 | 国产三级国产精品 | 免费高潮视频95在线观看网站 | 鸳鸯谱在线观看高清 | 欧美xxxx做受欧美 | 亚洲精品成人免费 | 性一交一乱一伦视频免费观看 | 亚洲精品久久久久久一区二区 | 国产乱码精品一区二区三区av | 337p日本欧洲亚洲大胆鲁鲁 | 国产一区二区三区免费 | 久色视频在线 | 亚洲精品欧美 | 国产高清视频一区二区 | 日日骚视频 | 日韩在线一区二区三区 | 中文字幕第十页 | 欧美日一区二区 | 成人国产免费视频 | 极品粉嫩国产48尤物在线播放 | 国产日韩一区二区 | 亚洲精品9999久久久久 | 久久精品久久综合 | 国产精品日韩欧美一区二区三区 | 在线国产一区 | 亚洲国产成人精品女人久久久 | 亚洲男人的天堂网站 | 欧美一级二级视频 | 久久午夜国产精品www忘忧草 | 免费黄色特级片 | 最新黄色在线观看 | 91av在线免费播放 | 成人免费视频在线观看 | 国产在线视频三区 | 亚洲一区二区中文字幕 | 91看片官网 | 欧美精品一二区 | 久久精品91久久久久久再现 | 亚洲视频在线一区 |