7HC595.c 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228
  1. #include "includes.h"
  2. unsigned char LastRxbuffer[13];
  3. /**********************************************************************************
  4. 写入数据
  5. in :chip Num 接入IC个数
  6. **********************************************************************************/
  7. void Write_74HC595(unsigned char ChipNum,unsigned char *DataBuf)
  8. {
  9. unsigned char i = 0;
  10. unsigned char DataBufTmp = 0;
  11. GPIO_ResetBits(HC595_RCK_PORT,HC595_RCK_PIN); //设置LCK 为低电平,上升沿数据锁存
  12. for(; ChipNum>0; ChipNum--)
  13. {
  14. DataBufTmp = *DataBuf;//0x88
  15. DataBufTmp=DataBufTmp | 0x11;////////////////////////////
  16. for(i=0; i<8; i++)
  17. {
  18. GPIO_ResetBits(HC595_SCK_PORT, HC595_SCK_PIN); //时钟低电平
  19. if (DataBufTmp & 0x80)
  20. {
  21. GPIO_SetBits(HC595_DATA_PORT, HC595_DATA_PIN); //输出1
  22. }
  23. else
  24. {
  25. GPIO_ResetBits(HC595_DATA_PORT, HC595_DATA_PIN); //输出0
  26. }
  27. //HC595_delay(5);
  28. DelayMS(1);
  29. GPIO_SetBits(HC595_SCK_PORT, HC595_SCK_PIN); //时钟高电平,上升沿数据移位
  30. //HC595_delay(5);
  31. DelayMS(1);
  32. DataBufTmp = DataBufTmp << 1;
  33. }
  34. DataBuf++;
  35. }
  36. GPIO_SetBits(HC595_RCK_PORT, HC595_RCK_PIN); //设置LCK 为高电平,上升沿数据锁存
  37. //HC595_delay(10);
  38. DelayMS(2);
  39. GPIO_ResetBits(HC595_RCK_PORT, HC595_RCK_PIN ); //
  40. }
  41. /********************************************************************************
  42. 并行数据读取,这里主要用于读取红外的状态
  43. //CE始终接地
  44. //PL 拉低 放入锁存器
  45. //CP为高 上升沿移位
  46. ********************************************************************************/
  47. unsigned char Read_74HC165(void)
  48. {
  49. unsigned char i;
  50. unsigned char RetDat=0x00;
  51. //Dev74HC165_CP = 1;
  52. HC165_CP_HIGH;
  53. //Dev74HC165_PL = 0;
  54. HC165_PL_LOW;
  55. DelayMS(1);
  56. //Dev74HC165_PL = 1;
  57. HC165_PL_HIGH;
  58. DelayMS(3);
  59. if(HC165_DATA_READ == 1)
  60. RetDat = 0x01;
  61. for(i = 0; i < 7; i++)
  62. {
  63. RetDat <<= 1;
  64. //Dev74HC165_CP = 0;
  65. HC165_CP_LOW;
  66. DelayMS(1);
  67. //Dev74HC165_CP = 1;
  68. HC165_CP_HIGH;
  69. DelayMS(1);
  70. if(HC165_DATA_READ == 1) //读取Q7脚
  71. {
  72. RetDat |= 0x01;
  73. }
  74. }
  75. //Dev74HC165_CP = 0;
  76. HC165_CP_LOW;
  77. return RetDat;
  78. }
  79. /***************************************************************************
  80. 格式 查询
  81. 0xaa 0xbb cmd len(1) 故障码(1) addr(1) data(1) crc(2) DD 55// LEN=11
  82. ***************************************************************************/
  83. void QueryRecvProcess(unsigned char *rxbuffer)
  84. {
  85. unsigned char data,i;
  86. unsigned short crc,CRC16;
  87. unsigned char Pack[11];
  88. unsigned char readbuf[4]={0x80,0x80,0x80,0x80}; //0x11
  89. int len=rxbuffer[3];
  90. //先判断是否是本机及长度校验。 可在外层先判断是否是本机
  91. CRC16=crc16_calc(0xffff,rxbuffer,len-4);
  92. crc=((unsigned short)rxbuffer[len-3]&0xff)<<8;
  93. crc+=(unsigned short)rxbuffer[len-4]&0xff;
  94. if(rxbuffer[4]!=sutProductPara.Addr){
  95. SlwTrace(INF,"addr erro",1);
  96. return ;
  97. }
  98. if(crc != CRC16 ) {
  99. SlwTrace(INF,"CRC erro",1);
  100. //CRC校验不对,不处理
  101. return ;
  102. }
  103. if(rxbuffer[2]!=HOLDINGREG){
  104. SlwTrace(INF,"cmd error",1);
  105. return;
  106. }
  107. //Write_74HC595(4,readbuf); //红外全程打开
  108. data=Read_74HC165();
  109. //塞包 入数据
  110. Pack[0]=0xAA;
  111. Pack[1]=0xBB;
  112. Pack[2]=HOLDINGREG;
  113. Pack[3]=0x0B;
  114. Pack[4]=sutProductPara.Addr;//从机地址
  115. Pack[5]=0xEE; //故障码
  116. Pack[6]=data;//红外状态
  117. CRC16=crc16_calc(0xffff,Pack,7);
  118. Pack[7] = (unsigned char)(CRC16 & 0xff);
  119. Pack[8] = (unsigned char)(CRC16 >> 8);
  120. Pack[9]=0xDD;
  121. Pack[10]=0x55;
  122. RS485_DIR_HIGH;
  123. for(i=0;i<11;i++)
  124. {
  125. USART_SendData(USART1,Pack[i]);
  126. while (USART_GetFlagStatus(USART1, USART_FLAG_TC) == RESET);
  127. }
  128. RS485_DIR_LOW;
  129. }
  130. /**************************************************************
  131. 格式
  132. 0xcc 0xdd cmd len(1) addr(1) data(4) crc(2) DD 55// LEN=13
  133. **************************************************************/
  134. void SetRecvProcess(unsigned char *rxbuffer)
  135. {
  136. unsigned char i;
  137. unsigned char *pData=rxbuffer;
  138. unsigned char writebuf[4]={0};
  139. unsigned short crc,CRC16;
  140. int len=rxbuffer[3];
  141. char buf[30];
  142. SlwTrace(INF,rxbuffer,1);
  143. //if(0==memcmp(LastRxbuffer,rxbuffer,sizeof(LastRxbuffer)) return;
  144. if(0==memcmp(LastRxbuffer,rxbuffer,13)) return;
  145. memcpy(LastRxbuffer,rxbuffer,13);
  146. // CRC16=crc16_calc(0xffff,rxbuffer,9);
  147. // rxbuffer[9] = (unsigned char)(CRC16 & 0xff);
  148. // rxbuffer[10] = (unsigned char)(CRC16 >> 8);
  149. //判断CRC
  150. CRC16=crc16_calc(0xffff,rxbuffer,len-4);
  151. crc=((unsigned short)rxbuffer[len-3]&0xff)<<8;
  152. crc+=(unsigned short)rxbuffer[len-4]&0xff;
  153. if(crc != CRC16 || rxbuffer[4]!=sutProductPara.Addr){
  154. SlwTrace(INF,"crc or addrerro\r\n",1);
  155. return ;//CRC校验不对,不处理
  156. }
  157. if(rxbuffer[2]!=WRITESINGLEREG) {
  158. SlwTrace(INF,"cmd erro\r\n",1);
  159. return;
  160. }
  161. //设置灯状态
  162. SlwTrace(INF,"set led ",1);
  163. for(i=0;i<4;i++) writebuf[i]=pData[i+5];
  164. snprintf(buf,sizeof(buf),"%02x..%02x..%02x..%02x",writebuf[0],writebuf[1],writebuf[2],writebuf[3]);
  165. SlwTrace(INF,buf,1);
  166. Write_74HC595(4,writebuf);
  167. }