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.    delay(50);
  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(50);
  106.     
  107. }
  108.   
  109. if(cCnt==254)  //卡操作结束,可以回传数据
  110. {  
  111. NSS=0;
  112. cCnt=SPIRWByte(spiread);
  113.    
  114.           cP[0]=0x01;    
  115.         for (cCnt=0; cCnt<cP[0]; cCnt++)
  116.         {
  117.      cP[cCnt] = SPIRWByte(0xFF);
  118. delay(10);
  119.      cCheckSum ^= cP[cCnt];
  120.               if(cP[0]>32)
  121.                 {
  122.                    NSS=1;
  123.    
  124.                    return  FAILURE;
  125.                 }
  126.         }
  127.   delay(10);
  128.         cP[cCnt] = SPIRWByte(0xFF);
  129. delay(10);
  130.         NSS=1;
  131.         if (cCheckSum == cP[cCnt])   
  132.       {
  133.       
  134.    return SUCCESS;
  135.   }
  136.    
  137.         else  return   FAILURE;
  138.        }
  139.   
  140.    else 
  141.     {
  142.   
  143. return FAILURE;
  144. }
  145.    
  146. }
  147. /***** 写SPI总线数据 *********/
  148. unsigned char SPI_Write(unsigned char *cP)
  149. {
  150. unsigned char i,cStatus;
  151. unsigned char cCheckSum = 0;
  152. NSS=0;
  153. cStatus=SPIRWByte(spiwrite);
  154. for(i=0; i<cP[0]; i++) // cP[0] 表示数据包的长度
  155. {
  156. cCheckSum ^= cP[i];
  157. cStatus=SPIRWByte(cP[i]);
  158. }
  159. cStatus=SPIRWByte(cCheckSum);
  160. NSS=1;
  161.    
  162. return cStatus;
  163. }
  164. //-----Reset rf module -------//
  165. void Reset_HY502(void)
  166. {
  167. RST_HY=0;   //Reset HY502 复位模块 
  168.     delay_10ms(50);          
  169. RST_HY=1;     
  170. }
  171.    
  172. /************************** main function start here *******************************/
  173. void main()
  174. {
  175.    
  176. uchar str0[]={"money ="}  ;
  177. uchar idata str1[10];
  178. uchar idata cStatus;           
  179. uchar *cPa;
  180. int idata flag=0;
  181. float money=110.5; //  赋初值
  182. InitializeSystem();    // 初始化系统      
  183. Reset_HY502();       
  184. delay_1ms(500);
  185.     lcd_init() ;
  186.    while(sig)  ;
  187.   
  188.  memcpy(&ComWriteBlock4[10],&money,4);
  189.   cPa =ComWriteBlock4;
  190.   SPI_Write(cPa);
  191.   delay_1ms(500);           
  192. cStatus = SPI_Read(g_cReceBuf);
  193.       while ((g_cReceBuf[1] != cPa[1]) || cStatus != SUCCESS)
  194.  {
  195.    cPa =ComWriteBlock4;
  196.          SPI_Write(cPa);
  197.          delay_1ms(100);
  198.  cStatus = SPI_Read(g_cReceBuf);
  199.          delay_1ms(100);
  200.  
  201.  
  202.  }
  203.      
  204.  
  205. while (1)
  206.      {
  207.   if (flag ==1) break;
  208.    
  209.           while (sig);
  210.     
  211.   
  212.   delay_1ms(70);    //预留卡靠近的时间
  213.    
  214.   while ( !sig)
  215.   {
  216.    
  217.  cPa =ComReadBlock4; // 读取钱包     
  218. SPI_Write(cPa);
  219. delay_1ms(100);           
  220. cStatus = SPI_Read(g_cReceBuf);
  221.    
  222.         if ((g_cReceBuf[1] != cPa[1]) || cStatus != SUCCESS)
  223.  {
  224.   cStatus  =  SPI_Write(ComHaltCard);
  225.   continue;
  226.  
  227.  }
  228.    
  229.       memcpy(&money,&g_cReceBuf[2],4);
  230.   money = money - 1.5;
  231.         if (money <0)               //余额不够,重新初始化赋值
  232.              {
  233.                     cStatus  =  SPI_Write(ComHaltCard);
  234.      flag = 1;
  235.            break;
  236.              }   
  237.  memcpy(&ComWriteBlock4[10],&money,4); 
  238.     cPa =ComWriteBlock4;
  239.   SPI_Write(cPa);
  240.   delay_1ms(100);                
  241. cStatus = SPI_Read(g_cReceBuf);
  242.   while ((g_cReceBuf[1] != cPa[1]) || cStatus != SUCCESS)
  243.  {
  244.    cPa =ComWriteBlock4;
  245.          SPI_Write(cPa);
  246.          delay_1ms(100);
  247.  cStatus = SPI_Read(g_cReceBuf);
  248.          delay_1ms(100);
  249.  
  250.  
  251.  }  
  252.      sprintf(str1,  "%0.1f", money);    
  253. SPI_Write(ComHaltCard);    //设置为休眠状态
  254. delay_1ms(100);    
  255. lcd_display(str0,str1);
  256. delay_1ms(2000);
  257. lcd_init() ;   
  258.    }
  259.  }
  260.  
  261.  
  262. }     
  263. /*****************************************************************************
  264. *system initialize
  265. *UART baudrate = 19200bps, baud generator is T1
  266. *****************************************************************************/
  267. void InitializeSystem()
  268. {
  269.   
  270. ET2 = 0;
  271. T2CON = 0x04;
  272.     PCON = 0x80;
  273.     SCON = 0x70;
  274.     TMOD = 0x21;        //TMOD = 0x22;
  275. TH1   = BAUD_19200;  //默认波特率
  276. TL1   = TH1;
  277. TR1   = TRUE;             // 波特率发生器
  278. ET1=0;
  279. EA=1;
  280. EX0=0;;
  281. IT0 = 1;
  282. TR2=0;
  283.   ES = TRUE;
  284. g_bReceCommandOk=0;      
  285. }