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

RFID编程

开发平台:

C/C++

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