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

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])
  127.         {
  128.    
  129.               return SUCCESS;
  130.         }
  131.        }
  132.  
  133. return FAILURE;
  134. }
  135. /***** 写SPI总线数据 *********/
  136. unsigned char SPI_Write(unsigned char *cP)
  137. {
  138. unsigned char i,cStatus;
  139. unsigned char cCheckSum = 0;
  140. NSS=0;
  141. cStatus=SPIRWByte(spiwrite);
  142. for(i=0; i<cP[0]; i++) // cP[0] 表示数据包的长度
  143. {
  144. cCheckSum ^= cP[i];
  145. cStatus=SPIRWByte(cP[i]);
  146. }
  147. cStatus=SPIRWByte(cCheckSum);
  148. NSS=1;
  149. return cStatus;
  150. }
  151. //-----Reset rf module -------//
  152. void Reset_HY502(void)
  153. {
  154. RST_HY=0;   //Reset HY502 复位模块 
  155.     delay_10ms(50);          
  156. RST_HY=1;     
  157. }
  158.    
  159. /************************** main function start here *******************************/
  160. void main()
  161. {
  162.    
  163. uchar idata str1[32];
  164. uchar idata cStatus;           
  165. uchar *cPa;
  166.      int idata flag = 0;
  167. float idata money=210.5; //  赋初值
  168. InitializeSystem();    // 初始化系统      
  169. Reset_HY502();       
  170. delay_1ms(500);
  171.     LCD_Init();
  172.     Display_full_screen_color (BLACK);
  173. disintlcd();
  174.       
  175.  while(sig)  ;
  176.   
  177.  memcpy(&ComWriteBlock4[10],&money,4);
  178.  cPa =ComWriteBlock4;
  179.  SPI_Write(ComWriteBlock4);
  180.   delay_1ms(100);           // delay for module execution
  181.             cStatus = SPI_Read(g_cReceBuf);
  182.       while ((g_cReceBuf[1] != cPa[1]) || cStatus != SUCCESS)
  183.  {
  184.    cPa =ComWriteBlock4;
  185.          SPI_Write(cPa);
  186.          delay_1ms(100);
  187.  cStatus = SPI_Read(g_cReceBuf);
  188.          delay_1ms(100);
  189.  
  190.  }
  191.     while (1)
  192.      {
  193.   if (flag == 1)  break;
  194.    while( sig);
  195.    delay_1ms(70);    //预留卡靠近的时间
  196.    while (!sig)
  197.   {
  198.      cPa =ComReadBlock4; // 读取钱包     
  199.      SPI_Write(ComReadBlock4);
  200.           delay_1ms(100);           
  201.      cStatus = SPI_Read(g_cReceBuf);
  202.      delay_1ms(300);
  203.          memcpy(&money,&g_cReceBuf[2],4);
  204.      money = money - 1.5;
  205.         if (money<0 && money>210.5)
  206.            {
  207.    flag =1;
  208.    break;
  209. }
  210.      memcpy(&ComWriteBlock4[10],&money,4); 
  211.          cPa =ComWriteBlock4;
  212.      SPI_Write(cPa);
  213.      delay_1ms(100);           
  214.         cStatus = SPI_Read(g_cReceBuf);
  215.      delay_1ms(200);
  216.         sprintf(str1,  "%0.1f", money); 
  217.      SPI_Write(ComHaltCard);    //设置为休眠状态
  218.         DrawString(125, 208,"AC7A3E74",BLACK, WHITE,  NORMAL);   //获取卡号可参考资料手册,这里不作说明
  219. DrawString(125, 244,str1,BLACK, WHITE,  NORMAL);
  220. DrawString(180, 244,"元",BLACK,WHITE,  NORMAL);
  221.     delay_1ms(2000);
  222. DispOneColor(120,200,230,231,WHITE) ;
  223.     DispOneColor(120,236,230,267,WHITE) ;   
  224.     DispOneColor(120,200,230,231,WHITE) ;//baibiao
  225.     
  226.         
  227.          }
  228.  } 
  229.  
  230. }     
  231. /*****************************************************************************
  232. *system initialize
  233. *UART baudrate = 19200bps, baud generator is T1
  234. *****************************************************************************/
  235. void InitializeSystem()
  236. {
  237.   
  238. ET2 = 0;
  239. T2CON = 0x04;
  240.     PCON = 0x80;
  241.     SCON = 0x70;
  242.     TMOD = 0x21;        //TMOD = 0x22;
  243. TH1   = BAUD_19200;  //默认波特率
  244. TL1   = TH1;
  245. TR1   = TRUE;             // 波特率发生器
  246. ET1=0;
  247. EA=1;
  248. EX0=0;;
  249. IT0 = 1;
  250. TR2=0;
  251.   ES = TRUE;
  252. g_bReceCommandOk=0;      
  253. }