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. int idata money=120; //  赋初值
  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.  cPa = ComIntiPurse5 ;  
  175.          SPI_Write(cPa);  
  176.         delay_1ms(100) ;
  177.          cStatus = SPI_Read(g_cReceBuf);
  178.          while ((g_cReceBuf[1] != cPa[1]) || cStatus != SUCCESS)
  179.  {
  180. cPa = ComIntiPurse5 ;  
  181.             SPI_Write(cPa);  
  182.             delay_1ms(100) ;
  183.             cStatus = SPI_Read(g_cReceBuf);
  184.   }   
  185.    
  186.       while (1)
  187.        {
  188.    if (flag == 1) break;
  189.    while (sig)  ;
  190.    delay_1ms(80);    //预留卡靠近的时间
  191.    
  192.    while (!sig)
  193.   {  
  194.  
  195.               if (money -2<0)               //余额不够,重新初始化赋值
  196.              {
  197.                     cStatus  =  SPI_Write(ComHaltCard);
  198.     DrawString (45,150,"请重初始化",BLUE,GREEN,NORMAL) ;    
  199.     delay_1ms(500);
  200.     DrawString (45,150,"           ",GREEN,GREEN,NORMAL) ; 
  201. flag = 1;
  202.     break;
  203.              }
  204.      cPa =ComDecrPurse5; // 减去钱包特定值     
  205.      SPI_Write(cPa);
  206.           delay_1ms(100);           
  207.      cStatus = SPI_Read(g_cReceBuf);
  208. while ((g_cReceBuf[1] != cPa[1]) || cStatus != SUCCESS)
  209.  {
  210.       cPa =ComDecrPurse5;     
  211.               SPI_Write(cPa);
  212.                    delay_1ms(100);           
  213.               cStatus = SPI_Read(g_cReceBuf);
  214.  
  215.  }
  216.         
  217.    cPa =ComReadPurse5;                               //读取钱包
  218.       SPI_Write(cPa);
  219.      delay_1ms(100);
  220.             
  221.          cStatus = SPI_Read(g_cReceBuf);
  222.     
  223.     if ((g_cReceBuf[1] != cPa[1]) || cStatus != SUCCESS)
  224.  {
  225.   cStatus  =  SPI_Write(ComHaltCard);
  226.             
  227. delay_1ms(500);
  228.   continue;
  229.  
  230.  
  231.  }
  232.           money  =  g_cReceBuf[2];
  233. ///////////////////////
  234.         sprintf(str1,  "%d", money); 
  235.      cStatus = SPI_Write(ComHaltCard);    //设置为休眠状态
  236.     delay_1ms(100);
  237.    
  238.         DrawString(125, 208,"AC7A3E74",BLACK, WHITE,  NORMAL);   //获取卡号可参考资料手册,这里不作说明
  239. DrawString(125, 244,str1,BLACK, WHITE,  NORMAL);
  240. DrawString(180, 244,"元",BLACK,WHITE,  NORMAL);
  241.     delay_1ms(2000);
  242. DispOneColor(120,200,230,231,WHITE) ;
  243.     DispOneColor(120,236,230,267,WHITE) ;   
  244.     DispOneColor(120,200,230,231,WHITE) ;//baibiao
  245.     
  246.    }
  247.   
  248.  
  249. }     
  250. /*****************************************************************************
  251. *system initialize
  252. *UART baudrate = 19200bps, baud generator is T1
  253. *****************************************************************************/
  254. void InitializeSystem()
  255. {
  256.   
  257. ET2 = 0;
  258. T2CON = 0x04;
  259.     PCON = 0x80;
  260.     SCON = 0x70;
  261.     TMOD = 0x21;        //TMOD = 0x22;
  262. TH1   = BAUD_19200;  //默认波特率
  263. TL1   = TH1;
  264. TR1   = TRUE;             // 波特率发生器
  265. ET1=0;
  266. EA=1;
  267. EX0=0;;
  268. IT0 = 1;
  269. TR2=0;
  270.   ES = TRUE;
  271. g_bReceCommandOk=0;      
  272. }