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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 19312|回復: 14
打印 上一主題 下一主題
收起左側

51單片機mfrc522多功能門禁卡電子密碼鎖原理圖+源碼資料

  [復制鏈接]
跳轉到指定樓層
樓主
電路原理圖:


pcb布線:


使用說明
一、實現功能:5張卡
1、用戶密碼以及IC卡號和IC卡刷入序列號,保存到STC12C5A60S2的EEPROM中,掉電數據保存功能。
2、支持非接觸式IC卡授權功能,可連續授權(授權需輸入管理員密碼)。
3、支持手動選卡銷卡,支持單卡刷入銷卡,支持注銷所有卡(注銷所有卡需輸入管理員密碼)
4、自動識別非接觸式IC卡功能。如刷授權過的IC卡,提示“歡迎光臨”,顯示卡號并且開門,5秒后自動關門。如果刷未授權的IC卡,提示“該卡未授權”,顯示卡號不開門。
5、如忘記攜帶IC卡,可通過鍵盤手動輸入用戶密碼。密碼輸入錯誤顯示器會出現錯誤提示且繼電器不工作(不開門);若密碼輸入正確則繼電器工作(開門)。
6、支持手動更改用戶密碼(更改用戶密碼需輸入管理員密碼)
7、支持無卡時鐘顯示功能(功能:顯示年月日時分秒周,陰歷,天干地支,生肖,溫度,可改時間,具有掉電走時功能)
二、按鍵定義
如圖示:采用4X4鍵盤輸入,鍵盤對應名稱如下:
1  2  3  A
4  5  6  B
7  8  9  C
*  0  #  D
其中,    【0—9】為數字鍵,用于輸入相應的密碼,
          【*】號鍵為清除所有卡
          【A】鍵為返回功能
                          |->長按A鍵2秒可調時間,此時按下1鍵為選擇修改項,按下2鍵為加,按下3鍵為減,再次長按A鍵退出時間修改。
          【B】鍵為授權IC卡功能->提示輸入管理員密碼->輸入管理員密碼->刷入IC卡號->提示授權成功->是否繼續授權->按A鍵返回
          【C】鍵為注銷IC卡功能->提示刷入IC卡號->提示注銷成功->按A鍵返回
                              |->或按下#鍵 手動選擇卡注銷->按D鍵確認并退出
          【D】鍵為確認功能
          【#】號鍵為手動輸入密碼功能->提示輸入密碼->輸入密碼
                                    |->改密碼->提示輸入管理員密碼->輸入管理員密碼->改用戶密碼->輸入用戶密碼->確認并再次輸入->修改成功
提示:所有的輸密碼和改密碼功能,輸入三次錯誤后則退出輸入或修改功能,輸入或修改失敗。



單片機源程序如下:
  1. /*********************************
  2. 按鍵分布
  3. 1  2  3  A
  4. 4  5  6  B
  5. 7  8  9  C
  6. *  0  #  D
  7. 其中,    【0—9】為數字鍵,用于輸入相應的密碼,
  8.           【*】號鍵為清除所有卡
  9.           【A】鍵為返回功能
  10.           【B】鍵為授權IC卡功能
  11.           【C】鍵為注銷IC卡功能
  12.           【D】鍵為確認功能
  13.           【#】號鍵為手動輸入密碼功能
  14. 時鐘功能調時說明:長按A鍵2秒可調時間,此時按下1鍵為選擇修改項,按下2鍵為加,按下3鍵為減,再次長按A鍵退出時間修改
  15. ********************************************************************************************************/
  16. #include <stc12c5a60s2.h>
  17. #include <stdio.h>
  18. #include "spi.h"  
  19. #include "12864.h"  
  20. #include "eeprom.h"
  21. #include "mfrc522.h"  
  22. #include "uart.h"
  23. #include "KEYBOARD.h"
  24. #include "clock.h"
  25. #include "ds1302.h"

  26. #define IAP_ADDRESS1 0x0100        //用戶密碼起始地址
  27. #define IAP_ADDRESS  0x0200        //IC卡序列號起始地址

  28. uchar code administer_key[]={0,0,0,};//管理員卡密碼
  29. static uchar xdata IC_EEPROM[5][5];//存入EEPROM密碼 每行前4位為卡號 第5位為卡片輸入順序號
  30. static uchar xdata User_len; //用戶密碼長度
  31. static uchar xdata Userpassword[16];//用戶密碼
  32. static uchar xdata ICCODE[4];//返回卡號4位
  33. static uchar xdata Rec_Buffer[REC_BUFFER_SIZE];//串口接收緩沖區
  34. static uchar xdata RELAY_NUM=0;//開門計時變量
  35. static uchar xdata IC_NUM=0;//刷入卡的順序
  36. static uchar Recvd_Count;//串口已接收數據的個數
  37. bit  lock_ok=0;//密碼匹配標記
  38. bit  shouquan_flag=0;//授權標記
  39. bit  shoudongshuru_flag=0; //手動輸入密碼標記
  40. bit  IC_flag=0; //尋卡標記
  41. //bit  shanshuo;//較表時閃爍用                                                                                                                                                       
  42. void io_init()                                                                                                                                 
  43. {
  44. //P0M1=0XFF;//開漏模式
  45. //P0M0=0XFF;
  46. P1M1=0XFF;//P1.7-P1.3開漏模式用于RC522;
  47. P1M0=0XFF;
  48. P2M1=0X00;//P2.7,P2.0推挽輸出模式
  49. P2M0=0X81;
  50. //P3M1=0X00;
  51. //P3M0=0XFF;
  52. P4SW=0x70;
  53. P4M1=0X00;//推挽模式
  54. P4M0=0XFF;
  55. }
  56. /****************************************************
  57. 函數名稱:bit Auto_Reader(void)
  58. 入口參數:無
  59. 出口參數:有卡返回0,無卡返回1
  60. 功能:尋卡
  61.        尋卡并在液晶屏上顯示序列號
  62. ****************************************************/
  63. bit Auto_Reader(void)
  64. {
  65. uchar temp[4];
  66. // uchar g_ucTempbuf1[16];
  67. // uchar code DefaultKey[6] = {0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF}; //初始密碼
  68. uchar i;
  69. uchar ID_ASC[8];                                                  
  70. if (MI_OK==PcdRequest(PICC_REQALL,temp))//尋卡,輸出為卡類型//*PICC_REQALL=0x52:尋天線區內所有符合14443A標準的卡  PICC_REQIDL=0x26:只尋未進入休眠狀態的卡                     
  71. {
  72.         if (MI_OK==PcdAnticoll(temp))//防沖撞處理,輸出卡片序列號,4字節
  73.         if (MI_OK==PcdSelect(temp)) //選擇卡片,輸入卡片序列號,4字節
  74.    //if (MI_OK==PcdAuthState(PICC_AUTHENT1A, 1, DefaultKey, temp)) //驗證密碼 輸出卡片序列號
  75.         //if(MI_OK==PcdRead(0, g_ucTempbuf1))//卡中第一塊數據內容
  76.         {
  77.             IC_flag=1;
  78.                 lcd_clear();
  79.         display_GB2312_string(3,1,"IC序列號:");
  80.                 for(i=0;i<4;i++) //卡ID號轉化成ASCII
  81.                 { ICCODE[i]=temp[i];
  82.                   if(temp[i]/16>9)        ID_ASC[i*2]=temp[i]/16+'7';
  83.                     else ID_ASC[i*2]=temp[i]/16+'0';       
  84.               if(temp[i]%16>9)        ID_ASC[i*2+1]=temp[i]%16+'7';
  85.                     else ID_ASC[i*2+1]=temp[i]%16+'0';
  86.                 }
  87.                 display_GB2312_string(5,1,ID_ASC);                          
  88.         }
  89.    return 0;
  90. }
  91. else
  92. {
  93.   BELL=0;return 1;
  94. }
  95. }
  96. /****************************************************
  97. 函數名稱:bit administer(void)  
  98. 入口參數:無
  99. 出口參數:密碼正確返回0,錯誤返回1
  100.            全局變量shouquan_flag :允許授權shouquan_flag=0;   不允許授權shouquan_flag=1;
  101. 功能:管理員
  102.        驗證系統密碼 用于授權管理、注銷全部卡管理、修改用戶密碼,三次輸入錯誤返回
  103. 調用函數:EEPROM.C   12864.c  KeyPro();  bit Auto_Reader(void);
  104. ****************************************************/
  105. bit administer(void)
  106. {
  107. uchar asterisk='*';
  108. uchar spacing =' ';
  109.     uchar temp=0,error=0,j=0,num=0,i=0,k=0;//
  110.         bit Flag; //比較位置
  111.         unsigned char passwordlength,PLEN;     //輸入密碼長度,實際密碼長度
  112.         unsigned char passwordtemp[16];        //最大輸入16個
  113.         PLEN=sizeof(administer_key)/sizeof(administer_key[0]);//用于計算出實際密碼長度
  114.         display_GB2312_string(1,1,"請輸入管理員密碼");
  115.     while(shouquan_flag==1)
  116.         {
  117.            temp=KeyPro();
  118.            if(temp!=0xff)
  119.            {
  120.                         if(i==0)    //輸入是第一個字符的時候需要把改行清空,方便觀看密碼
  121.                           display_GB2312_string(3,1,"                ");//清除該行
  122.                         if((i<16)&&(temp<=9))
  123.                           {
  124.                        passwordtemp[i]=temp;
  125.                        display_GB2312_string(3,i*8+1,&asterisk);//輸入的密碼用"*"代替
  126.                            i++;   //輸入數值累加
  127.                           }       
  128.                         if('*'==temp&&i>0)
  129.                           {
  130.                            i--;
  131.                            for(k=i;k<16;k++)
  132.                        display_GB2312_string(3,k*8,&spacing);//輸入用空格代替                          
  133.                           }       
  134.                         if('A'==temp)//退出
  135.                         {
  136.                           display_GB2312_string(3,1,"                ");//清除該行
  137.                           shouquan_flag=1;
  138.                           return 0;
  139.                         }               
  140.                         if(('D'==temp)|| (i==16))//輸入按鍵值D或者密碼輸入到最大值16,表示輸入結束,需要進行比對
  141.                          {
  142.                         passwordlength=i;  //計算輸入密碼長度
  143.                             i=0;  //計數器復位
  144.                             if(passwordlength==PLEN)//長度相等則比較,否則直接輸出錯誤
  145.                             {
  146.                              Flag=1;//先把比較位置1
  147.                                  
  148.                              for(j=0;j<PLEN;j++)//循環比較8個數值,如果有一個不等 則最終Flag值為0
  149.                                 Flag=Flag&&(passwordtemp[j]==administer_key[j]);//比較輸入值和已有密碼
  150.                          }
  151.                        if(Flag)//如果比較全部相同,標志位置1
  152.                            {
  153.                                 pass();
  154.                                 lcd_clear();
  155.                         error=0;//輸入正確則次數清零,重新計數
  156.                         Flag=0;      //清除正確標志
  157.                                 shouquan_flag=0;
  158.                                 return 0;
  159.                                 }
  160.                            else
  161.                             {
  162.                                  display_GB2312_string(3,1,"                ");//清除該行
  163.                                  display_GB2312_string(3,1,"Wrong! Retry!");//密碼錯誤,提示重新輸入
  164.                                  error++;//連續輸入錯誤,則次數累加
  165.                                  if(error==3)
  166.                                   {
  167.                                    display_GB2312_string(3,1,"                ");//清除該行
  168.                                    display_GB2312_string(3,1,"Wrong 3 times!");//密碼錯誤,提示重新輸入
  169.                                    delayms(1500);
  170.                                    shouquan_flag=1;
  171.                                    return 0;
  172.                                    //while(1);//停止該位置,重啟電源后才能輸入,實際實用中則需要等到一定時間后才能再次輸入。
  173.                                   }
  174.                                 }               
  175.                          }
  176.                  }
  177.        }               
  178. }                                                                                  
  179. /****************************************************
  180. 函數名稱:void shouquan(uchar key)
  181. 入口參數:key->按鍵值
  182. 出口參數:無
  183. 功能:授權
  184.        按下B鍵進入授權
  185.        流程->提示輸入系統密碼->輸入系統密碼->刷入IC卡號->提示是否繼續授權->按A鍵返回  (授權期間均可按A鍵返回)
  186. 調用函數:EEPROM.C   12864.c  KeyPro(); bit administer(); bit Auto_Reader(void);
  187. ****************************************************/
  188. void shouquan(uchar key)
  189. {
  190. uchar j=0,k=0,flag,flag1;
  191. if(key=='B')//授權檢測
  192. {
  193.    lcd_clear();
  194.    //Sent_Byte(IC_NUM);
  195.    shouquan_flag=1;   
  196.     while(administer());  //管理員返回0,密碼正確shouquan_flag=0
  197.          display_GB2312_string(1,1,"請刷入授權IC卡號");//密碼正確顯示的信息
  198.          if(IC_EEPROM[4][4]==5&&(shouquan_flag==0))//如果最后一位不是0XFF說明有卡刷入
  199.                 {
  200.                  display_GB2312_string(1,1,"IC卡超出5張請按C");
  201.                  display_GB2312_string(3,1,"IC卡超出5張請按*");
  202.                  shouquan_flag=1;
  203.                  delayms(2000);
  204.                 }          
  205.          else if(shouquan_flag==0) //刷卡授權
  206.           {       
  207.             flag1=1;
  208.             while(IC_NUM<5&&flag1==1)
  209.             {
  210.                     flag=1;
  211.                     while(flag) //刷入卡號,正確返回0,退出 并在LCD顯示
  212.                         {
  213.                            flag=Auto_Reader();
  214.                            if('A'==KeyPro())//退出
  215.                            {
  216.                                   flag=1;
  217.                                   flag1=0;
  218.                                   break;
  219.                            }
  220.                         }
  221.                         if(flag==0)
  222.                          {
  223.                              //delayms(1000);
  224.                                  IC_NUM++;
  225.                                  for(j=0;j<5;j++)
  226.                                  {
  227.                                   if(j<4)IC_EEPROM[IC_NUM-1][j]=ICCODE[j];//卡號
  228.                                   else   IC_EEPROM[IC_NUM-1][j]=IC_NUM;//刷入的順序
  229.                                   //Sent_Byte(IC_EEPROM[IC_NUM-1][j]);
  230.                                  }
  231.                                  IapEraseSector(IAP_ADDRESS);//清除數據
  232.                                  for(j=0;j<5;j++)//5行
  233.                                   for(k=0;k<5;k++)//5列
  234.                                   {       
  235.                                    IapProgramByte(IAP_ADDRESS+j*5+k,IC_EEPROM[j][k]);//寫入數據
  236.                                    //Sent_Byte(IC_EEPROM[j][k]);
  237.                                   }
  238.                                  for(j=0;j<5;j++)//5行
  239.                                   for(k=0;k<5;k++)//5列
  240.                                   {
  241.                                           IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出數據
  242.                                         //Sent_Byte(IC_EEPROM[j][k]);
  243.                                   }
  244.                                  pass();
  245.                                  if(IC_NUM<5)
  246.                                  {
  247.                                           delayms(1000);
  248.                                           lcd_clear();
  249.                                           display_GB2312_string(1,1,"IC卡授權成功   ");       
  250.                                           display_GB2312_string(3,1,"是否繼續刷入   ");
  251.                                           display_GB2312_string(5,1,"繼續請刷卡     ");
  252.                                           display_GB2312_string(7,1,"停止請按’A‘鍵  ");                                  
  253.                                  }
  254.                                  else
  255.                                  {
  256.                                   delayms(1000);
  257.                                   lcd_clear();
  258.                                   display_GB2312_string(1,1,"IC卡存儲到5張  ");
  259.                                   delayms(2000);
  260.                                  }
  261.                          }            
  262.             }          
  263.           }
  264.         }                      
  265. }
  266. /****************************************************
  267. 函數名稱:void zhuxiao_all(uchar key)
  268. 入口參數:key->按鍵值
  269. 出口參數:無
  270. 功能:注銷所有IC卡
  271.    按下*鍵為注銷IC卡功能->提示輸入系統密碼->輸入系統密碼->確定注銷全部卡->注銷成功->自動返回  (注銷期間均可按A鍵返回)
  272. 調用函數:EEPROM.C   12864.c  KeyPro(); administer();
  273. ****************************************************/
  274. void zhuxiao_all(uchar key)
  275. {
  276.   uchar j,k;
  277.    if(key=='*')
  278.    {       
  279.     lcd_clear();
  280.     shouquan_flag=1;   
  281.     while(administer());  //管理員返回0,密碼正確shouquan_flag=0
  282.         key=0xff;
  283.         while(key!='*'&&shouquan_flag==0)
  284.         {
  285.           if(key=='A') break;
  286.           key=KeyPro();
  287.           display_GB2312_string(1,1,"是否注銷所有IC卡");
  288.           display_GB2312_string(3,1,"確定請按'*'號鍵");
  289.         }
  290.          if(shouquan_flag==0&&key=='*')
  291.          {          lcd_clear();
  292.                           IC_NUM=0;
  293.                           pass();
  294.                           display_GB2312_string(1,1,"注銷所有IC卡  ");
  295.                           delayms(1000);
  296.                           IapEraseSector(IAP_ADDRESS);//清除數據
  297.                                  for(j=0;j<5;j++)//5行
  298.                                   for(k=0;k<5;k++)//4列
  299.                                    IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*4+k);//讀出數據
  300.                           display_GB2312_string(1,1,"注銷成功    ");
  301.                           delayms(1000);
  302.          }                        
  303.    }
  304. }
  305. /****************************************************
  306. 函數名稱:void shoudong_zhuxiao_one(uchar key)
  307. 入口參數:key->按鍵值
  308. 出口參數:無
  309. 功能:手動注銷單張IC卡
  310.       按#號鍵手動銷卡
  311.       流程->提示按下對應刷入的卡順序號->按下1-5按鍵選擇對應卡->提示確認注銷按相應按鍵->按D鍵確認并返回   (期間按A鍵不可退出手動銷卡模式)
  312. 調用函數:EEPROM.C   12864.c  KeyPro();
  313. ****************************************************/
  314. void shoudong_zhuxiao_one(uchar key)
  315. {
  316.    uchar key2,j,k,v,i;
  317.    uchar ID_ASC[9]={1,1,};
  318.    if(key=='#')
  319.    {
  320.         for(j=0;j<5;j++)//5行
  321.          for(k=0;k<5;k++)//5列
  322.          {
  323.                   IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出數據
  324.                 //Sent_Byte(IC_EEPROM[j][k]);
  325.          }
  326.          lcd_clear();
  327.     key2=0xff;
  328.         display_GB2312_string(1,1,"按對應順序號銷卡");       
  329.     while(key2!='D')//確認
  330.         {         
  331.          display_GB2312_string(3,1,"確認并退出請按D");
  332.          key2=KeyPro();
  333.          if(key2==1)     
  334.          {
  335.                 for(i=0;i<4;i++) //卡ID號轉化成ASCII
  336.                 {
  337.                   if(IC_EEPROM[0][i]/16>9)        ID_ASC[i*2]=IC_EEPROM[0][i]/16+'7';
  338.                     else ID_ASC[i*2]=IC_EEPROM[0][i]/16+'0';       
  339.               if(IC_EEPROM[0][i]%16>9)        ID_ASC[i*2+1]=IC_EEPROM[0][i]%16+'7';
  340.                     else ID_ASC[i*2+1]=IC_EEPROM[0][i]%16+'0';
  341.                 }
  342.                 //Sent_Buffer(ID_ASC,8);
  343.                 display_GB2312_string(5,1,ID_ASC);   
  344.                 display_GB2312_string(7,1,"注銷按1,返回按A ");
  345.                 key2=0xff;
  346.                 while(key2!=1)
  347.                 {
  348.                  key2=KeyPro();
  349.                  if(key2=='A')break;//退出
  350.                 }
  351.                 pass();
  352.                 if(key2==1)for(j=0;j<5;j++)IC_EEPROM[0][j]=0xff;
  353.          }
  354.          else if(key2==2)
  355.          {
  356.                 for(i=0;i<4;i++) //卡ID號轉化成ASCII
  357.                 {
  358.                   if(IC_EEPROM[1][i]/16>9)        ID_ASC[i*2]=IC_EEPROM[1][i]/16+'7';
  359.                     else ID_ASC[i*2]=IC_EEPROM[1][i]/16+'0';       
  360.               if(IC_EEPROM[1][i]%16>9)        ID_ASC[i*2+1]=IC_EEPROM[1][i]%16+'7';
  361.                     else ID_ASC[i*2+1]=IC_EEPROM[1][i]%16+'0';
  362.                 }
  363.                 //Sent_Buffer(ID_ASC,8);
  364.                 display_GB2312_string(5,1,ID_ASC);  
  365.                 display_GB2312_string(7,1,"注銷按2,返回按A ");
  366.                 key2=0xff;
  367.                 while(key2!=2)
  368.                 {
  369.                  key2=KeyPro();
  370.                  if(key2=='A')break;//退出
  371.                 }
  372.                 pass();
  373.                 if(key2==2)for(j=0;j<5;j++)IC_EEPROM[1][j]=0xff;
  374.          }
  375.          else if(key2==3)
  376.          {
  377.                 for(i=0;i<4;i++) //卡ID號轉化成ASCII
  378.                 {
  379.                   if(IC_EEPROM[2][i]/16>9)        ID_ASC[i*2]=IC_EEPROM[2][i]/16+'7';
  380.                     else ID_ASC[i*2]=IC_EEPROM[2][i]/16+'0';       
  381.               if(IC_EEPROM[2][i]%16>9)        ID_ASC[i*2+1]=IC_EEPROM[2][i]%16+'7';
  382.                     else ID_ASC[i*2+1]=IC_EEPROM[2][i]%16+'0';
  383.                 }
  384.                 //Sent_Buffer(ID_ASC,8);
  385.                 display_GB2312_string(5,1,ID_ASC);
  386.                 display_GB2312_string(7,1,"注銷按3,返回按A ");
  387.                 key2=0xff;
  388.                 while(key2!=3)
  389.                 {
  390.                  key2=KeyPro();
  391.                  if(key2=='A')break;//退出
  392.                 }
  393.                 pass();
  394.                 if(key2==3)for(j=0;j<5;j++)IC_EEPROM[2][j]=0xff;
  395.          }
  396.          else if(key2==4)
  397.          {
  398.                 for(i=0;i<4;i++) //卡ID號轉化成ASCII
  399.                 {
  400.                   if(IC_EEPROM[3][i]/16>9)        ID_ASC[i*2]=IC_EEPROM[3][i]/16+'7';
  401.                     else ID_ASC[i*2]=IC_EEPROM[3][i]/16+'0';       
  402.               if(IC_EEPROM[3][i]%16>9)        ID_ASC[i*2+1]=IC_EEPROM[3][i]%16+'7';
  403.                     else ID_ASC[i*2+1]=IC_EEPROM[3][i]%16+'0';
  404.                 }
  405.                 //Sent_Buffer(ID_ASC,8);
  406.                 display_GB2312_string(5,1,ID_ASC);
  407.                 display_GB2312_string(7,1,"注銷按4,返回按A ");
  408.                 key2=0xff;
  409.                 while(key2!=4)
  410.                 {
  411.                  key2=KeyPro();
  412.                  if(key2=='A')break;//退出
  413.                 }
  414.                 pass();
  415.                 if(key2==4)for(j=0;j<5;j++)IC_EEPROM[3][j]=0xff;
  416.          }
  417.          else if(key2==5)
  418.          {
  419.                 for(i=0;i<4;i++) //卡ID號轉化成ASCII
  420.                 {
  421.                   if(IC_EEPROM[4][i]/16>9)        ID_ASC[i*2]=IC_EEPROM[4][i]/16+'7';
  422.                     else ID_ASC[i*2]=IC_EEPROM[4][i]/16+'0';       
  423.               if(IC_EEPROM[4][i]%16>9)        ID_ASC[i*2+1]=IC_EEPROM[4][i]%16+'7';
  424.                     else ID_ASC[i*2+1]=IC_EEPROM[1][i]%16+'0';
  425.                 }
  426.                 //Sent_Buffer(ID_ASC,8);
  427.                 display_GB2312_string(5,1,ID_ASC);
  428.                 display_GB2312_string(7,1,"注銷按5,返回按A ");
  429.                 key2=0xff;
  430.                 while(key2!=5)
  431.                 {
  432.                  key2=KeyPro();
  433.                  if(key2=='A')break;//退出
  434.                 }
  435.                 pass();
  436.                 if(key2==5)for(j=0;j<5;j++)IC_EEPROM[4][j]=0xff;
  437.          }
  438.          display_GB2312_string(5,1,"                ");
  439.          display_GB2312_string(7,1,"                ");
  440.         }       
  441.         for(v=0,j=0;j<5;j++)//得到刷入的卡順序號
  442.          {
  443.                  if(0xff!=IC_EEPROM[j][4])       
  444.                  {
  445.                           for(k=0;k<5;k++)
  446.                           {                                  
  447.                        IC_EEPROM[v][k]=IC_EEPROM[j][k];//重新排列卡號
  448.                            //Sent_Byte(IC_EEPROM[v][k]);  
  449.                           }
  450.                           v++;                                            
  451.                  }                      
  452.          }       
  453.          IC_NUM=v;//Sent_Byte(IC_NUM);
  454.          for(j=0;j<5;j++)
  455.           for(k=0;k<5;k++)
  456.           {
  457.            if(j>=IC_NUM)IC_EEPROM[j][k]=0XFF;
  458.            else         IC_EEPROM[j][4]=j+1;
  459.           }
  460.          IapEraseSector(IAP_ADDRESS);//清除數據
  461.          delayms(10);
  462.          for(j=0;j<5;j++)//5行
  463.           for(k=0;k<5;k++)//5列
  464.           {       
  465.            IapProgramByte(IAP_ADDRESS+j*5+k,IC_EEPROM[j][k]);//寫入數據
  466.            //Sent_Byte(IC_EEPROM[j][k]);
  467.           }
  468.          delayms(10);
  469.          for(j=0;j<5;j++)//5行
  470.           for(k=0;k<5;k++)//5列
  471.           {
  472.            IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出卡數據
  473.            //Sent_Byte(IC_EEPROM[j][k]);
  474.           }       
  475.           pass();
  476.    }
  477. }
  478. /****************************************************
  479. 函數名稱:void zhuxiao_one(uchar key)
  480. 入口參數:key->按鍵值
  481. 出口參數:無
  482. 功能:持卡或手動注銷單張IC卡
  483.       按下C鍵進入持卡或手動注銷單張IC卡
  484. 調用函數:EEPROM.C   12864.c  KeyPro();   shoudong_zhuxiao_one();
  485. ****************************************************/
  486. void zhuxiao_one(uchar key)
  487. {
  488. uchar i,j,k,ok,flag,m=0,key1;
  489. if(key=='C')
  490. {          
  491.            // while(administer());  //管理員返回0,密碼正確shouquan_flag=0
  492.       lcd_clear();
  493.       display_GB2312_string(1,1,"   刷入注銷卡    ");
  494.           display_GB2312_string(3,1,"或按#鍵手動注銷  ");
  495.           flag=1;
  496.           key1=0xff;
  497.           while(flag==1&&key1!='A'&&key1!='#') //刷入卡號,正確返回0,退出 并在LCD顯示
  498.           {
  499.            flag=Auto_Reader();
  500.            key1=KeyPro();
  501.            if('A'==key1&&key1=='#')//退出
  502.            {
  503.                   flag=1;
  504.                   break;
  505.            }
  506.           }
  507.           if(key1=='#')
  508.           {
  509.            shoudong_zhuxiao_one(key1);
  510.            key1=0xff;
  511.           }
  512.           if(flag==0)//刷卡標記
  513.           {       
  514.             //IC_flag=0;  
  515.                 for(j=0;j<5;j++)//5行///比較刷入的是哪張卡
  516.                 {
  517.                   ok=1;
  518.               for(k=0;k<4;k++)//4列
  519.                   {         
  520.                     ok=ok&&(IC_EEPROM[j][k]==ICCODE[k]);
  521.                    //Sent_Byte(IC_EEPROM[j][k]);                  
  522.                   }
  523.                   if(ok==1)
  524.                   {
  525.                    ok=0;
  526.                    m=IC_EEPROM[j][4]+0X30;
  527.                    display_GB2312_string(7,1,"注銷卡序列號:     ");
  528.                    display_GB2312_string(7,105,&m);
  529.                    pass();
  530.                    delayms(1000);
  531.                    m=IC_EEPROM[j][4];
  532.                    //Sent_Byte(n);
  533.                    break;
  534.                    //goto addr1;
  535.                   }                  
  536.                  }
  537.                 //addr1:
  538.                 if(ok==0) //重新排列對齊數據
  539.                 {
  540.                   ok=1;
  541.                   i=0;
  542.                   //Sent_Byte(n);
  543.                   for(j=0;j<5;j++)//5行
  544.                   for(k=0;k<5;k++)//5列
  545.                   {
  546.                           IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出數據
  547.                         //Sent_Byte(IC_EEPROM[j][k]);
  548.                   }
  549.                   if(m==5)//如果是最后一張卡直接替換最后一個數據 前4個不用移位
  550.                           for(j=0;j<5;j++)
  551.                        IC_EEPROM[4][j]=0xff;//最后一個數據補oxff
  552.                   else        //不是最后一個卡   則進行數據移位
  553.                   {
  554.                           for(j=0;j<5;j++)//得到刷入的卡順序號
  555.                             {
  556.                                  if(m==IC_EEPROM[j][4])i+=1;                     
  557.                                   for(k=0;k<5;k++)
  558.                                   {                                  
  559.                            IC_EEPROM[j][k]=IC_EEPROM[i][k];//重新排列卡號
  560.                                    //Sent_Byte(IC_EEPROM[j][k]);
  561.                                   }       
  562.                                   i++;          
  563.                             }
  564.                           for(j=0;j<5;j++)IC_EEPROM[4][j]=0xff;//最后一個數據補oxff                        
  565.                           ok=1;
  566.                           for(j=0;j<5;j++)
  567.                           {
  568.                            ok=1;
  569.                            for(k=0;k<4;k++)
  570.                              ok=ok&&(IC_EEPROM[j][k]==0xff);
  571.                        if(ok==1)        IC_NUM=IC_EEPROM[j][4]=0xff;//無數據的存儲地址卡序號初始為0xff
  572.                            else         IC_NUM=IC_EEPROM[j][4]=j+1;          
  573.                           }                                    
  574.                   }         
  575.                    IapEraseSector(IAP_ADDRESS);//清除數據
  576.                  delayms(10);
  577.                  for(j=0;j<5;j++)//5行
  578.                   for(k=0;k<5;k++)//5列
  579.                   {       
  580.                    IapProgramByte(IAP_ADDRESS+j*5+k,IC_EEPROM[j][k]);//寫入數據
  581.                    //Sent_Byte(IC_EEPROM[j][k]);
  582.                   }
  583.                  delayms(10);
  584.                 for(j=0;j<5;j++)//5行
  585.                   for(k=0;k<5;k++)//5列
  586.                   {
  587.                    IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出卡數據
  588.                    //Sent_Byte(IC_EEPROM[j][k]);
  589.                   }                    
  590.                 for(j=0;j<5;j++)
  591.                  if(IC_EEPROM[j][4]!=0xff)        IC_NUM=IC_EEPROM[j][4];//讀出卡刷入順序
  592.                  if(IC_NUM==0xff)IC_NUM=0;
  593.                  //Sent_Byte(IC_NUM);
  594.                 }                        
  595.           }  
  596. }
  597. }
  598. /****************************************************
  599. 函數名稱:bit shudongshuru(uchar key)
  600. 入口參數:key->按鍵值
  601. 出口參數:正確返回0,錯誤返回1
  602. 功能:手動輸入用戶密碼、可改用戶密碼
  603.       按#鍵手動輸入密碼   *鍵后退清除一位   D鍵確定   A鍵退出  改用戶密碼時按B鍵授權后 方可更改
  604. 調用函數:EEPROM.C   12864.c  KeyPro();
  605. ***************************************************/
  606. bit shudongshuru(uchar key)
  607. {
  608. uchar asteris='*';
  609. uchar spacin =' ';
  610.     uchar key2=0,error=0,j=0,num=0,i=0,k=0,n=0;
  611.         bit Flag; //比較相等標記
  612.         unsigned char passwordlength;     //輸入密碼長度,實際密碼長度
  613.         unsigned char passwordtemp[16];        //最大輸入16個
  614.     unsigned char passwordlast[16];
  615.         if(key=='#')
  616.         {
  617.             lcd_clear();
  618.                 display_GB2312_string(1,1,"  請輸入密碼    ");
  619.                 display_GB2312_string(3,1,"或按B授權改密碼 ");
  620.             shoudongshuru_flag=1;
  621.             while(shoudongshuru_flag==1)
  622.                 {
  623.                    key2=KeyPro();
  624.                    if(key2=='A') return 1;
  625.                    if(key2!=0xff)
  626.                    {
  627.                                 if(i==0)    //輸入是第一個字符的時候需要把改行清空,方便觀看密碼
  628.                                   display_GB2312_string(5,1,"                ");//清除該行
  629.                                 if((i<16)&&(key2<=9))
  630.                                   {
  631.                                passwordtemp[i]=key2;
  632.                                   // Sent_Byte(key2);
  633.                                //display_graphic_5x7(5,i*8+1,xing);//輸入的密碼用"*"代替
  634.                                    display_GB2312_string(5,i*8+1,&asteris);//輸入的密碼用"*"代替
  635.                                    i++;   //輸入數值累加
  636.                                   }       
  637.                                 if('*'==key2&&i>0)
  638.                                   {
  639.                                    i--;
  640.                                    for(k=i;k<16;k++)
  641.                                display_GB2312_string(5,k*8,&spacin);//輸入用空格代替                          
  642.                                   }       
  643.                                 if('A'==key2)//退出
  644.                                   {
  645.                                     lcd_clear();
  646.                                     shoudongshuru_flag=0;
  647.                                     return 0;
  648.                                   }               
  649.                                 if(('D'==key2)|| (i==16))//輸入按鍵值15或者密碼輸入到最大值16,表示輸入結束,需要進行比對
  650.                                  {
  651.                                 passwordlength=i;  //計算輸入密碼長度
  652.                                     if(passwordlength==User_len)//長度相等則比較,否則直接輸出錯誤
  653.                                     {
  654.                                       Flag=1;//先把比較位置1                                         
  655.                                       for(j=0;j<User_len;j++)//循環比較數值,如果有一個不等 則最終Flag值為0
  656.                                           {
  657.                                              Flag=Flag&&(passwordtemp[j]==Userpassword[j]);//比較輸入值和已有密碼
  658.                                           }
  659.                                 }
  660.                                         i=0;  //計數器復位
  661.                                 if(Flag)//如果比較全部相同,標志位置1
  662.                                     {
  663.                                                   pass();
  664.                                              display_GB2312_string(5,1,"                ");//清除該行
  665.                                                  TR0=1;
  666.                                                  RELAY=0;
  667.                                          error=0;//輸入正確則次數清零,重新計數
  668.                                          Flag=0;      //清除正確標志
  669.                                                  shoudongshuru_flag=1;
  670.                                                  return 0;
  671.                                         }
  672.                                     else
  673.                                     {
  674.                                          display_GB2312_string(5,1,"                ");//清除該行
  675.                                          display_GB2312_string(5,1,"Wrong! Retry!   ");//密碼錯誤,提示重新輸入
  676.                                          error++;//連續輸入錯誤,則次數累加
  677.                                          if(error==3)
  678.                                           {
  679.                                            error=0;
  680.                                            lcd_clear();
  681.                                            display_GB2312_string(5,1,"禁止入內        ");//密碼錯誤,提示重新輸入
  682.                                            delayms(1500);
  683.                                            shoudongshuru_flag=0;
  684.                                            return 1;
  685.                                           }
  686.                                         }               
  687.                                  }
  688.                                  if(key2=='B') //授權修改用戶密碼
  689.                                  {
  690.                                    shouquan_flag=1;
  691.                                    lcd_clear();
  692.                                    while(administer()) //管理員返回0,密碼正確shouquan_flag=0
  693.                                    {
  694.                                      if(KeyPro()=='A')
  695.                                          {                                                   
  696.                                                 shoudongshuru_flag=0;
  697.                                                 return 1;
  698.                                          }                                     
  699.                                    }
  700.                                    if(shouquan_flag==0)display_GB2312_string(1,1,"  請輸入新密碼   ");//管理員密碼正確后的提示
  701.                                    if(shouquan_flag==1)//管理員密碼錯誤,或退出管理員時的提示
  702.                                    {
  703.                                         display_GB2312_string(1,1,"  請輸入密碼    ");
  704.                                         display_GB2312_string(3,1,"或按B授權改密碼 ");                                    
  705.                                    }
  706.                                    num=0;//輸入次數計數清零
  707.                                    n=0;        //輸入密碼長度計數清零
  708.                                    while(shouquan_flag==0)//管理員密碼正確進入密碼修改
  709.                                    {
  710.                                   key2=KeyPro();       
  711.                                           if(key2=='A')return 1;
  712.                                           if(key2!=0xff)
  713.                                           {
  714.                                                      if(n==0&&num==0)//第一次輸入并且是第一位密碼
  715.                                                   {
  716.                                                    display_GB2312_string(1,1,"  請輸入新密碼  ");
  717.                                                    display_GB2312_string(3,1,"                ");
  718.                                                   }
  719.                                                   if((n<16)&&(key2<=9))//按鍵為1-9 且密碼長度小于16位
  720.                                                   {
  721.                                                passwordtemp[n]=key2;
  722.                                                    Sent_Byte(key2);
  723.                                                display_GB2312_string(3,n*8+1,&asteris);//輸入的密碼用"*"代替
  724.                                                    n++;   //輸入數值累加
  725.                                                   }
  726.                                                   if('*'==key2&&n>0)//清除、后退一位
  727.                                                   {
  728.                                                    n--;
  729.                                                    for(k=n;k<16;k++)
  730.                                                display_GB2312_string(3,k*8,&spacin);//輸入用空格代替                          
  731.                                                   }       
  732.                                                   if(('D'==key2)||(n==16))//輸入按鍵值D或者密碼輸入到最大值16,表示輸入結束,需要進行比對       
  733.                                                   {
  734.                                                                if(num==0) //第一次輸入密碼
  735.                                                                 {
  736.                                                                 passwordlength=n;  //計算輸入密碼長度
  737.                                                                         for(n=0;n<passwordlength;n++)//暫時存儲
  738.                                                                         {
  739.                                                                           passwordlast[n]=passwordtemp[n];//轉存密碼
  740.                                                                           passwordtemp[n]=0;//清空當前
  741.                                                                         }
  742.                                                                         n=0;//計數器復位
  743.                                                                 display_GB2312_string(1,1," 請再次輸入密碼 ");
  744.                                                                         display_GB2312_string(3,1,"                ");//清除
  745.                                                                         num++;
  746.                                                                 }
  747.                                                             else if(passwordlength==n&&num==1)//第二次輸入密碼 長度相等則比較,否則直接輸出錯誤   
  748.                                                             {
  749.                                                                       Flag=1;//先把比較位置1                                         
  750.                                                                       for(j=0;j<passwordlength;j++)//循環比較數值,如果有一個不等 則最終Flag值為0
  751.                                                                         Flag=Flag&&(passwordlast[j]==passwordtemp[j]);//比較上次輸入值和現在密碼是否一樣
  752.                                                                           if(Flag==1)
  753.                                                                           {
  754.                                                                            //pass();
  755.                                                                            num=0;
  756.                                                                            shouquan_flag=0;
  757.                                                                            IapEraseSector(IAP_ADDRESS1); //清除
  758.                                                                            delayms(10);
  759.                                                                            IapProgramByte(IAP_ADDRESS1,n);//寫入密碼個數
  760.                                                                            for(n=1;n<=passwordlength;n++)//存儲
  761.                                                                                 {
  762.                                                                              IapProgramByte(IAP_ADDRESS1+n,passwordtemp[n-1]);//寫入密碼
  763.                                                                                  Sent_Byte(passwordtemp[n-1]);                                                                 
  764.                                                                                 }
  765.                                                                                 delayms(10);
  766.                                                                                 User_len=IapReadByte(IAP_ADDRESS1);//讀取密碼個數       
  767.                                                                                 Sent_Byte(User_len);                                                         
  768.                                                                                 for(n=1;n<=User_len;n++)
  769.                                                                                 {
  770.                                                                                  Userpassword[n-1]=IapReadByte(IAP_ADDRESS1+n); //讀取 密碼
  771.                                                                                  Sent_Byte(Userpassword[n-1]);                                                                 
  772.                                                                                 }
  773.                                                                            n=0;
  774.                                                                            display_GB2312_string(1,1,"  修改密碼成功   ");
  775.                                                                            delayms(1500);
  776.                                                                            num=0;
  777.                                                                            return 0;
  778.                                                                           }
  779.                                                                           else if(Flag==0)
  780.                                                                           {
  781.                                                                                   display_GB2312_string(3,1,"   請重新輸入   ");//清除
  782.                                                                                   display_GB2312_string(1,1,"  兩次輸入不同  ");//清除該行
  783.                                                                                   num=0;
  784.                                                                                   n=0;
  785.                                                                                   error++;//連續輸入錯誤,則次數累加
  786.                                                                                   if(error==3)
  787.                                                                                   {
  788.                                                    display_GB2312_string(3,1,"                ");//清除
  789.                                                                                    display_GB2312_string(1,1,"錯誤3次,修改失敗");//密碼錯誤,返回界面
  790.                                                                                    delayms(1500);
  791.                                                                                    shouquan_flag=1;
  792.                                                                                    return 1;
  793.                                                                                    //while(1);//停止該位置,重啟電源后才能輸入,實際實用中則需要等到一定時間后才能再次輸入。
  794.                                                                                   }
  795.                                                                           }       
  796.                                                          }
  797.                                                                  else if(num==1)
  798.                                                                  {
  799.                                                                           display_GB2312_string(3,1,"   請重新輸入   ");//清除
  800.                                                                           display_GB2312_string(1,1,"  兩次輸入不同  ");//清除該行
  801.                                                                           num=0;
  802.                                                                           n=0;
  803.                                                                           error++;//連續輸入錯誤,則次數累加
  804.                                                                           if(error==3)
  805.                                                                           {
  806.                                            display_GB2312_string(3,1,"                ");//清除
  807.                                                                            display_GB2312_string(1,1,"錯誤3次,修改失敗");//密碼錯誤,返回界面
  808.                                                                            delayms(1500);
  809.                                                                            shouquan_flag=1;
  810.                                                                            return 1;
  811.                                                                            //while(1);//停止該位置,重啟電源后才能輸入,實際實用中則需要等到一定時間后才能再次輸入。
  812.                                                                           }
  813.                                                                 }
  814.                                                   }
  815.                                           }
  816.                                    }
  817.                                  }
  818.                          }
  819.                }         
  820.         }
  821. }                                                                                                 
  822. /****************************************************
  823. 函數名稱:Timer0Init(void)
  824. 入口參數:無
  825. 出口參數:無
  826. 功能:          用于定時關閉門
  827. 調用函數:無
  828. ****************************************************/

  829. void Timer0Init(void)                //50毫秒@11.0592MHz
  830. {
  831.         AUXR &= 0x7F;                //定時器時鐘12T模式
  832.         TMOD &= 0xF0;                //設置定時器模式
  833.         TMOD |= 0x01;                //設置定時器模式
  834.         TL0 = 0x00;                //設置定時初值
  835.         TH0 = 0x4C;                //設置定時初值
  836.         TF0 = 0;                //清除TF0標志
  837.         ET0        = 1;                //允許定時器0中斷
  838.         TR0 = 0;                //定時器0開始計時
  839. }
  840. void Timer1Init(void)                //50毫秒@11.0592MHz
  841. {
  842.         AUXR &= 0xBF;                //定時器時鐘12T模式
  843.         TMOD &= 0x0F;                //設置定時器模式
  844.         TMOD |= 0x10;                //設置定時器模式
  845.         TL1 = 0x00;                //設置定時初值
  846.         TH1 = 0x4C;                //設置定時初值
  847.         TF1 = 0;                //清除TF1標志
  848.     ET1        = 1;                //允許定時器0中斷
  849.         TR1 = 0;                //定時器1開始計時
  850. }

  851. /****************************************************
  852. 函數名稱:主函數
  853. ****************************************************/
  854. main()
  855. {  
  856.     uchar key,j=0,k=0,n,i,sel=0;
  857.         unsigned long int display_data=0;
  858.         BELL=0;//關閉
  859.         RELAY=1;
  860.         io_init();//初始化引腳
  861.         UART_Init();//初始化UART通訊
  862.         rom_cs=1;
  863.     lcd_init();//初始化液晶屏
  864.         init_spi();//初始化SPI通訊
  865.         Timer0Init();//初始化定時器0關門用
  866.         Timer1Init();//初始化定時器1時鐘閃爍用
  867.         Ds1302_Init();
  868.         EA   =1;  //單片機中斷允許
  869.         //IapEraseSector(IAP_ADDRESS);//清除數據   卡數據
  870.         //IapEraseSector(IAP_ADDRESS1);//清除數據        用戶密碼
  871.         for(j=0;j<5;j++)//5行
  872.           for(k=0;k<5;k++)//4列
  873.             IC_EEPROM[j][k]=IapReadByte(IAP_ADDRESS+j*5+k);//讀出卡數據
  874.         for(j=0;j<5;j++)
  875.          if(IC_EEPROM[j][4]!=0xff)        IC_NUM=IC_EEPROM[j][4];//讀出卡刷入順序

  876.         User_len=IapReadByte(IAP_ADDRESS1);//讀取用戶密碼個數
  877.         //Sent_Byte(User_len);
  878.         if(User_len==0xff)User_len=6;//初始化用戶密碼長度6位
  879.         //Sent_Byte(User_len);                                                                 
  880.         for(k=1;k<=User_len;k++) //讀取用戶密碼
  881.         {
  882.                   i=IapReadByte(IAP_ADDRESS1+k); //讀取用戶密碼
  883.                 if(i==0xff)Userpassword[k-1]=0;//初始話用戶密碼為000000
  884.                 else Userpassword[k-1]=i;
  885.         }
  886.         // for(j=0;j<6;j++)Sent_Byte(Userpassword[j]);       

  887.         PcdReset();        //初始化射頻芯片
  888.         PcdAntennaOff();
  889.         PcdAntennaOn();  
  890.         delayms(100);
  891.         PcdReset();//復位芯片,打開天線   
  892.         PcdAntennaOff();
  893.         PcdAntennaOn();  
  894.     //M500PcdConfigISOType( 'A' );//設置RC632的工作方式
  895.     //Delay_ms(100);
  896.         lcd_clear();
  897.     while(1)
  898.         {                    
  899.                   key=KeyPro();//按鍵檢測          
  900.                   if(key!=0xff)
  901.                   {
  902.                     IC:if(key=='#')shudongshuru(key);//手動輸入密碼
  903.                            if(key=='C')zhuxiao_one(key);//注銷單張卡 持卡注銷
  904.                            if(key=='*')zhuxiao_all(key);//注銷所有卡
  905.                            if(key=='B')shouquan(key);//授權卡
  906.                            IC_flag=0;
  907.                            lcd_clear();           
  908.                   }                  
  909.                   Auto_Reader();
  910.                   if(IC_flag==1)//刷卡標記
  911.                   {               
  912.                         display_GB2312_string(1,1,"   歡迎光臨 ! ");
  913.                             IC_flag=0;  
  914.                                 //for(n=0;n<4;n++)Sent_Byte(ICCODE[n]);       
  915.                                 for(j=0;j<5;j++)//5行
  916.                                 {
  917. ……………………

  918. …………限于本文篇幅 余下代碼請從51黑下載附件…………
復制代碼

所有資料51hei提供下載:

代碼.rar (197.69 KB, 下載次數: 516)
RFID.pdf (626.12 KB, 下載次數: 325)


評分

參與人數 2黑幣 +55 收起 理由
北風搖曳 + 5 很給力!
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏26 分享淘帖 頂4 踩
回復

使用道具 舉報

沙發
ID:353057 發表于 2018-8-25 09:26 | 只看該作者
厲害了,
回復

使用道具 舉報

板凳
ID:32627 發表于 2018-8-28 06:29 | 只看該作者
下載下來看看。
回復

使用道具 舉報

地板
ID:450873 發表于 2018-12-20 17:35 | 只看該作者
資料很好,很全就是有些地方不是很懂。。。
回復

使用道具 舉報

5#
ID:452539 發表于 2018-12-23 12:19 | 只看該作者
厲害了,這個我更需要。管理給我金幣讓我下載一個吧
回復

使用道具 舉報

6#
ID:452539 發表于 2019-1-14 22:44 | 只看該作者
怎么把軟件中特殊的12864改成普通的20腳的12864呢?
回復

使用道具 舉報

7#
ID:481841 發表于 2019-2-27 22:08 | 只看該作者
厲害厲害學習一下
回復

使用道具 舉報

8#
ID:481841 發表于 2019-2-27 22:08 | 只看該作者
這個資料很好有價值
回復

使用道具 舉報

9#
ID:236645 發表于 2019-4-3 09:07 | 只看該作者
很有價值 看一看
回復

使用道具 舉報

10#
ID:164146 發表于 2019-4-17 12:16 | 只看該作者
厲害了。正好需要,下載一個看看。
回復

使用道具 舉報

11#
ID:226505 發表于 2019-5-12 01:40 來自手機 | 只看該作者
好   eeprom部分的授權  注銷借用了一下  能用 謝謝樓主
回復

使用道具 舉報

12#
ID:258222 發表于 2019-9-11 14:08 | 只看該作者
好東西,大家驗證過么?好用不?
回復

使用道具 舉報

13#
ID:726617 發表于 2020-4-14 15:53 來自手機 | 只看該作者
樓主能加個聯系方式提供下代碼嘛?
回復

使用道具 舉報

14#
ID:879662 發表于 2021-1-26 08:50 | 只看該作者
樓主這個代碼實現需要什么型號的單片機
回復

使用道具 舉報

15#
ID:1025855 發表于 2022-5-14 17:38 | 只看該作者
下來看看。希望有效
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲高清在线免费观看 | 欧美一级二级在线观看 | 中文字幕 在线观看 | 日韩波多野结衣 | 九九久久久 | 久久久九九九九 | 极品一区| 亚洲国产精品成人无久久精品 | 欧美精品国产精品 | 亚洲国产精品一区二区三区 | 欧美日韩久 | 日本电影网站 | 色播av| 欧美日韩亚洲国产 | 日本在线精品视频 | 精品久久久久久久 | 国产精品成av人在线视午夜片 | 国产97在线视频 | 日本午夜在线视频 | 啪啪av| 亚洲国产成人在线观看 | 国产精品久久久久婷婷二区次 | 特级生活片 | 九九爱这里只有精品 | 在线视频a | 日韩在线精品视频 | 国产九九精品视频 | 天天影视色综合 | 国产精品久久久久久久久久三级 | 国产日韩欧美在线观看 | 亚洲精品视频导航 | 在线免费黄色小视频 | 国产欧美精品一区二区色综合朱莉 | 美女视频. | 亚洲欧美综合精品久久成人 | 成人午夜精品 | 久久99精品久久久久久秒播九色 | 超碰97人人人人人蜜桃 | 日韩中文在线视频 | 春色av | 久久亚洲国产精品 |