CD74HCT574M灯环扫描
这个方案还是有点复杂的,需要好好记录下来,防止写完就忘,后面不好维护。
理解这个灯环方案首先要了解574的工作原理。
我一开始看到电路图想当然的认为就是输入什么输出什么,其实也没错,但是!人家是寄存器!人家会一直保存着数据,即使没有片选,它里面的数据也是在的!
数据锁存和不锁存对灯环的驱动方案是完全不一样的。
上表就是整个电路图的关系表。
GPIO1_11-14对应的就是LED_DRV0-3
灯环的每个灯珠上电就亮,下电就灭。因此需要高速刷新,防止其闪烁。
驱动步骤:
1.所有的574 CS拉低
2.所有DRV线拉低
3.向OUT_D口刷入数据,刷新顺序如上表的CS顺序。每刷一个芯片的数据,就拉高此芯片的CS脚,产生一个上升沿锁存数据
4.拉高DRV线,点亮此组的灯珠
具体代码如下:
/////////////////////////////////////////////////////////////////////
//
// led_scan():
// func:灯环扫描刷新程序
// input:
// output:
//
/////////////////////////////////////////////////////////////////////
UINT32 ring_led_scan(UINT32 RET)
{
UINT32 i,j,ret;
//OC=0,74HCT574M寄存器输出数据
GpioOutDataReset(GPIO_PORT1,BIT23|BIT24|BIT25|BIT26|BIT27);
//ROW全低,led灯环全部熄灭
GpioOutDataReset(GPIO_PORT1,BIT11|BIT12|BIT13|BIT14);
for(j=0;j<5; j++)//cs pin
{
//led scan data set(col)
for(i=0; i<8; i++)
{
ret = i + j*32 + led_scan_row_pin_ptr*8;//led data ptr,灯环定位详见ASC51原理图分解
if(ringled_data[ret])
{
GpioOutDataReset(GPIO_PORT1, led_data_scan_pin[i]);
}
else
{
GpioOutDataSetPlus(GPIO_PORT1, led_data_scan_pin[i]);
}
}
//拉高CS,提供一个CLK上升沿。Clk上升沿将数据打入74HCT574M寄存器中锁存
GpioOutDataSetPlus(GPIO_PORT1, led_cs_pin[j]);
if(ret==119 || ret==127)
{
break;
}
}
//拉高ROW,点亮此行的LED灯环
GpioOutDataSetPlus(GPIO_PORT1, led_scan_row_pin[led_scan_row_pin_ptr++]);
if(4 == led_scan_row_pin_ptr)
{
led_scan_row_pin_ptr = 0;
}
return 0;
}
本文来自博客园,作者:xjxcxjx,转载请注明原文链接:https://www.cnblogs.com/xjxcxjx/p/15724412.html,谢绝CSDN转载!