说明文件 : cror库函数,实现右移,同理,crol为左移
    image.png

    1. #include <intrins.h>
    2. unsigned char _cror_ ( //循环要两个变量
    3. unsigned char c, /* 循环左移*/
    4. unsigned char b); /* 循环几位(位数)*/
    1. #include <intrins.h>
    2. void test_cror (void) {
    3. char a;
    4. char b;
    5. a = 0xA5; //A5为1010 0101
    6. b = _crol_(a,1); /* b now is 0xD2 ,D2为1101 0010,即右移,将末尾提到最左*/
    7. }

    循环不断左移(右移),则能以总线相继点亮不同的灯,形成流水灯
    代码

    1. #include "reg52.h"
    2. #include "intrins.h"
    3. typedef unsigned char u16 ;
    4. typedef unsigned int u8 ;
    5. u16 temp;
    6. void delay(u8 z)
    7. {
    8. u8 x,y;
    9. for(x=z; x>0; x--)
    10. {
    11. for(y=70; y>0; y--);//用keil软件调试出500ms
    12. }
    13. }
    14. void main()
    15. {
    16. temp=0xfe; //第一个led,1111 1110
    17. P2=temp; //整条总线附上
    18. while(1)
    19. {
    20. temp=_crol_(temp,1);//把temp循环左移1位
    21. delay(800); //延时亮一会
    22. P2=temp; //点亮下一个灯,无限循环
    23. }
    24. }

    定时器流水灯

    1. #include "reg52.h"
    2. #include "intrins.h"
    3. typedef unsigned int u8;
    4. typedef unsigned char u16;
    5. u16 temp;
    6. void time()
    7. {
    8. TMOD=0x01;
    9. TH0=0XD4; //gao8
    10. TL0=0XCD; //di 8
    11. EA=1;
    12. ET0=1;
    13. TR0=1;
    14. }
    15. void main()
    16. {
    17. temp=0xfe;
    18. time();
    19. while(1);
    20. }
    21. void enter0() interrupt 1 //进入定时器中断函数
    22. {
    23. static u8 i;
    24. TH0=0XD4; //gao8
    25. TL0=0XCD; //di 8
    26. i++;
    27. if(i==10)
    28. {
    29. P2=temp;
    30. i=0;
    31. temp=_cror_(temp,1);
    32. }
    33. }