能在138控制部分简化下程序吗?

2019-07-14 21:44发布

刚学习STM32,想用一片164芯片和一片138控制64个LED,实现跑马灯效果,以下是自己写的程序,请问,能在138控制部分简化下程序吗?IO是用GPIOB控制的。


//164部分
for(i=0;i<8;i++)
      {
         GPIO_ResetBits(GPIOB,GPIO_Pin_14);//CLK==0

      if((data&&0x80)==0x00)
     {
       GPIO_ResetBits(GPIOB,GPIO_Pin_13);
     }
     else
     {
      GPIO_SetBits(GPIOB,GPIO_Pin_13);
      
          }
         
            GPIO_SetBits(GPIOB,GPIO_Pin_14);//CLK==1
      
//138部分      
            GPIO_ResetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12);//A=0,B=0,C=0
       delay_ms(100);
       GPIO_SetBits(GPIOB,GPIO_Pin_10);//A=1
         GPIO_ResetBits(GPIOB,GPIO_Pin_11|GPIO_Pin_12);//B=0,C=0
       delay_ms(100);
       GPIO_ResetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_12);//A=0,C=0
         GPIO_SetBits(GPIOB,GPIO_Pin_11);//B=1
         delay_ms(100);
       GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);//A=1,B=1
         GPIO_ResetBits(GPIOB,GPIO_Pin_12);//C=0
       delay_ms(100);
       GPIO_ResetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11);//A=0,B=0
         GPIO_SetBits(GPIOB,GPIO_Pin_12);//C=1
      delay_ms(100);
      GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_12);//A=1,C=1
         GPIO_ResetBits(GPIOB,GPIO_Pin_11);//B=0         
      delay_ms(100);
      GPIO_ResetBits(GPIOB,GPIO_Pin_10);//A=0
         GPIO_SetBits(GPIOB,GPIO_Pin_11|GPIO_Pin_12);//B=1,C=1
      delay_ms(100);
      GPIO_SetBits(GPIOB,GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12);//A=1,B=1,C=1
      delay_ms(100);

       data=data<<1;
      //delay_ms(2000);
      
        }
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
4条回答
MOPPLAYER
2019-07-15 07:02
這樣說好了,因為點LED就可以視為一個ROM,上面燒寫好了所有LED的組態

假設t=1的時候 你有10個LED 1 3 5 7 9要點亮 2 4 6 8 10要熄滅
那麼可以設定array1中第一個為{gpio1|gpio3|gpio5|gpio7|gpio9,...}
array2中第一個為{gpio2|gpio4|gpio6|gpio8|gpio10,...}
那麼在for loop之中只要設定即可
setbit(array1)
resetbit(array2)

而上面的範例只是個別點亮跟熄滅,不同時間區端設定一樣可以的
像如果上面是那樣
t=0.5時候是
array1的index=0的值
t=1的時候是
array2的index=0的值

那麼 這兩種設定方式 在t=1的時候 組態是一樣的 都是1 3 5 7 9 點亮 2 4 6 8 10熄滅
範例只是拆解而已,分解順序一樣可以做到這件事,因為點亮的function本來就是循序執行(sequential)

一周热门 更多>