main.c
上传用户:njxy551199
上传日期:2022-04-06
资源大小:1990k
文件大小:7k
源码类别:

RFID编程

开发平台:

C/C++

  1. #include <stdio.h>
  2. #include <intrins.h>
  3. #include "main.h"  
  4. #include "hy502.h"
  5. #include "lcdd.h"
  6. // SPI 总线状态定义
  7. #define SPI_RDY  0xF0;   // 准备
  8. #define spibusy  0xaa   // 忙
  9. #define spiread  0xbb   // 读
  10. #define spiwrite 0xcc   // 写
  11. /////////////////////////////////////////////////////////////////////////////////////////////////////
  12. // 延时函数
  13. void delay(unsigned int x)
  14. {
  15. while(x)
  16. {
  17. x--;
  18. }
  19. }
  20.  
  21. ///////////////////////////////////////////////////////////////////////
  22. // Delay 1ms
  23. ///////////////////////////////////////////////////////////////////////
  24. void delay_1ms (uint _1ms)
  25. {
  26.   RCAP2LH = RCAP2_1ms;
  27.   T2LH    = RCAP2_1ms;
  28.   ET2 = 0;    // Disable timer2 interrupt
  29.   T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
  30.   while (_1ms--)
  31.   {
  32. while (!TF2);
  33. TF2 = FALSE;
  34.   }
  35.   TR2 = FALSE;
  36. }
  37. ///////////////////////////////////////////////////////////////////////
  38. // Delay 10ms
  39. ///////////////////////////////////////////////////////////////////////
  40. void delay_10ms(unsigned int _10ms)
  41. {
  42.   RCAP2LH = RCAP2_10ms;
  43.   T2LH    = RCAP2_10ms;
  44.   ET2 = 0;    // Disable timer2 interrupt
  45.   T2CON = 0x04; // 16-bit auto-reload, clear TF2, start timer
  46.   while (_10ms--)
  47.   {
  48. while (!TF2)
  49. {
  50.  if(g_bReceCommandOk)  // change by lin 2006-08-21
  51.   {
  52. TR2 = FALSE;
  53. TF2 = FALSE;
  54. return;
  55.    }
  56. }
  57. TF2 = FALSE;
  58.   }
  59.   TR2 = FALSE;
  60. }
  61.  
  62. /******************* SPI FUNCTION DEFINE ************************************/
  63. /*****************************************************************************
  64. *function: send a byte over SPI bus
  65.  发送一个字节
  66. *****************************************************************************/
  67. unsigned char SPIRWByte(unsigned char cSendByte)
  68. {
  69. unsigned char data i = 8;
  70. unsigned char cRecByte;
  71. while (i--)
  72. {
  73. cRecByte += cRecByte;    //左移一位
  74. SCL = 0;
  75. MOSI = (bit)(cSendByte & 0x80);
  76. cSendByte += cSendByte;
  77. cRecByte |= (unsigned char) MISO ;
  78. SCL = 1;
  79. }
  80. SCL = 1;
  81. return cRecByte;
  82. }
  83. /***** 查询SPI总线状态 *********/
  84. unsigned char spi_cStatus(void)
  85. {
  86. unsigned char cStatus;
  87. NSS=0;
  88. cStatus=SPIRWByte(spibusy);
  89. cStatus=SPIRWByte(0xFF);
  90. NSS=1;
  91.         return cStatus;
  92. }
  93. /***** 读SPI总线数据********/
  94. unsigned char SPI_Read(unsigned char *cP)
  95. {
  96. unsigned char cCnt,cStatus;
  97. unsigned char cCheckSum = 0;
  98.     for (cCnt=0; cCnt<100; cCnt++)
  99.     {
  100. cStatus=spi_cStatus(); //查询SPI总线状态
  101. if(cStatus==0xF0)
  102. {
  103. cCnt=253;
  104. }
  105. delay(10);   
  106. }
  107. if(cCnt==254)  //卡操作结束,可以回传数据
  108. {  
  109.    NSS=0;
  110.        cCnt=SPIRWByte(spiread);
  111.          cP[0]=0x01;    
  112.         for (cCnt=0; cCnt<cP[0]; cCnt++)
  113.         {
  114.      cP[cCnt] = SPIRWByte(0xFF);
  115.      cCheckSum ^= cP[cCnt];
  116.             if(cP[0]>32)
  117.                 {
  118.                    NSS=1;
  119.                    return  FAILURE;
  120.                 }
  121.          }
  122.    delay_1ms(10);
  123.         cP[cCnt] = SPIRWByte(0xFF);
  124.  delay_1ms(10);
  125.         NSS=1;
  126.         if (cCheckSum == cP[cCnt]) return SUCCESS;
  127.         else  return   FAILURE;
  128.       
  129.         
  130.        }
  131.    else  return FAILURE;
  132. }
  133. /***** 写SPI总线数据 *********/
  134. unsigned char SPI_Write(unsigned char *cP)
  135. {
  136. unsigned char i,cStatus;
  137. unsigned char cCheckSum = 0;
  138. NSS=0;
  139. cStatus=SPIRWByte(spiwrite);
  140. for(i=0; i<cP[0]; i++) // cP[0] 表示数据包的长度
  141. {
  142. cCheckSum ^= cP[i];
  143. cStatus=SPIRWByte(cP[i]);
  144. }
  145. cStatus=SPIRWByte(cCheckSum);
  146. NSS=1;
  147. return cStatus;
  148. }
  149. //-----Reset rf module -------//
  150. void Reset_HY502(void)
  151. {
  152. RST_HY=0;   //Reset HY502 复位模块 
  153.     delay_10ms(50);          
  154. RST_HY=1;     
  155. }
  156.    
  157. /************************** main function start here *******************************/
  158. uchar main()
  159. {
  160.    
  161. uchar idata str1[32];
  162. uchar idata cStatus;           
  163. uchar *cPa;
  164. int idata flag = 0;
  165. float idata money=210.5; //  赋初值
  166. InitializeSystem();    // 初始化系统      
  167. Reset_HY502();       
  168. delay_1ms(500);
  169.     LCD_Init();
  170.     Display_full_screen_color (BLACK);
  171. disintlcd();
  172.     
  173.  while(sig)  ;
  174.    
  175.    memcpy(&ComWriteBlock4[10],&money,4);
  176.    
  177.             cPa = ComWriteBlock4;
  178.            SPI_Write(cPa);
  179.         delay_1ms(100);           // delay for module execution
  180.             cStatus = SPI_Read(g_cReceBuf);
  181.       while ((g_cReceBuf[1] != cPa[1]) || cStatus != SUCCESS)
  182.  {
  183.    cPa =ComWriteBlock4;
  184.          SPI_Write(cPa);
  185.          delay_1ms(100);
  186.  cStatus = SPI_Read(g_cReceBuf);
  187.          delay_1ms(100);
  188.  
  189.  
  190.  }
  191.       while (1)
  192.        {
  193.    if (flag == 1) break ;
  194.    while (sig)  ;
  195.    delay_1ms(80);    //预留卡靠近的时间
  196.    
  197.    while (!sig)
  198.   {  
  199.  
  200.      cPa =ComReadBlock4; // 读取钱包     
  201.      SPI_Write(cPa);
  202.       delay_1ms(100);
  203.           
  204.      cStatus = SPI_Read(g_cReceBuf);
  205. if ((g_cReceBuf[1] != cPa[1]) || cStatus != SUCCESS)
  206.  {
  207.   cStatus  =  SPI_Write(ComHaltCard);
  208. DrawString (45,150,"读卡失败,请重刷",BLUE,GREEN,NORMAL) ; 
  209. delay_1ms(500);
  210. DrawString (45,150,"                ",GREEN,GREEN,NORMAL) ; 
  211.   continue;
  212.  
  213.  }
  214.          memcpy(&money,&g_cReceBuf[2],4);
  215.      money = money - 1.5;
  216.            if (money <0)               //余额不够,重新初始化赋值
  217.              {
  218.                     cStatus  =  SPI_Write(ComHaltCard);
  219.     DrawString (45,150,"请重初始化",BLUE,GREEN,NORMAL) ;    
  220.     delay_1ms(500);
  221.     DrawString (45,150,"           ",GREEN,GREEN,NORMAL) ; 
  222. flag = 1;
  223.     break;
  224.              }
  225.      memcpy(&ComWriteBlock4[10],&money,4); 
  226.         
  227.  cPa =ComWriteBlock4;
  228.       SPI_Write(cPa);
  229.      delay_1ms(100);
  230.             
  231.          cStatus = SPI_Read(g_cReceBuf);
  232.     
  233.     while ((g_cReceBuf[1] != cPa[1]) || cStatus != SUCCESS)
  234.  {
  235.    cPa =ComWriteBlock4;
  236.          SPI_Write(cPa);
  237.          delay_1ms(100);
  238.  cStatus = SPI_Read(g_cReceBuf);
  239.          delay_1ms(100);
  240.  
  241.  
  242.  }
  243. ///////////////////////
  244.         sprintf(str1,  "%0.1f", money); 
  245.      cStatus = SPI_Write(ComHaltCard);    //设置为休眠状态
  246.     delay_1ms(100);
  247.    
  248.         DrawString(125, 208,"AC7A3E74",BLACK, WHITE,  NORMAL);   //获取卡号可参考资料手册,这里不作说明
  249. DrawString(125, 244,str1,BLACK, WHITE,  NORMAL);
  250. DrawString(180, 244,"元",BLACK,WHITE,  NORMAL);
  251.     delay_1ms(2500);
  252. DispOneColor(120,200,230,231,WHITE) ;
  253.     DispOneColor(120,236,230,267,WHITE) ;   
  254.     DispOneColor(120,200,230,231,WHITE) ;//baibiao
  255.     
  256.    }
  257.   
  258.  
  259. }     
  260. /*****************************************************************************
  261. *system initialize
  262. *UART baudrate = 19200bps, baud generator is T1
  263. *****************************************************************************/
  264. void InitializeSystem()
  265. {
  266.   
  267. ET2 = 0;
  268. T2CON = 0x04;
  269.     PCON = 0x80;
  270.     SCON = 0x70;
  271.     TMOD = 0x21;        //TMOD = 0x22;
  272. TH1   = BAUD_19200;  //默认波特率
  273. TL1   = TH1;
  274. TR1   = TRUE;             // 波特率发生器
  275. ET1=0;
  276. EA=1;
  277. EX0=0;;
  278. IT0 = 1;
  279. TR2=0;
  280.   ES = TRUE;
  281. g_bReceCommandOk=0;      
  282. }