浪费了我2天时间终于搞定led驱动bug

在128位宽的led屏上解决了数组2和3不显示的bug

原先的陈旭总是不能显示数组2,和3, 但是又可以清屏,填满正个屏幕。

并且我佘子数组3最后一个字节127为0xff时,整个数组2和3对应的区域又全亮了。

后来发现原理是这样的:

以前的代码我每一行是扫描128×2个位,理应是每一行扫描128个位到led屏幕

 

void GUI_Refresh(void)
{
		INT8U temp_page;
		INT8U temp_count;
		INT8U  i,j;
	//	static INT8U Page
		static	INT8U  ScanCount=0; /*用于记录扫描行数*/
	
		if(ScanCount==SCREEN_DUTY)
		{
		 ScanCount=0;
		}	
	 	 temp_count = ScanCount%8;	
	  	 for(j=SCREEN_YSIZE/SCREEN_DUTY;j>0;)
	   	 {	
			j--;
			temp_page = (ScanCount+SCREEN_DUTY*j)/8;
			//for(i=SCREEN_XSIZE;i>0;)
			for(i=0;i<SCREEN_XSIZE;i++)
			{

			//	if(GDRAM[temp_page][--i] & Bit_Mask[temp_count])
			    if(GDRAM[temp_page][i] & Bit_Mask[temp_count])
				{
					if (temp_page>=2)
					{
					  HC595_R2_L;
					}
					else
					{
					  HC595_R_L;
					}
				}else{
					if (temp_page>=2)
					{
					 HC595_R2_H;
					}
					else
					{
					  HC595_R_H;
					}
					
				}  
				HC595_CLK_L;
				HC595_CLK_H;
			}
		 }
 
	LS138_OE1_H;	 //这里要试验
    
    HC595_LOCK_L;
	for(i=2; i>0; i--);	 //这里呢
    HC595_LOCK_H;
	HC595_LOCK_L;  //?这里是否要?
//	LS138_OE1_L;
	#ifdef 	SCREEN_ROTATE_180
	switch(15-ScanCount)
	#else 
	switch(ScanCount)
	#endif		 	   									   
	{
		case 0:  LS138_C_L;LS138_B_L;LS138_A_L;	LS138_D_L; break;	
		case 1:  LS138_C_L;LS138_B_L;LS138_A_H;	LS138_D_L; break;	//
		case 2:  LS138_C_L;LS138_B_H;LS138_A_L;	LS138_D_L; break;	// 
		case 3:  LS138_C_L;LS138_B_H;LS138_A_H;	LS138_D_L; break;	//		
		case 4:  LS138_C_H;LS138_B_L;LS138_A_L;	LS138_D_L; break;	//
		case 5:  LS138_C_H;LS138_B_L;LS138_A_H;	LS138_D_L; break;
		case 6:  LS138_C_H;LS138_B_H;LS138_A_L;	LS138_D_L; break;
		case 7:  LS138_C_H;LS138_B_H;LS138_A_H;	LS138_D_L; break;
		case 8:  LS138_C_L;LS138_B_L;LS138_A_L;	LS138_D_H; break; 		
		case 9:  LS138_C_L;LS138_B_L;LS138_A_H;	LS138_D_H; break;
		case 10: LS138_C_L;LS138_B_H;LS138_A_L;	LS138_D_H; break;
		case 11: LS138_C_L;LS138_B_H;LS138_A_H;	LS138_D_H; break;
		case 12: LS138_C_H;LS138_B_L;LS138_A_L;	LS138_D_H; break;
		case 13: LS138_C_H;LS138_B_L;LS138_A_H;	LS138_D_H; break;
		case 14: LS138_C_H;LS138_B_H;LS138_A_L;	LS138_D_H; break;
		case 15: LS138_C_H;LS138_B_H;LS138_A_H;	LS138_D_H; break;

		default: ScanCount=0;break;
	}
	LS138_OE1_L;
	ScanCount++;
		
}



新的源码
 
void GUI_Refresh(void)
{
	INT8U temp_page,temp_page2;
	INT8U temp_count;
	INT32U  i;
		
	static	INT8U  ScanCount=0; /*用于记录扫描行数*/
	
	if(ScanCount==16)
	{
	 ScanCount=0;
	}
	//-取值范围:1,2,3,4,,7;和Bit_Mask[]配合表示要扫描的位
	temp_count = ScanCount%8;
	temp_page = (ScanCount)/8;	  //0,1
	temp_page2=	(ScanCount+16)/8; //2,3
	for(i=0;i<SCREEN_XSIZE;i++)
	{
	    if(GDRAM[temp_page][i] & Bit_Mask[temp_count])
		{
		 	    
			  HC595_R_L; 
		}
		else
		{
		 
			   HC595_R_H;					
		}

	    if(GDRAM[temp_page2][i] & Bit_Mask[temp_count])
		{
			  HC595_R2_L;	    				 
		}
		else
		{
			   HC595_R2_H;				 				
		}				  
		HC595_CLK_L;
		HC595_CLK_H;
	}
	LS138_OE1_H;	 //这里要试验
    
    HC595_LOCK_L;
	for(i=2; i>0; i--);	 //这里呢
    HC595_LOCK_H;
	HC595_LOCK_L;  //?这里是否要?
//	LS138_OE1_L; 
	switch(ScanCount)		 	   									   
	{
		case 0:  LS138_C_L;LS138_B_L;LS138_A_L;	LS138_D_L; break;	
		case 1:  LS138_C_L;LS138_B_L;LS138_A_H;	LS138_D_L; break;	
		case 2:  LS138_C_L;LS138_B_H;LS138_A_L;	LS138_D_L; break;	// 
		case 3:  LS138_C_L;LS138_B_H;LS138_A_H;	LS138_D_L; break;	//
		case 4:  LS138_C_H;LS138_B_L;LS138_A_L;	LS138_D_L; break;	//
		case 5:  LS138_C_H;LS138_B_L;LS138_A_H;	LS138_D_L; break;
		case 6:  LS138_C_H;LS138_B_H;LS138_A_L;	LS138_D_L; break;
		case 7:  LS138_C_H;LS138_B_H;LS138_A_H;	LS138_D_L; break;
		case 8:  LS138_C_L;LS138_B_L;LS138_A_L;	LS138_D_H; break; 		
		case 9:  LS138_C_L;LS138_B_L;LS138_A_H;	LS138_D_H; break;
		case 10: LS138_C_L;LS138_B_H;LS138_A_L;	LS138_D_H; break;
		case 11: LS138_C_L;LS138_B_H;LS138_A_H;	LS138_D_H; break;
		case 12: LS138_C_H;LS138_B_L;LS138_A_L;	LS138_D_H; break;
		case 13: LS138_C_H;LS138_B_L;LS138_A_H;	LS138_D_H; break;
		case 14: LS138_C_H;LS138_B_H;LS138_A_L;	LS138_D_H; break;
		case 15: LS138_C_H;LS138_B_H;LS138_A_H;	LS138_D_H; break;

		default: ScanCount=0;break;
	}
	LS138_OE1_L;
	ScanCount++;
		
}

 

 

 

 

P2.3   CLK    P2.4   GND
P2.5   LAT     P2.6   GND
P2.7   G2      P2.8    R2
P2.9   G1      P0.16  R1
P0.15 LD      P0.17  EN      排针突出的一面朝这里。
P0.18 LC      P0.19  GND
P0.20 LB      P0.21  GND
P0.22 LA      GND    GND 

一个led屏一般是16行,分成2个8行, 然后呢通过LA,LB,LC输出不同的信号来选择不同的行,
每一次扫描2行。大概是每1ms扫描1次。需要不断的通过spi接口的方式输出数据给led屏,
R1和R2是数据线代表上8行和下8行,CLK是传输数据时用的时钟线。
LAT也叫st或者HC595_LOCK,这个是和EN也叫LS138_OE1 配合使用来选择不同的行的。
LC   LB   LA 是用来选择不同的行的。
这个排针没有用到的有G2,G1 ,LD,


    

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值