1. #include "STC8G.h"
  2. #include "intrins.h"
  3. // 获取进制数的某一位
  4. #define get_bit(dat, bita) ((dat & (1<<bita)) >> bita)
  5. typedef unsigned int u16;
  6. typedef unsigned char u8;
  7. sbit HC595_LATCH_CLK = P1^2;
  8. sbit HC595_CLK = P1^3;
  9. sbit HC595_DATA_OUT = P1^4;
  10. sbit HC165_DATA_IN = P1^5;
  11. sbit HC165_SHLD = P1^6;
  12. sbit HC165_CLK = P1^7;
  13. /*******向串口发数据*******/
  14. #define FOSC 11059200UL
  15. #define BRT (65536 - FOSC / 115200 / 4)
  16. bit busy;
  17. char wptr;
  18. char rptr;
  19. char buffer[16];
  20. void UartInit()
  21. {
  22. SCON = 0x50;
  23. T2L = BRT;
  24. T2H = BRT >> 8;
  25. AUXR = 0x15;
  26. wptr = 0x00;
  27. rptr = 0x00;
  28. busy = 0;
  29. }
  30. void UartSend(unsigned char dat)
  31. {
  32. SBUF = dat;
  33. while(TI==0);
  34. TI =0;
  35. }
  36. void UartSendStr(char *p)
  37. {
  38. while (*p)
  39. {
  40. UartSend(*p++);
  41. }
  42. }
  43. /**************/
  44. // ms级延时函数
  45. void delay(unsigned int xms)
  46. {
  47. unsigned int i,j;
  48. for(i = xms; i > 0; i--)
  49. for(j = 114; j > 0; j--);
  50. }
  51. // 发送数据
  52. void HC595SendData(u16 SendVal)
  53. {
  54. u16 i;
  55. bit a;
  56. for(i=16; i>0; i--)
  57. {
  58. // 向HC595发送数据
  59. a = get_bit(SendVal, i-1);
  60. HC595_DATA_OUT = a;
  61. // 数据输入时钟线;上升沿(0->1)时才会将数据一个个移位到数据口中(15,1~7口)。
  62. HC595_CLK = 0;
  63. _nop_();
  64. _nop_();
  65. HC595_CLK = 1;
  66. _nop_();
  67. _nop_();
  68. }
  69. // 输出存储器锁存时钟线;上升沿(0->1)时才会将数据一并移位到数据口中。
  70. HC595_LATCH_CLK = 0;
  71. _nop_();
  72. _nop_();
  73. HC595_LATCH_CLK = 1;
  74. }
  75. // 初始化
  76. void _74HC165_init(void)
  77. {
  78. HC165_SHLD = 1;
  79. HC165_CLK = 1;
  80. }
  81. // 获取HC165数据
  82. unsigned int HC165PullData()
  83. {
  84. u16 i, datas;
  85. datas = 0;
  86. HC165_SHLD = 0;
  87. HC165_SHLD = 1;
  88. if(HC165_DATA_IN == 1)
  89. datas |= 0x01; // 存储第一个数据
  90. for(i=0; i<15; i++)
  91. {
  92. datas = datas << 1;
  93. // 发送数据出去
  94. HC165_CLK = 0;
  95. _nop_();
  96. _nop_();
  97. HC165_CLK = 1;
  98. // UartSend(HC165_DATA_IN);
  99. if(HC165_DATA_IN == 1)
  100. datas |= 0x01;
  101. // 将数据存储到datas中
  102. // datas = ( datas << 1 ) | HC165_DATA_IN;
  103. //datas = datas << 1;
  104. }
  105. // 向串口发数据-测试
  106. UartSend(datas>>8);
  107. UartSend(datas);
  108. // 将数据发送出去
  109. return datas;
  110. }
  111. void main()
  112. {
  113. u16 a, HC165Data;
  114. // 初始化74hc
  115. _74HC165_init();
  116. // 设置I/O口工作模式 - 推挽输出(不设置默认为高阻输入)
  117. P1M0=0xff;
  118. P1M1=0x00;
  119. /*****************/
  120. UartInit();
  121. ES = 1;
  122. EA = 1;
  123. /*****************/
  124. while(1)
  125. {
  126. // 获取165芯片传过来的数据
  127. HC165Data = HC165PullData();
  128. // 向595发送数据
  129. HC595SendData(HC165Data);
  130. /********串口*********/
  131. if (rptr != wptr)
  132. {
  133. UartSend(buffer[rptr++]);
  134. rptr &= 0x0f;
  135. }
  136. /*****************/
  137. // 延时函数
  138. delay(5000);
  139. }
  140. }

扩充:

  1. // 定义联合体
  2. typedef union{
  3. u16 dat;
  4. struct{
  5. u16 bit0:1;
  6. u16 bit1:1;
  7. u16 bit2:1;
  8. u16 bit3:1;
  9. u16 bit4:1;
  10. u16 bit5:1;
  11. u16 bit6:1;
  12. u16 bit7:1;
  13. u16 bit8:1;
  14. u16 bit9:1;
  15. u16 bit10:1;
  16. u16 bit11:1;
  17. u16 bit12:1;
  18. u16 bit13:1;
  19. u16 bit14:1;
  20. u16 bit15:1;
  21. u16 bit16:1;
  22. }BIT;
  23. }led_def;
  24. led_def leddata;
  25. leddata.dat =1;
  26. leddata.dat<<=0;

原理图.png

74HC595教程:

点击查看【bilibili】

74HC165参考资料:

https://blog.csdn.net/k1ang/article/details/88703491?utm_medium=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-BlogCommendFromMachineLearnPai2-1

技术手册:

74HC165D.pdf
74HC595中文资料.pdf
STC8G-20200416.pdf