OpenEdv-开源电子网

 找回密码
 立即注册
正点原子全套STM32/Linux/FPGA开发资料,上千讲STM32视频教程免费下载...
查看: 2277|回复: 7

如何让1702对一张卡只进行一次操作?

[复制链接]

13

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-8-7
在线时间
40 小时
发表于 2018-10-25 21:52:00 | 显示全部楼层 |阅读模式
30金钱
就是实现类似公交卡那种功能刷一下除非拿开否则不能再刷那种功能。
我用延时实现功能,但是系统不稳定,用标志位总觉得哪没考虑全。
#include "led.h"
#include "delay.h"
#include "sys.h"
#include "lcd.h"
#include "usart.h"  
#include "usb_lib.h"
#include "hw_config.h"
#include "usb_pwr.h"
#include "FM1702.h"
#include "stdio.h"
#include "string.h"
#include "rtc.h"
#include <stdlib.h>
#include <cstdlib>
unsigned char RevBuffer[32]; //RevBuffer&#189;óê&#213;oí·¢&#203;í&#187;o3&#229;&#199;&#248;        
extern uint8_t USB_Received_Flag;
uint8_t data[32];                        //USBêy&#190;Y&#187;o3&#229;
int main(void)
{
        unsigned int Money,Hundreds,Decade,Last;
    int i=0,j=0;
                   u8 flag =1,flag1=1;
        //unsigned char BuffKey[6] = {0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF};
    unsigned char buf[16],Buff1[16]={0x30,0x30,0x30,0x02,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};         //&#207;&#194;&#212;&#216;&#195;&#216;&#212;&#191;&#212;&#191;3×
    char shuju[3];
    u8 shuju2[16]={0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00};
        //unsigned char status;
       
       
        delay_init();        //&#209;óê±oˉêy3&#245;ê&#188;&#187;ˉ       
        NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//&#214;D&#182;&#207;·&#214;×ééè&#214;&#195;         
        uart_init(9600);//′&#174;&#191;ú3&#245;ê&#188;&#187;ˉ&#206;a9600
        LCD_Init();
        LED_Init();                //3&#245;ê&#188;&#187;ˉó&#235;LEDá&#172;&#189;óμ&#196;ó2&#188;t&#189;ó&#191;ú
       
          delay_ms(1800);
        USB_Port_Set(0);         //USB&#207;è&#182;&#207;&#191;a
        delay_ms(300);
           USB_Port_Set(1);        //USB&#212;ù′&#206;á&#172;&#189;ó
        //USB&#197;&#228;&#214;&#195;
        USB_Interrupts_Config();   
        Set_USBClock();   
        USB_Init();       
        FM1702_SPI_init();
    InitializeSystem();               

        while(RTC_Init())               
        {
                LCD_ShowString1(60,130,200,16,16,"RTC ERROR!   ");       
                delay_ms(800);
                LCD_ShowString1(60,130,200,16,16,"RTC Trying...");       
        }       

        TP_Init();//&#207;&#212;ê&#190;3&#245;ê&#188;&#187;ˉ
                while(1)
                {       
                        LCD_ShowNum(100,220,calendar.w_year,4,16);                                                                          
                        LCD_ShowNum(140,220,calendar.w_month,2,16);                                                                          
                        LCD_ShowNum(165,220,calendar.w_date,2,16);       
                        LCD_ShowNum(100,242,calendar.hour,2,16);                                                                          
                        LCD_ShowNum(130,242,calendar.min,2,16);                                                                          
                        LCD_ShowNum(160,242,calendar.sec,2,16);       
                        i++;j++;
                        if(j==5)
                        {
                               
                                TP_Clear();
                                j=0;
                                flag1=1;
                        }
                        if(i==5)
                        {
                                TP_Clear();
                                i=0;
                                flag=1;
                        }
                          if(RE_SELECT()==TYPE_SUCCESS)//&#209;&#182;&#191;¨&#187;&#189;D&#209;&#191;¨
                          {

                                if(Cmd_ex())//&#209;&#161;&#212;&#241;&#191;¨&#209;é&#214;¤&#195;ü&#194;&#235;       
                                {                 
                                         
                     LED0  = 1;
                     LED1 = 1;                                       
                                   if( Read(Buff1,13)==TYPE_SUCCESS)
                                   {
                                                shuju[0] = Buff1[0];
                                                shuju[1] = Buff1[1];
                                                shuju[2] = Buff1[2];
                                                 Money= atoi(shuju);
                                                   if(Money>=2)//×&#238;μí&#189;e&#182;&#238;
                                                {                                                       
                                                        if(Buff1[3]==0x01&&flag==1)
                                                        {
                                                                flag=0;

                                                                Money = Money-2;
                                                                Hundreds = Money/100%10;
                                                                Decade = Money%100/10;
                                                                Last = Money%10;
                                                               shuju2[0] = Hundreds+'0';
                                                                shuju2[1] = Decade+'0';
                                                                shuju2[2] = Last + '0';
                                                                shuju2[3] = Buff1[3];
                                                                memcpy(buf,&shuju2,4);
                                                                Write(shuju2,13);  
                                                                TP_Show(1,Money);                                                               
                                                        }
                                                       
                                                        else if(Buff1[3]==0x02&&flag1==1)
                                                        {
                                                                flag1=0;
                                                                Money = Money-1;
                                                                Hundreds = Money/100%10;
                                                                Decade = Money%100/10;
                                                                Last = Money%10;                       
                                                                shuju2[0] = Hundreds+'0';
                                                                shuju2[1] = Decade+'0';
                                                                shuju2[2] = Last + '0';
                                                                shuju2[3] = Buff1[3];
                                                                memcpy(buf,&shuju2,4);
                                                                Write(shuju2,13);
                                                                TP_Show(2,Money);                                                                          
                                                        }
                                                                delay_ms(300);
                                              }
                                                else
                                                {
                                                        LED1 = !LED1;
                                                }
                              }
                      }       
                                 else
                                 {
                                         LED0 = 0;
                                         delay_ms(200);
                                         LED0 = 0;

                                 }       
                 }                                             
        }       
}


正点原子逻辑分析仪DL16劲爆上市
回复

使用道具 举报

109

主题

5564

帖子

0

精华

资深版主

Rank: 8Rank: 8

积分
10572
金钱
10572
注册时间
2017-2-18
在线时间
1914 小时
发表于 2018-10-25 22:14:12 | 显示全部楼层
回复

使用道具 举报

530

主题

11万

帖子

34

精华

管理员

Rank: 12Rank: 12Rank: 12

积分
165540
金钱
165540
注册时间
2010-12-1
在线时间
2117 小时
发表于 2018-10-26 01:34:36 | 显示全部楼层
仿真找问题
回复

使用道具 举报

13

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-8-7
在线时间
40 小时
 楼主| 发表于 2018-10-26 11:47:48 | 显示全部楼层

没找到
回复

使用道具 举报

46

主题

200

帖子

0

精华

金牌会员

Rank: 6Rank: 6

积分
1128
金钱
1128
注册时间
2016-3-25
在线时间
365 小时
发表于 2018-10-26 12:00:22 | 显示全部楼层
可以用指令,指定具体那一张卡(ID)进入休眠,这样只有卡重新进入才可以操作。这多读一下数据手册 吧。
代写STM32各类驱动,DEMO程序
回复

使用道具 举报

13

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-8-7
在线时间
40 小时
 楼主| 发表于 2018-10-26 18:31:32 | 显示全部楼层
Mr.liu 发表于 2018-10-26 12:00
可以用指令,指定具体那一张卡(ID)进入休眠,这样只有卡重新进入才可以操作。这多读一下数据手册 吧。

0x26我休眠了然后还是能寻到卡。。。。
回复

使用道具 举报

13

主题

83

帖子

0

精华

初级会员

Rank: 2

积分
109
金钱
109
注册时间
2017-8-7
在线时间
40 小时
 楼主| 发表于 2018-10-26 18:32:01 | 显示全部楼层
Mr.liu 发表于 2018-10-26 12:00
可以用指令,指定具体那一张卡(ID)进入休眠,这样只有卡重新进入才可以操作。这多读一下数据手册 吧。

                  
                        while(1)
                        {       
                status=0xff;                               
                                status = Request(RF_CMD_REQUEST_STD);                    //寻卡
                                if(status == FM1702_OK)
                                {
                                        status = 0xff;
                                        status = AntiColl();
                                        if(status == FM1702_OK)
                                        {
                                                status = 0xff;
                                                status=Select_Card();
                                                if(status == FM1702_OK)
                                                {
                                                        status = 0xff;
                                                        status = Load_keyE2_CPY(DefaultKey);
                                                        if(status == TRUE)
                                                        {
                                                                status = 0xff;
                                                                status = Authentication(UID, 3, RF_CMD_AUTH_LB);
                                                                if(status == FM1702_OK)
                                                                {
                                                                        status = 0xff;
                                                                        status=MIF_READ(buf,12);
                                                                        if(status == FM1702_OK)
                                                                        {
                                                                                status = 0xff;
                                                                                status = MIF_Halt();
                                                                                printf("RFID读写一次成功");
                                                                        }
                                                                }
                                                        }
                                                }
                                        }
                                }                                        
                }
        }
回复

使用道具 举报

7

主题

45

帖子

0

精华

初级会员

Rank: 2

积分
125
金钱
125
注册时间
2016-4-3
在线时间
37 小时
发表于 2018-10-28 14:06:54 | 显示全部楼层
本帖最后由 jaems 于 2018-10-28 14:08 编辑

我是用flag 解决的,很稳定。 当读取到一个 ID时候 就检查ID缓存 如果缓存中的ID 和读取读取到的ID一样那么就忽略此次读取,如果和ID缓存中不一样那么就把ID存入ID缓存 然后对外送出这个ID  。当读取到空时候就清空ID缓存
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则



关闭

原子哥极力推荐上一条 /2 下一条

正点原子公众号

QQ|手机版|OpenEdv-开源电子网 ( 粤ICP备12000418号-1 )

GMT+8, 2025-6-21 05:49

Powered by OpenEdv-开源电子网

© 2001-2030 OpenEdv-开源电子网

快速回复 返回顶部 返回列表