微波EDA网,见证研发工程师的成长!
首页 > 研发问答 > 嵌入式设计讨论 > MCU和单片机设计讨论 > 能在138控制部分简化下程序吗?

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

时间:10-02 整理:3721RD 点击:
刚学习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);
      
        }

你可以把你GPIO_PIN10,GPIO_PIN11,GPIO_PIN12等等的存成Array
即gpio[N]={GPIO_Pin_10|GPIO_Pin_11|GPIO_Pin_12,GPIO_Pin_10,GPIOB,GPIO_Pin_11|GPIO_Pin_12,GPIO_Pin_10|GPIO_Pin_12,.....}
然後再用for loop去執行你設定的順序點亮即可
for (i=0;i<N;i++)
{
   if(i==M)
    GPIO_SetBits(GPIOB,gpio[i]);
  else
    GPIO_ResetBits(GPIOB,gpio[i]);
}
其中N是你的跑馬燈的狀態數,M是你那些要SetBits那些ResetBits
應該很容易理解!

用定时器呗,不用这个延时吧,太浪费了。

ABC这种赋值方法太累了,吧ABC放在一起,移位就好了

有啥好例子吗?

感觉你说的实现不了我要功能,不知道是不是我的理解有问题
像你说的,只能执行ResetBit或SetBit,但是我的语句里有两个都要执行的

這樣說好了,因為點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)

Copyright © 2017-2020 微波EDA网 版权所有

网站地图

Top