完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
刚学习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); } |
|
相关推荐
6个回答
|
|
你可以把你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 if(i==M) GPIO_SetBits(GPIOB,gpio[i]); else GPIO_ResetBits(GPIOB,gpio[i]); } 其中N是你的跑馬燈的狀態數,M是你那些要SetBits那些ResetBits 應該很容易理解!
最佳答案
|
|
|
|
用定时器呗,不用这个延时吧,太浪费了。
|
|
|
|
|
|
|
|
|
|
|
|
MOPPLAYER 发表于 2015-10-14 22:20 感觉你说的实现不了我要功能,不知道是不是我的理解有问题 像你说的,只能执行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) |
|
|
|
你正在撰写答案
如果你是对答案或其他答案精选点评或询问,请使用“评论”功能。
AD7686芯片不传输数据给STM32,但是手按住就会有数据。
621 浏览 1 评论
1962 浏览 0 评论
如何解决MPU-9250与STM32通讯时,出现HAL_ERROR = 0x01U
1068 浏览 1 评论
hal库中i2c卡死在HAL_I2C_Master_Transmit
1487 浏览 1 评论
LL库F030进行3个串口收发,2个串口为232,一个为485,长时间后,会出现串口1停止运行,另外两个正常,只有重启复原
1924 浏览 1 评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-19 09:22 , Processed in 0.586481 second(s), Total 57, Slave 49 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号