光立方驱动板v1.0,共需要8给控制端口来控制光立方端口的点亮。
打开光立方原理图,通过SER0、SCK0、RCK0信号来控制U8的输出,通过u8来控制ULN2803的输出端,当QA为1时,那O1将被允许灌入电流,光立方第一层被选通。这时需要给U4、U5、U6、U7、U10、U11、U12、U13、分别写数据,存储器锁存并行输出,例通过SER1、SCK1写0xFF,通过SER2、SCK2、RCK2,给U15写0x01,这时u4的RCK-1有一个上升沿,存储器锁存并输出0xFF,这时,第1束灯被全点亮;通过 SER1、SCK1写0xFE,通过 SER2、SCK2、RCK2,给U15写0x02,这时u5的RCK-2有一个上升沿,存储器锁存并输出0xFE,这时,第2束灯有7个灯被点亮;依次类推,通过这方法,将第一层的灯选择性的点亮。再通过SER0、SCK0、RCK0信号来控制U8的输出,循环控制这8层灯,这样灯就可以被控制了。
这里使用的是YFRobot-stm32核心板V1.0作为控制板。- 打开led.h,可以看到如下内容
- //层控制端
- #define SER0 PBout(8)//串行数据输入 PBout(8)为控制板PB的第8脚输出,通过SER0来控制PB8输出为1或0
- #define SCK0 PBout(9) //输入到移位寄存器
- #define RCK0 PBout(10) //上升沿是串行输入,并行输出并锁存
- //数据输出
- #define SER1 PBout(11) //串行数据输入
- #define SCK1 PBout(12) //输入到移位寄存器
- //端口上升沿是串行输入,并行输出并锁存
- //寄存器控制输出控制
- #define SER2 PBout(13) //串行数据输入
- #define SCK2 PBout(14) //输入到移位寄存器
- #define RCK2 PBout(15) //上升沿串行输入,并行输出并锁存
- 帧控制函数
- void storey(u8 *a)//层填充函数,控制某层灯点亮方式
- {
- u8 i,j,num;
- for(i=0;i<8;i++)
- {
- num=a; //将数组中数输入寄存器
- for(j=0;j<8;j++) //串行数据输入
- {
- if(num&0x80)
- SER1=1; // SER串行输入端口
- else
- SER1=0;
- SCK1=0; //上升沿,输入到移位寄存器
- delay_us(2);
- SCK1=1;
- num<<=1;
- }
- //寄存器控制
- if(i==0)
- SER2=1;
- else
- SER2=0;
- SCK2=0; //上升沿,输入到移位寄存器
- delay_us(2);
- SCK2=1;
- RCK2=0; //上升沿,串行输出
- delay_us(2);
- RCK2=1;
- }
- }
- void frame(u8 *a,u8 v)//一帧,a是一帧编码起始地址
- //一个画面,v表示一帧画面扫描的次数
- // 可以看作这帧显示的时间
- {
- s8 i,j,num; //s8 有符号定义
- while(v--)
- {
- for(i=0;i<8;i++) //层数层控制,选通某一层,
- //使得第1层到第8层,依次点亮
- {
- clc(); //大家可以尝试将此代码删除,运行代码dot(5);或UtoD_scan(90);
- //试着比较一下,欢迎大家多提宝贵意见,共同解决这个问题。
-
- storey(a+i*8);//层填充函数,控制某层灯点亮方式
- num=0x01;
- num<<=i;
- for(j=0;j<8;j++) //串行数据输入
- {
- if(num&0x80)
- SER0=1; // SER串行输入端口
- else
- SER0=0;
- delay_us(1);
- SCK0=0; //上升沿,输入到移位寄存器
- delay_us(2);
- SCK0=1;
- num<<=1;
- }
- RCK0=0;
- delay_us(2);
- RCK0=1;
- delay_ms(2);//一层点亮时间
- }
- }
- }
复制代码 |