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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

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

FM1702與單片機讀卡寫卡通訊程序源碼+說明+注意事項+資料下載

[復制鏈接]
跳轉到指定樓層
樓主
51單片機驅動FM1702實現讀寫卡的資料包分享:


FM1702天線設計與電路設計及編程指南等:



程序使用說明:
1.程序用到的數碼管、FM1702、按鍵的所有引腳均有定義,如果用戶按照這個定義,程序上電后應該是數  碼管無顯示內容。
2.當有卡片靠近后,數碼管先顯示卡號序列號的高兩位,顯示大約2秒,然后讀取卡片的塊8的數值并顯示
  顯示時間大約為6秒
3.按鍵是雙功能鍵。按鍵2和3是充值和刷卡鍵,4是確認鍵,只有先按2或者3然后按4,否則直接按4程序  不會反應。當按了4后,此時按鍵2和3就變成增值或者減值按鍵,同時短按一下是增1或者減1,長按是  增10或者減10.確認了數值后,再次按4鍵,程序會根據你按得是充值鍵還是刷卡鍵進行響應的加或減運  算,并將運算后得值寫入塊8,然后再次讀取,并顯示在數碼管上。在你按鍵確認數值之前,數碼管會  顯示當前你的按鍵值是多少。
4.總結使用流程就是:放卡到讀卡器—按動2或3鍵—按4—再按2或3(長按短按效果不一樣,數碼管會顯  示)—再按4—卡拿開


不足之處:
1.沒有用到芯片自帶的E2PROM,所以程序沒有它的讀寫程序。
2.沒有用到卡的自增自減運算函數,這個涉及卡的控制字符,卡的資料有詳細,所以也沒寫
3.防衝突沒有實現那種公平的防衝突,此程序實現的是隨機選卡


注意事項:
網上關于射頻卡的資料很多關鍵的地方都沒有說明,類似SPI時序,寄存器讀寫指令,FIFO讀寫時間等等,所以下列幾點一定要注意,這是我在做這個時遇到的問題。
1.首先,spi時序,注意讀時和寫時的sck,以及左移函數的位置,很重要。也可以把SPI的讀和寫分開寫  ,會的自己試一下。
2.1702的寄存器讀寫并不是單純的把寄存器地址寫進去,而是有一定規則的。不論讀寫,寄存器都是先左  移一位,即有效的六位地址(做的時候你就明白為什麼是六位)處于一個字節的中間,最低位不論讀寫  都為0,高位當讀時是1,寫時是0,這點非常重要,查遍所有資料,都沒有這點。
3.1702初始化時,按照pdf所給的啟動步驟來,當時我覺得最后一條轉換線性尋址好像沒用到,所以沒寫  ,結果怎麼也不好使,后來一加,什麼都好使了。這也是很關鍵的一點。
4.延時問題,當FIFO有數據要發送或者接受時,啟動0x1e命令后,根據FIFO字節數要加適當延時,這是很  關鍵的點,具體參考程序。


   大致就這些了,程序實現的功能比較簡單,后續我也許會加上12864,做成一個界面化的帶密碼修改,以及卡的識別的小型一卡通系統,類似于學校那種什麼飯卡、交通、圖書館、水卡的東西,如果做的話,我會把后續的傳上來。敬請期待....


51單片機源程序如下:

  1. #include<reg52.h>
  2. #include<intrins.h>
  3. #include<FM1702.h>
  4. #define uchar  unsigned char
  5. #define uint   unsigned int

  6. uchar Fbuff[16];                               //發送FIFO緩存
  7. uchar Jbuff[16];                              //接收FIFO緩存
  8. uchar UID[7];                                      //卡型及卡號
  9. uchar Data[4];                                  //按鍵值存儲區
  10. uchar code  seg[16]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E}; //數碼管段選對應0~f
  11. uchar count=0           ;                         //按鍵回傳的值
  12. uchar shuaka,chongzhi,keyflag=0;
  13. sbit k2=P3^5;                                         //充值‘加值鍵(實現加1或者加10)
  14. sbit k3=P3^2;                                         //刷卡’減值鍵(實現減1或者減10)
  15. sbit k4=P3^3;                                       //確認鍵
  16. sbit nWR=P2^4;                                      //74hc373片選
  17. /*****************1702函數聲明**************************/
  18. uchar spi(uchar m);
  19. void  fifo_clear();
  20. void  resig_write(uchar reg,uchar da);
  21. uchar resig_read(uchar reg);
  22. uchar  fifo_read(uchar count,uchar *s);
  23. void  fifo_write(uchar count,uchar *s);
  24. uchar inti_1702();
  25. void  card_halt();
  26. uchar request();
  27. uchar card_anticoll();
  28. uchar card_select();
  29. uchar card_authtication(uchar m)         ;
  30. uchar card_read(uchar m);
  31. uchar card_write(uchar m);
  32. uchar loadkey();
  33. void  delay(uchar m);
  34. /********************按鍵顯示函數聲明***************/

  35. void display();
  36. void keyscan() ;
  37. void  data1deal() ;
  38. void  data2deal(uchar m);
  39. void lcdclear();
  40. /***********************子函數解釋******************/
  41. /*********************************************************/
  42. //解釋: 這是spi總線的讀寫時序,所有的寄存器操作基于此時序,非常重要
  43. //
  44. //
  45. //輸入:要寫入的16進制參數
  46. //
  47. //
  48. //輸出:內部傳回的16進制參數
  49. //
  50. /********************************************************/
  51. uchar spi(uchar m)
  52. {
  53.         uchar i,temp=0;
  54.         for(i=0;i<8;i++)
  55.         {
  56.                 sck=0;
  57.                 if(m&0x80)
  58.                 mosi=1;
  59.                 else
  60.                 mosi=0;
  61.                 m<<=1;
  62.                 sck=1;
  63.                 temp<<=1;
  64.                 if(miso)
  65.                 temp|=0x01;

  66.         }
  67.         sck=0;
  68.         mosi=0;
  69.         return  temp;
  70. }
  71. /*********************************************************/
  72. //解釋:寫寄存器函數
  73. //
  74. //
  75. //輸入:寄存器地址 以及要寫入的參數
  76. //
  77. //
  78. //輸出:
  79. //
  80. //注意。≡谒械馁Y料中都沒有給出寄存器尋址時的格式,下邊的有,看仔細了,如果連寄存器都找不到,后邊的就不用看了
  81. /********************************************************/
  82. void resig_write(uchar reg,uchar da)
  83. {
  84.         sck=0;
  85.         reg<<=1;
  86.         cs=0;
  87.         reg=reg&0x7e;
  88.         spi(reg);
  89.         spi(da);
  90.         cs=1;
  91. }
  92. /*********************************************************/
  93. //解釋:讀寄存器函數
  94. //
  95. //
  96. //輸入:寄存器地址
  97. //
  98. //
  99. //輸出:該寄存器目前的值
  100. //
  101. //注意!!讀寫寄存器時指令不一樣,仔細看。
  102. /********************************************************/
  103. uchar resig_read(uchar reg)
  104. {
  105.         uchar temp;
  106.         sck=0;
  107.         _nop_();
  108.         _nop_();
  109.         cs=0;
  110.         reg<<=1;
  111.         reg|=0x80;
  112.         spi(reg);
  113.         temp=spi(0x00);
  114.         cs=1;
  115.         return temp;
  116.         
  117. }
  118. /*********************************************************/
  119. //解釋:FIFO緩衝器的讀函數
  120. //
  121. //
  122. //輸入:讀取的字節個數 ,返回的值存放首地址
  123. //
  124. //
  125. //輸出:讀成功的話會返回真值,否則返回0
  126. //
  127. //
  128. /********************************************************/
  129. uchar fifo_read(uchar count,uchar *s)
  130. {
  131.         uchar i,temp;
  132.         temp=resig_read(FIFOLength);
  133.         if(temp<count)
  134.         return  0;
  135.         else
  136.         {
  137.                 for(i=0;i<count;i++)
  138.                 {                                       
  139.                         temp=resig_read(FIFODaTa);
  140.                         *(s+i)=temp;
  141.                 }               
  142.         }
  143.         return 1;
  144. }
  145. /*********************************************************/
  146. //解釋:FIFO緩衝器的寫函數
  147. //
  148. //
  149. //輸入:寫入的字節個數 ,要寫入的值的存放首地址
  150. //
  151. //
  152. //輸出:
  153. //
  154. //
  155. /********************************************************/
  156. void fifo_write(uchar count,uchar *s)
  157. {
  158.         uchar i,temp;
  159.         for(i=0;i<count;i++)
  160.         {
  161.                 temp=*(s+i);
  162.                 resig_write(FIFODaTa,temp);
  163.         }
  164. }
  165. /*********************************************************/
  166. //解釋:芯片FM1702初始化函數
  167. //
  168. //
  169. //輸入:
  170. //
  171. //
  172. //輸出:初始化成功的話返回真值,否則返回0
  173. //
  174. //
  175. //注意:初始化步驟非常重要,一定要按照使用手冊的啟動步驟來,參考所給pdf
  176. /********************************************************/
  177. uchar  inti_1702()
  178. {
  179.         uchar temp,i;
  180.         FM1702rst=1;
  181.         mosi=1;
  182.         sck=1;
  183.     delay(20);                        
  184.         FM1702rst=0;                                 
  185.         delay(20);
  186.         while(resig_read(Command));
  187.         resig_write(0x00,0x80);                              
  188.         temp=resig_read(Command);            
  189.         while(temp);
  190.         resig_write(0x00,0x00);                                           //切換到線性尋址(此命令非常重要,否則無法啟動發送 )
  191.         resig_write(TimerClock,0x0b);                           //address 2AH    /* 定時器週期設置寄存器 */   
  192.         resig_write(TimerControl,0x02);                           //address 2BH        /* 定時器控制寄存器 */   
  193.         resig_write(TimerReload,0x42);                       //address 2CH    /* 定時器初值寄存器 */         
  194.         resig_write(InterruptEn,0x7f);                    //address 06H    /* 中斷使能/禁止寄存器 */     
  195.         resig_write(InterruptRq,0x7f);          //address 07H    /* 中斷請求標識寄存器 */
  196.         resig_write(MFOUTSelect,0x02);                    //address 26H    /* mf OUT 選擇配置寄存器 */     
  197.         resig_write(TxControl,0x5b);                    //address 11H    /* 發送控制寄存器 */
  198.         resig_write(RxControl2,0x01);
  199.         resig_write(RxWait,0x07);
  200.            for(i=0;i<16;i++)
  201.         {
  202.                 Fbuff[i]=0;
  203.                 Jbuff[i]=0;
  204.         }
  205.         lcdclear() ;
  206.         if(temp==0x00)           
  207.         return 1;         
  208.         else
  209.         return 0;         
  210. }
  211. /*********************************************************/
  212. //解釋:延時函數,單次延時為5ms
  213. //
  214. //
  215. //輸入:要延時的次數
  216. //
  217. //
  218. //輸出:
  219. //
  220. //
  221. /********************************************************/
  222. void delay(uchar m)    //單次定時為10ms
  223. {
  224.         TMOD=0x01;
  225.         while(m--)
  226.                 {        
  227.                           TH0=0xfe;
  228.                          TL0=0x33 ;
  229.                         TR0=1;
  230.                         while(!TF0);
  231.                         TF0=0;
  232.                         TR0=0;
  233.                 }
  234.            
  235. }
  236. /*********************************************************/
  237. //解釋:卡的回應函數,判斷是否有卡在讀寫器跟前
  238. //
  239. //
  240. //輸入:
  241. //
  242. //
  243. //輸出:如果有卡在的話返回真值,否則返回0
  244. //
  245. //
  246. /********************************************************/
  247. uchar  request()
  248. {
  249.         uchar  temp;
  250.         resig_write(CRCResultLSB,0x63);
  251.         resig_write(CWConductance,0x3f);
  252.         resig_write(BitFraming,0x07);
  253.         resig_write(ChannelRedundancy,0x03);                  
  254.         temp=resig_read(Control);
  255.         temp=temp&0x7f;
  256.         resig_write(Control,temp);
  257.         resig_read(FIFOLength);
  258.         temp=resig_read(Control);
  259.         temp=temp|0x01;
  260.         resig_write(Control,temp);
  261.         Fbuff[0]=0x52;                           
  262.         fifo_write(1,Fbuff);                                                         
  263.         resig_write(Command,0x1e);               
  264.         delay(1);         
  265.         temp=resig_read(FIFOLength);
  266.         if(temp==0x02)
  267.         return 1;     
  268.         else
  269.         return 0;                           
  270. }
  271. /*********************************************************/
  272. //解釋:防衝突函數 (我所做的此函數沒有手冊的那種功能,只是實現了單卡交易功能)
  273. //
  274. //
  275. //輸入:
  276. //
  277. //
  278. //輸出:防衝突成功的話返回真值,否則返回0
  279. //
  280. //實現功能:如果有多張卡在讀卡器區域,只選中一張,并讀取驗證這張卡的ID,然后存儲
  281. /********************************************************/
  282. uchar card_anticoll()                                                        //防衝突函數
  283. {
  284.         uchar temp,i;
  285.         resig_write(DecoderControl,0x28);                        
  286.         resig_write(Control,0x08);
  287.         resig_write(ChannelRedundancy,0x03);
  288.         temp=resig_read(Control);
  289.         temp=temp|0x01;
  290.         resig_write(Control,temp);                          
  291.         Fbuff[0]=0x93;
  292.         Fbuff[1]=0x20;
  293.         fifo_write(2,Fbuff);
  294.         resig_write(Command,0x1e);
  295.         delay(2);                                                         
  296.         temp=resig_read(FIFOLength);         
  297.         if(temp==0x05)        
  298.         {
  299.                 temp=0;
  300.                 fifo_read(5,UID);
  301.                 delay(1);               
  302.                 for(i=0;i<5;i++)
  303.                 {
  304.                         temp=temp^UID[i];        
  305.                 }
  306.                 if(temp==0)
  307.                 return 1;
  308.                 else
  309.                 return 0;
  310.         }
  311.         else
  312.                  return 0;        
  313. }
  314. /*********************************************************/
  315. //解釋:選卡函數
  316. //
  317. //
  318. //輸入:
  319. //
  320. //
  321. //輸出:選卡成功的話返回真值,否則返回0
  322. //
  323. //實現功能:將要交易的卡號發給卡,如果回應正確則選卡成功
  324. /********************************************************/
  325. uchar   card_select()
  326. {
  327.         uchar i,temp;
  328.         resig_write(ChannelRedundancy,0x0f);
  329.         resig_write(Control,0x08);
  330.         temp=resig_read(Control);
  331.         temp=temp|0x01;
  332.         resig_write(Control,temp);
  333.         Fbuff[0]=0x93;
  334.         Fbuff[1]=0x70;
  335.         for(i=0;i<5;i++)
  336.         {
  337.                 Fbuff[i+2]=UID[i];
  338.         }        
  339.         fifo_write(7,Fbuff);
  340.         resig_write(Command,0x1e);
  341.         delay(2);
  342.         temp=resig_read(FIFOLength);   
  343.         if(temp==0x01)
  344.         return 1          ;
  345.         else
  346.         return 0         ;
  347. }
  348. /*********************************************************/
  349. //解釋:三重認證函數
  350. //
  351. //
  352. //輸入:要操作的塊號
  353. //
  354. //
  355. //輸出:如果三重認證的話返回真值,否則返回0
  356. //
  357. //實現功能:這是卡片與讀卡器之間的默認通信協議,次程序執行成功后才可以與卡進行交易
  358. /********************************************************/
  359. uchar    card_authtication(uchar m)
  360. {
  361.         uchar i,temp;
  362.         temp=resig_read(Control);
  363.         temp=temp|0x01;
  364.         resig_write(Control,temp);
  365.         Fbuff[0]=0x60;
  366.         Fbuff[1]=m;
  367.         for(i=0;i<4;i++)
  368.         {
  369.                 Fbuff[i+2]=UID[i];
  370.         }
  371.         fifo_write(6,Fbuff);
  372.         resig_write(InterruptEn,0xa5);
  373.         resig_write(Command,0x0c);
  374.         delay(2);
  375.         temp=resig_read(SecondaryStatus);
  376.         temp=temp&0x07;                                                
  377.         if(temp==0)
  378.         {
  379.                 temp=resig_read(Control);
  380.                 temp=temp|0x01;
  381.                 resig_write(Control,temp);
  382.                 resig_write(InterruptEn,0xa4);
  383.                 resig_write(Command,0x14);               
  384.                 delay(2);
  385.                 temp=temp=resig_read(Control);
  386.                 temp&=0x08;
  387.                 if(temp==0x08)
  388.                 return 1;
  389.                 else
  390.                 return 0;               
  391.         }
  392.         return  0;
  393. }
  394. /*********************************************************/
  395. //解釋:讀卡函數
  396. //
  397. //
  398. //輸入:要讀的考號
  399. //
  400. //
  401. //輸出:讀卡成功的話返回真值,否則返回0
  402. //
  403. //實現功能:讀取指定卡號的內容,并傳送給FIFO
  404. /********************************************************/
  405. uchar card_read(uchar m)
  406. {
  407.         uchar temp;
  408.         temp=resig_read(Control);
  409.         temp=temp|0x01;
  410.         resig_write(Control,temp);
  411.         resig_write(ChannelRedundancy,0x0f);
  412.         temp=resig_read(Control);
  413.         temp=temp|0x01;
  414.         resig_write(Control,temp);
  415.         Fbuff[0]=0x30;
  416.         Fbuff[1]=m;
  417.         fifo_write(2,Fbuff);
  418.         resig_write(Command,0x1e);
  419.         delay(0x04);                                       
  420.         temp=resig_read(FIFOLength);
  421.         if(temp==16)
  422.         {
  423.                
  424.                 fifo_read(16,Jbuff);        
  425.                 return 1;
  426.         }
  427.         else
  428.         return 0;        
  429. }
  430. /*********************************************************/
  431. //解釋:寫卡函數
  432. //
  433. //
  434. //輸入:要寫入的卡號
  435. //
  436. //
  437. //輸出:寫卡成功的話返回真值,否則返回0
  438. //
  439. //實現功能:將發送緩衝區的數據寫入指定的塊號
  440. /********************************************************/
  441. uchar  card_write(uchar m)
  442. {
  443.         uchar temp;
  444.         temp=resig_read(Control);
  445.         temp=temp|0x01;
  446.         resig_write(Control,temp);
  447.         Fbuff[0]=0xA0;
  448.         Fbuff[1]=m;
  449.         fifo_write(2,Fbuff);
  450.         resig_write(Command,0x1e);
  451.         delay(2);
  452.         temp=resig_read(FIFOLength);
  453.         if(temp==1)
  454.         {
  455.                 temp=resig_read(Control);
  456.                 temp=temp|0x01;
  457.                 resig_write(Control,temp);
  458.                 Fbuff[0]=Jbuff[0];
  459.                 fifo_write(16,Fbuff);
  460.                 resig_write(Command,0x1e);
  461.                 delay(10);        
  462.                 temp=resig_read(FIFOLength);
  463.                 if(temp==1)                        
  464.                 return 1;
  465.                 else
  466.                 return 0;
  467.         }
  468.         else
  469.         return 0;        
  470. }
  471. /*********************************************************/
  472. //解釋:加載密匙函數
  473. //
  474. //
  475. //輸入:
  476. //
  477. //
  478. //輸出:成功的話返回真值,否則返回0
  479. //
  480. //實現功能:建立與卡通信協議的第一步,將密匙發送給卡,驗證密匙是否成功,成功的話執行三重認證
  481. /********************************************************/
  482. uchar loadkey()
  483. {
  484.         uchar temp;
  485.         temp=resig_read(Control);
  486.         temp=temp|0x01;
  487.         resig_write(Control,temp);
  488.         fifo_write(12,changekey);
  489.         resig_write(Command,0x19);
  490.         delay(3);
  491.         temp=resig_read(ErrorFlag);
  492.         if(temp==0)
  493.         return 1;
  494.         else
  495.         return 0;
  496. }
  497. /*********************************************************/
  498. //解釋:設置卡的暫停態函數
  499. //
  500. //
  501. //輸入:
  502. //
  503. //
  504. //輸出:執行成功的話返回真值,否則返回0
  505. //
  506. //實現功能:將卡設置為終止交易態,若要再次交易必須從頭重新開始認證
  507. /********************************************************/
  508. void  card_halt()
  509. {
  510.         uchar temp;
  511.         resig_write(InterruptEn,0x7f);                        
  512.         resig_write(InterruptRq,0x7f);
  513.         resig_write(Command,0x00);
  514.         temp=resig_read(Control);
  515.         temp=temp|0x01;
  516.         resig_write(Control,temp);
  517.         Fbuff[0]=0x50;
  518.         Fbuff[1]=0x00;
  519.         fifo_write(2,Fbuff);
  520.         resig_write(InterruptEn,0xbd);
  521.         resig_write(Command,0x1e);
  522.         delay(2);
  523. }
  524. /****************按鍵顯示子函數解釋********************/
  525. /*********************************************************/
  526. //解釋:卡的高兩位序列號函數
  527. //
  528. //
  529. //輸入:
  530. //
  531. //
  532. //輸出:
  533. //
  534. //實現功能:將卡的高兩位序列號處理為16進制后存放在相應顯示區
  535. /********************************************************/
  536. void  data1deal()     //序列號處理
  537. {
  538.         uchar temp,i;
  539.         for(i=0;i<4;i++)
  540.         Data[i]=0;
  541.         temp=UID[3];
  542.         Data[1]=temp/16;
  543.            Data[0]=temp%16;
  544.         temp=UID[2];
  545.         Data[3]=temp/16;
  546.            Data[2]=temp%16;
  547. }
  548. /*********************************************************/
  549. //解釋:顯示數據處理函數
  550. //
  551. //
  552. //輸入:
  553. //
  554. //
  555. //輸出:
  556. //
  557. //實現功能:將要現實的數據處理為10進制后存放在相應顯示區
  558. /********************************************************/
  559. void  data2deal(uchar m)     //顯示數據及按鍵處理
  560. {
  561.         uchar i,temp;
  562.         for(i=0;i<4;i++)
  563.         Data[i]=0;
  564.         temp=m;
  565.         Data[0]=temp%10;
  566.         Data[1]=temp%100/10;
  567.         Data[2]=temp/100;        
  568. }
  569. /*********************************************************/
  570. //解釋:按鍵掃描函數
  571. //
  572. //
  573. //輸入:
  574. //
  575. //
  576. //輸出:輸出相應的交易種類以及交易數額(會在說明裡做詳細說明)
  577. //
  578. //
  579. /********************************************************/
  580. void keyscan()
  581. {
  582.         if(k2==0||k3==0)
  583.         {
  584.                 if(k2==0)
  585.                 {
  586.                         delay(100);
  587.                         if(k2==0)
  588.                         delay(250);
  589.                         if(keyflag==1)
  590.                         {
  591.                                 if(k2==1)
  592.                                 {
  593.                                         if(count==255)
  594.                                         count=0         ;
  595.                                         else
  596.                                         count++;        
  597.                                 }
  598.                                 if(k2==0)
  599.                                 {
  600.                                         while(!k2)
  601.                                         display();
  602.                                         if(count>=246)
  603.                                         count=count+11;
  604.                                         else
  605.                                         count=count+10;        
  606.                                 }        
  607.                         }
  608.                         else
  609.                         {
  610.                                 chongzhi=1;
  611.                                 shuaka=0;
  612.                         }
  613.                 }
  614.                 if(k3==0)
  615.                 {
  616.                         delay(100);
  617.                         if(k3==0)
  618.                         delay(250);
  619.                         if(keyflag==1)
  620.                         {
  621.                                 if(k3==1)
  622.                                 {
  623.                                         if(count==0)
  624.                                         count=255;
  625.                                         else
  626.                                         count--;        
  627.                                 }
  628.                                 if(k3==0)
  629.                                 {
  630.                                         while(!k3)
  631.                                         display();
  632.                                         if(count<=9)
  633.                                         count=245+count;
  634.                                         else
  635.                                         count=count-10;        
  636.                                 }        
  637.                         }
  638.                         else
  639.                         {
  640.                                 shuaka=1;
  641.                                 chongzhi=0;
  642.                         }
  643.                
  644.                 }        
  645.         }
  646.         if(k4==0)
  647.                 {
  648.                         delay(180);
  649.                         if(k4==0)
  650.                         keyflag=keyflag+1;
  651.                 }
  652. }
  653. /*********************************************************/
  654. //解釋:顯示函數
  655. //
  656. //
  657. //輸入:
  658. //
  659. //
  660. //輸出:
  661. //
  662. //
  663. /********************************************************/               
  664. void display()
  665. {        
  666.          unsigned char time=0;
  667.         nWR=0;
  668.         P2=0x0f;
  669.         WR=0;        
  670.         P0=seg[Data[3]];
  671.         WR=1;        
  672.         P2=0X0e;
  673.         time=5000;                        
  674.         while(time--);
  675.          
  676.         nWR=0;
  677.         P2=0x0f;
  678.         WR=0;        
  679.         P0=seg[Data[2]];
  680.         WR=1;        
  681.         P2=0X0d;
  682.         time=5000;                        
  683.         while(time--);         
  684.                   
  685.         nWR=0;
  686.         P2=0x0f;
  687.         WR=0;        
  688.         P0=seg[Data[1]];
  689.         WR=1;        
  690.         P2=0X0b;
  691.         time=5000;                        
  692.         while(time--);
  693.                  
  694.         nWR=0;
  695.         P2=0x0f;
  696.         WR=0;        
  697.         P0=seg[Data[0]];
  698.         WR=1;        
  699.         P2=0X07;
  700.         time=5000;                        
  701.         while(time--);        
  702.         
  703. }
  704. /*********************************************************/
  705. //解釋:lcd清屏函數
  706. //
  707. //
  708. //輸入:
  709. //
  710. //
  711. //輸出:
  712. //
  713. /********************************************************/
  714. void lcdclear()
  715. {
  716.          nWR=0;
  717.         P2=0x0f;
  718.         WR=0;        
  719.         P0=0xff;
  720.         WR=1;        
  721.         P2=0X0e;
  722.          
  723.         nWR=0;
  724.         P2=0x0f;
  725.         WR=0;        
  726.         P0=0xff;
  727.         WR=1;        
  728.         P2=0X0d;

  729.         nWR=0;
  730.         P2=0x0f;
  731.         WR=0;        
  732.         P0=0xff;
  733.         WR=1;        
  734.         P2=0X0b;
  735.                  
  736.         nWR=0;
  737.         P2=0x0f;
  738.         WR=0;        
  739.         P0=0xff;
  740.         WR=1;        
  741.         P2=0X07;

  742. }
  743. /*****************************主函數****************************/
  744. void  main()
  745. {
  746.         uchar temp,p,i,j;

  747.         temp=inti_1702();        
  748.         while(1)
  749.         {
  750.                 switch(temp)
  751.                 {
  752.                         case 0:        p=inti_1702();if(p) temp++;else temp=0;break;
  753.                         case 1: p=request(); if(p) {temp++;led5=~led5;}else temp=1;break;
  754.                         case 2: p=card_anticoll(); if(p){ temp++;led6=~led6;}else temp=1;break;
  755.                         case 3:        p=card_select(); if(p)  temp++; else temp=1;break;
  756.                         case 4:        p=loadkey();if(p){temp++;led7=~led7;} else temp=1;break;
  757.                         case 5:        p=card_authtication(PICC_BLOCK);if(p){ temp++;led8=~led8;}else temp=1;break;
  758.                         case 6: p=card_read(PICC_BLOCK);
  759.                         if(p)
  760.                         {
  761.                                 temp++;
  762.                                 data1deal();
  763.                                 for(i=0;i<2;i++)
  764.                                 for(j=0;j<150;j++)
  765.                                 display();
  766.                                 data2deal(Jbuff[0]);
  767.                                 i=10;
  768.                                 j=200;
  769.                                 while(i--)
  770.                                 {        
  771.                                         while(j--)
  772.                                         {        display();
  773.                                                 keyscan();
  774.                                                 if(shuaka||chongzhi)
  775.                                                 {        data2deal(count);
  776.                                                         display();
  777.                                                         if(keyflag==0x02)
  778.                                                         {
  779.                                                                 if(shuaka)
  780.                                                                 Jbuff[0]=Jbuff[0]-count        ;
  781.                                                                 if(chongzhi)
  782.                                                                 Jbuff[0]=Jbuff[0]+count;
  783.                                                                 keyflag=0;
  784.                                                                 shuaka=0;
  785.                                                                 chongzhi=0;
  786.                                                                 count=0;        
  787.                                                                 j=0;
  788.                                                                 i=0;
  789.                                                         }
  790.                                                           else
  791.                                                         j=100;
  792.                                                 }
  793.                                        
  794.                                         }
  795.                                 }
  796.                                 
  797.                         }
  798.                         else
  799.                         temp=0;break;
  800.                         case 7:        p=card_write(PICC_BLOCK);if(p){temp++;led9=~led9;} else temp=0;break;
  801.                         case 8:        p=card_read(PICC_BLOCK);
  802.                         if(p)
  803.                         {
  804.                                 temp++;
  805.                                 data1deal();
  806.                                 for(i=0;i<2;i++)
  807.                                 for(j=0;j<150;j++)
  808.                                 display();
  809.                                 data2deal(Jbuff[0]);
  810.                                 i=5;
  811.                                 j=200;
  812.                                 while(i--)
  813.                                 {        
  814.                                         while(j--)
  815.                                         display();
  816.                                 }
  817.                                 lcdclear() ;
  818.                         }
  819.                         else
  820.                         temp=0; break;
  821.                         case 9: card_halt();temp=0;break;
  822.                         default: break;
  823.                
  824.                 }
  825.         }
  826. }
復制代碼

所有資料51hei提供下載:
基於51的FM1702射頻卡.rar (3.26 MB, 下載次數: 94)


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

使用道具 舉報

沙發
ID:1 發表于 2018-11-6 02:25 | 只看該作者
好資料,51黑有你更精彩!!!
回復

使用道具 舉報

板凳
ID:593106 發表于 2020-5-12 17:14 | 只看該作者
感謝樓主分享,學習學習,參考參考
回復

使用道具 舉報

地板
ID:313854 發表于 2024-5-14 11:53 | 只看該作者
太感謝了,代碼好詳細
回復

使用道具 舉報

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

本版積分規則

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

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 免费精品 | 国产伦精品一区二区 | av在线免费网站 | av在线影院 | 色呦呦在线 | 精品免费看 | 成人在线视频观看 | 91成人在线 | 日韩欧美久久精品 | 一区二区三区不卡视频 | 国产精品1区 | 91午夜在线 | 在线视频91| av 一区二区三区 | 99reav| 亚洲成人一区二区 | 亚洲伊人a | 五月天国产在线 | 欧美一二三 | 欧产日产国产精品v | 国产乱码精品一品二品 | 亚洲视频中文字幕 | 亚洲精品一区二三区不卡 | 黄免费观看视频 | 国内激情av片 | 成人小视频在线观看 | 国产精品久久久久久久白浊 | 亚洲综合三区 | 国产精品99久久久久久动医院 | 精品国产一区一区二区三亚瑟 | aaa一区 | 亚洲精品乱码久久久久久久久久 | 三级黄色片在线播放 | 午夜电影网| 精品视频网 | 国产精品毛片久久久久久 | 看av片网站 | 国产成人精品久久二区二区91 | 亚洲国产aⅴ精品 | 欧美一区二区三区免费电影 | 中文字幕在线观看一区二区 |