各位大大,怎么用较少的IO口控制8个LED?像74HC595这些要怎么用?

2019-07-15 11:33发布

度了一些资料,发现74HC595只用3个IO口就可以控制流水灯,我想改为通过按键来使灯一个个亮,如图,按一次“+”,亮一个,按一次“-"灭一个。这个芯片可以实现的吗?方法是怎么样的,可以大概说一下吗,跟普通IO口控制区别大吗?下面是网上找的流水灯程序。
  1. /*======================
  2.   测试74HC595
  3.   =======================*/

  4. #include <REG51.H>
  5. #include <intrins.h>

  6. #define uchar unsigned char
  7. #define uint unsigned int

  8. sbit st_cp= P0^2;
  9. sbit sh_cp= P0^0;
  10. sbit ds = P0^1;
  11. uchar led = 0xfe;

  12. void message_get(uchar led);
  13. void message_send();
  14. void delay(uchar time_delay);

  15. void main()
  16. {
  17.     while(1)
  18.     {
  19.         message_get(led);
  20.         message_send();
  21.         delay(5000);
  22.         led = _crol_(led, 1);
  23.     }   
  24. }
  25. //将数据放到移位寄存器中
  26. void message_get(uchar led)
  27. {
  28.     uchar i = 0;
  29.     for(; i < 8; i ++)
  30.     {
  31.         sh_cp = 0;
  32.         ds = led & 0x80;
  33.         led <<= 1;
  34.         delay(5);
  35.         sh_cp = 1;//上升沿   
  36.     }   
  37. }
  38. //将数据从移位寄存器中放到存储寄存器中
  39. void message_send()
  40. {
  41.     st_cp=0;
  42.     delay(5);
  43.     st_cp = 1;//数据从移位寄存器放到数据寄存器中   
  44. }
  45. void delay(uchar time_delay)
  46. {
  47.     uchar x,y;
  48.     for(x = time_delay; x > 0; x--)
  49.         for(y = time_delay; y > 0; y--)
  50.         {}
  51. }
复制代码

微信截图_20170329113016.png
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。