|
楼主 |
发表于 2016-12-11 19:59:27
|
显示全部楼层
前面提到,这个模型就是一个大号的红绿灯,状态是轮流切换的……
代码方面有很多种方法可以实现,我用的是对象+线程调度的方法,比较复杂。
最笨但也是最快的一种方法就是把各个状态定义成一个“码”;把所有状态的码定义成数组;然后定时发送这些码就可以了。
用4个灯轮流亮1个灯举例子:
1-定义1为亮,0为灭
2-灯数量为4
3-伪代码:
//1-底层驱动:根据具体硬件修改
void SendTo74HC595(char *Code)//刷新74HC595输出
{
u8 i;
_ClrHC595_EN;//HC595_EN=0;
_SetHC595_RST;
_ClrHC595_SHIFT;//输出锁存=0
for(i=0;i<4;i++)//这里固定为4个灯状态
{
_ClrHC595_CLK;//HC595_CLK =0;
if(Code==1)
{
_SetHC595_DATA;//HC595_DATA=1;
}
else
{
_ClrHC595_DATA;//HC595_DATA=0;
}
_SetHC595_CLK;//HC595_CLK =1;
}
}
_SetHC595_SHIFT;//输出锁存=1。发出锁存脉冲
}
//2-上层算法相关:这部分代码是可以随便移植的
char table[4][4]=//4个灯,总共4种状态
{
{1,0,0,0},//状态0:0亮,1灭,2灭,3灭
{0,1,0,0},//状态1:0灭,1亮,2灭,3灭
{0,0,1,0},//状态2:0灭,1灭,2亮,3灭
{0,0,0,1},//状态3:0灭,1灭,2灭,3亮
};
void main(void)
{
……//初始化
while(1)//循环显示流水灯
{
SendTo74HC595(table[0]);//发送状态0
delay_ms(1000);//状态0显示1秒
SendTo74HC595(table[1]);//发送状态1
delay_ms(1000);//状态1显示1秒
SendTo74HC595(table[2]);//发送状态2
delay_ms(1000);//状态2显示1秒
SendTo74HC595(table[3]);//发送状态3
delay_ms(1000);//状态3显示1秒
}
}
在这个基础框架上,慢慢增加状态定义,如快闪、慢闪等……如果已经入门,当然就没必要看这些基本的东西了 |
|