接上一篇帖子,继续来看,既然我们会点亮一个小灯,并可以让其闪烁了,那么我们就尝试着点亮流水灯好了,让8个小灯,从左到右,从右往左来回流动,还是在上一个程序的基础上来修改,很简单依次赋值即可实现。
while(1)
  •         {
  •              P2 = 0XFE;//1111_1110;
  •                  Delay500ms();//500ms延时 11.0592MHZ
  •                  P2 = 0XFD;//1111_1101;
  •                  Delay500ms();//500ms延时 11.0592MHZ
  •                  P2 = 0XFB;//1111_1011;
  •                  Delay500ms();//500ms延时 11.0592MHZ
  •                  P2 = 0XF7;//1111_0111;
  •                  Delay500ms();//500ms延时 11.0592MHZ
  •                  P2 = 0XEF;//1110_1110;
  •                  Delay500ms();//500ms延时 11.0592MHZ
  •                  P2 = 0XDF;//1101_1111;
  •                  Delay500ms();//500ms延时 11.0592MHZ
  •                  P2 = 0XBF;   //1011_1110;
  •                  Delay500ms();//500ms延时 11.0592MHZ
  •                  P2 = 0X7F;   //0111_1111;
  •                  Delay500ms();//500ms延时 11.0592MHZ
  •                  P2 = 0XBF;     //1011_1110;
  •                  Delay500ms();  //500ms延时 11.0592MHZ
  •                  P2 = 0XDF;     //1101_1111;
  •                  Delay500ms();  //500ms延时 11.0592MHZ
  •                  P2 = 0XEF;     //1110_1110;
  •                  Delay500ms();  //500ms延时 11.0592MHZ
  •                  P2 = 0XF7;     //1111_0111;
  •                  Delay500ms();  //500ms延时 11.0592MHZ
  •                  P2 = 0XFB;     //1111_0111;
  •                  Delay500ms();  //500ms延时 11.0592MHZ
  •                  P2 = 0XFD;     //1111_1101;
  •                  Delay500ms();  //500ms延时 11.0592MHZ
  •         }
  • 复制代码

    这样弄,虽然很好理解,但是代码显得太冗长了,我们接触下for循环语句,先用for语句来实现我们想要的功能。代码修改如下:
      for(i = 0; i < 8;i++)
  •                 {
  •                         P2 = ~(0X01 << i);
  •                         Delay500ms();//500ms延时 11.0592MHZ
  •                 }
  •                 for(i = 0; i < 6;i++)
  •                 {
  •                         P2 = ~(0X40 >> i);
  •                         Delay500ms();//500ms延时 11.0592MHZ
  •                 }
  • 复制代码

    用了for循环左移和右移的办法,配合取反实现的,还有一种办法,更简单可以实现来回循环,这便是循环左移和循环右移指令
    /*******************************************************************
  • * 文件名 main函数入口
  • * 描述:        
  • * 功 能
  • * 作者:大核桃
  • * 版本号:V1.00(2018.09.17)
  • ********************************************************************/
  • void main(void)
  • {
  •     uint8 i = 0;
  •         uint8 temp;
  •         MCU_Port_Init();//端口模式初始化函数
  •         //上电IO默认是0
  •         LED0 = 1;//输出1
  •         LED1 = 0;
  •         LED2 = 0;
  •         LED3 = 0;
  •         LED4 = 0;
  •         LED5 = 0;
  •         LED6 = 0;
  •         LED7 = 0;//
  •         temp = 0XFE;
  •         while(1)
  •         {
  •            for(i = 0; i < 7;i++)
  •                 {
  •                     P2 = temp;
  •                         temp = _crol_(temp,1);         
  •                         Delay500ms();//500ms延时 11.0592MHZ
  •                 }
  •                 for(i = 0; i < 7;i++)
  •                 {                              
  •                     P2 = temp;
  •                         temp = _cror_(temp,1);
  •                         Delay500ms();//500ms延时 11.0592MHZ
  •                 }
  • }
  • 复制代码

    这一节,用到了for循环这个知识点,for语句的用法在C语言课本的第120页,详细的了解可以看C语言这本书,我们只列举一个实际例子来说明C语言的流程,就拿下面的代码来说吧。
      for(i = 0; i < 8;i++)
  •                 {
  •                         P2 = ~(0X01 << i);
  •                         Delay500ms();//500ms延时 11.0592MHZ
  •                 }
  • 复制代码

    首先i = 0;是给变量赋初值,i<8是循环条件,i++是变量累加,先来看看i = 0;的时候,这个时候判断下语句P2 = 0XFE,然后0 < 8条件成立,i++;
    //  i = 0;的时候
  • for(i = 0; i < 8;i++)
  • {
  •         P2 = ~(0X01 << 0);
  •         Delay500ms();//500ms延时 11.0592MHZ
  • }
  • //  i = 1;的时候
  • for(i = 0; i < 8;i++)
  • {
  •         P2 = ~(0X01 << 1);
  •         Delay500ms();//500ms延时 11.0592MHZ
  • }
  • 复制代码

    当 i= 1;的时候,P2 = 0XFD,依然1<8成立,然后i++;
    当 i= 2;的时候,P2 = 0XFB,依然2<8成立,然后i++;
    当 i= 3;的时候,P2 = 0XF7,依然3<8成立,然后i++;
    当 i= 4;的时候,P2 = 0XEF,依然4<8成立,然后i++;
    当 i= 5;的时候,P2 = 0XDF,依然5<8成立,然后i++;
    当 i= 6;的时候,P2 = 0XBF,依然6<8成立,然后i++;
    当 i= 7;的时候,P2 = 0X7F,依然7<8成立,然后i++;
    当 i= 8;的时候,8<8不成立,跳出循环执行下面的语句;

    这样我们就把for循环的流程给分解了,首先就是赋初值,然后执行循环,循环完之后变量累加,回过头看条件是否成立,如果条件继续成立,则继续循环,累加变量,直到条件不满足为止。
    关于取反符号
    ~这个符号,可以读作取反,注意这不是!(非),数字电路中的 &(按位与) , |  (按位或),!(非)和 &&(逻辑与),||(逻辑或),和~(取反)是不一样的,按位与顾名思义,是位和位之间运算,他们运算是能够得出一个具体的结果的,而逻辑与是对左右两个表达式的真假进行判断,得出的结果不是真就是假。
    关于与或非的真值表
    与或非是数字电路最基本的知识点,必须要掌握这个知识点。
        &----就好比乘法一样,如果A和B都为1,那么结果就是1,如果有一个为0,则输出都是0,。
        |----就好比加法运算,如果A或者B有一个是1,那么结果就是1,否则就是0;
        !----输入为0时,输出为1,输入为1时,输出为0;
       !|----或非门,只有A和B输入全部位0时,输出才为1,否则全为0;
       !&---与非门,只有A和B全部输入为1时,输出才为0,否则全为1;
       异或门,如果A和B相等时,输出都是0,否则输出都是1。