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;
}

 

posted @ 2021-12-23 17:16  xjxcxjx  阅读(142)  评论(0编辑  收藏  举报