能在138控制部分简化下程序吗?
//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)