⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 sub.c

📁 此程式为LED驱动,用合泰的蕊片,希望对大家有帮助
💻 C
字号:
//-----------------------------------------------
//function : 	INI_Memory
//in : 		NULL
//out : 	NULL
//description:	clear all RAM
//-----------------------------------------------
void INI_Memory(void)
{
	//_clrwdt();
	for(_mp=C_RAM_END;_mp>=C_RAM_START;_mp--) _iar=0;
}

//-----------------------------------------------
//function : 	INI_System
//in : 		NULL
//out : 	NULL
//description:	initial system set
//-----------------------------------------------
void INI_System(void)
{
	//IO set
	_pb = 0;
	_pbc = 0;
	_pc = 0;
	_pcc = 0;
	_pg = 0;
	_pgc = 0;
	
	_pa = 0x1f;		//data , wr ,cs1 , cs2 , cs3 = 1
	_pac = 0;
	
	//system regedit set
	_tmrc = C_TMRC;
	_tmr = C_TMR;
	_intc = C_INTC;
}

//-----------------------------------------------
//function : 	INI_1632
//in : 		NULL
//out : 	NULL
//description:	initial 1632
//-----------------------------------------------
void INI_1632(void)
{
	//command set
	P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOn;	//1632 CS1 & CS2 & CS3 enable
	SBR_INIT_1632();			//inital 1632's set
	P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOff;	//1632 CS1 & CS2 & CS3 disable
	
	//data write
	P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOn;	//1632 CS1 & CS2 & CS3 enable
	SBR_ALLRAM_1632(0);			//all LED write 0
	P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOff;	//1632 CS1 & CS2 & CS3 disable
}

//-----------------------------------------------
//function : 	SBR_DATA_DisplayCS
//in : 		CSEn -- which 1632 was enable
//		station -- where address of RAM start write(0~47)
//out : 	NULL
//description:	load data write into 1632 which CSEn control start address of station
//-----------------------------------------------
void SBR_DATA_DisplayCS(unsigned char CSEn,unsigned char station)
{
	unsigned char CSDis,x,y,data;
	CSDis = CSEn ^ 0xff;			//save CS off
	station = (C_DATA_MAX_CS-1)-station;	//set the real station of 1632 RAM
	
	while((station < C_DATA_MAX_CS) && (M_DATA_TableCnt < C_DATA_MAX_Length))
	{
		//load data
		if(station > 23)
		{
			//LED 4~6
			x = (station - 24);		//RAM address count			
			x = ((x & 0x0f8) + (7 - (x & 0x07))) * 4 + 2;
		}
		else
		{
			//LED 1~3
			x = station;			//RAM address count
			x = ((x & 0x0f8) + (7 - (x & 0x07))) * 4;
		}
		
		station++;
		data = T_Data_Value[M_DATA_TableCnt];	//load data
		M_DATA_TableCnt++;			//next data
		
		//*******************************
		//insert part
		//Up & Down Mask
		if((M_Function_Step == C_FunStep_UDOn) || (M_Function_Step == C_FunStep_UDOff))
		{
			data &= M_DATA_UDMask;
		}
		//end of insert part
		//*******************************
		
		//1632 control
		P_CSControl_1632 &= CSEn;		//CS enable
		SBR_PREDATA_1632();			// "101" , ready for write
		SBR_ADDRESS_1632(x);			// address = x
		SBR_DATA_1632(data);
		P_CSControl_1632 |= CSDis;		//CS disable	
	}
}

//-----------------------------------------------
//function : 	SBR_DATA_DisplayByte
//in : 		CSEn -- which 1632 was enable
//		station -- where address of RAM start write(0~47)
//		data -- what data need write into 1632
//out : 	NULL
//description:	load data write into 1632 which CSEn control start address of station
//-----------------------------------------------
void SBR_DATA_DisplayByte(unsigned char CSEn,unsigned char station,unsigned char data)
{
	unsigned char CSDis,x;
	
	CSDis = CSEn ^ 0xff;			//save CS off
	
	if(station > 23)
	{
		//LED 4~6
		x = (station - 24);		//RAM address count			
		x = ((x & 0x0f8) + (7 - (x & 0x07))) * 4 + 2;
	}
	else
	{
		//LED 1~3
		x = station;			//RAM address count
		x = ((x & 0x0f8) + (7 - (x & 0x07))) * 4;
	}
	
	//1632 control
	P_CSControl_1632 &= CSEn;		//CS enable
	SBR_PREDATA_1632();			// "101" , ready for write
	SBR_ADDRESS_1632(x);			// address = station
	SBR_DATA_1632(data);
	P_CSControl_1632 |= CSDis;		//CS disable
}



//===============================================
//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP0
//in : 		NULL
//out : 	NULL
//description:	step0,run from R->L
//-----------------------------------------------
void SBR_FUNCTION_STEP0(void)
{
	unsigned char x;		//temp save the address of data station
	
	if(M_DATA_FrePoint < C_DATA_MAX_Length)
	{
		//this step not run finally
		M_DATA_TableCnt = 0;
		x = M_DATA_FrePoint;
		if(x < C_DATA_MAX_CS) 
		{
			//data only at CS3
			SBR_DATA_DisplayCS(C_1632_CS3En,x);
		}
		else
		{
			x -= C_DATA_MAX_CS;
			if(x < C_DATA_MAX_CS)
			{
				//data at CS2 + CS3 all
				SBR_DATA_DisplayCS(C_1632_CS2En,x);
				SBR_DATA_DisplayCS(C_1632_CS3En,(C_DATA_MAX_CS-1));
			}
			else
			{
				x -= C_DATA_MAX_CS;
				//data at CS1 + CS2 + CS3 all
				SBR_DATA_DisplayCS(C_1632_CS1En,x);
				SBR_DATA_DisplayCS(C_1632_CS2En,(C_DATA_MAX_CS-1));
				SBR_DATA_DisplayCS(C_1632_CS3En,(C_DATA_MAX_CS-1));
			}
		}
	}
	else
	{
		//this step run end
		M_Function_Step++;		//next function step
		
		//insert initial step2 code at here
		M_TMR_MS = 0;
		M_TMR_SEC = 0;			//clear TMR count
	}
}

//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP1
//in : 		NULL
//out : 	NULL
//description:	step1,delay
//-----------------------------------------------
void SBR_FUNCTION_STEP1(void)
{
	M_Function_Step++;		//next function step
				
	//insert initial step3 code at here
	//command set
	//P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOn;	//1632 CS1 & CS2 & CS3 enable
	//SBR_PRECOMMAND_1632();					//send "100" for command
	//SBR_COMMAND_1632(C_COMMAND1632_BLINKON);		//BLINK ON
	//P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOff;	//1632 CS1 & CS2 & CS3 disable
	
	M_TMR_SEC = 0;
}

//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP2
//in : 		NULL
//out : 	NULL
//description:	step2,data blink
//-----------------------------------------------
void SBR_FUNCTION_STEP2(void)
{
	if(M_TMR_SEC > C_LED_BlinkTime)
	{
		M_Function_Step++;		//next function step
					
		//insert initial step3 code at here
		//command set
		P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOn;	//1632 CS1 & CS2 & CS3 enable
		SBR_PRECOMMAND_1632();					//send "100" for command
		SBR_COMMAND_1632(C_COMMAND1632_LEDON);			//BLINK OFF
		P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOff;	//1632 CS1 & CS2 & CS3 disable
		
		M_TMR_SEC = 0;
	}
	else
	{
		if(!M_TMR_MS)
		{
			P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOn;	//1632 CS1 & CS2 & CS3 enable
			SBR_PRECOMMAND_1632();					//send "100" for command
			SBR_COMMAND_1632(C_COMMAND1632_LEDON);			//LED ON
			P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOff;	//1632 CS1 & CS2 & CS3 disable
		}
		else if(M_TMR_MS == 62)
		{
			P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOn;	//1632 CS1 & CS2 & CS3 enable
			SBR_PRECOMMAND_1632();					//send "100" for command
			SBR_COMMAND_1632(C_COMMAND1632_LEDOFF);			//LED OFF
			P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOff;	//1632 CS1 & CS2 & CS3 disable
		}
	}
}

//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP4
//in : 		NULL
//out : 	NULL
//description:	step4,move form R->L overflow
//-----------------------------------------------
void SBR_FUNCTION_STEP4(void)
{
	M_DATA_TableCnt = C_DATA_MAX_Length - M_DATA_FrePoint;
	
	SBR_DATA_DisplayCS(C_1632_CS1En,(C_DATA_MAX_CS-1));
	SBR_DATA_DisplayCS(C_1632_CS2En,(C_DATA_MAX_CS-1));
	SBR_DATA_DisplayCS(C_1632_CS3En,(C_DATA_MAX_CS-1));	//write data into 1632
	
	if(!M_DATA_FrePoint)
	{
		M_Function_Step++;				//next function
		
		//insert initial step4 code at here		
		M_TMR_SEC = M_TMR_MS = 0;	
	}
}

//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP6
//in : 		NULL
//out : 	NULL
//description:	step6,move form up & down
//-----------------------------------------------
void SBR_FUNCTION_STEP6(void)
{
	M_DATA_TableCnt = 0;
	M_DATA_UDMask = T_Data_UpDown[M_UDMask_Cnt];
	M_UDMask_Cnt++;
	
	SBR_DATA_DisplayCS(C_1632_CS1En,(C_DATA_MAX_CS-1));
	SBR_DATA_DisplayCS(C_1632_CS2En,(C_DATA_MAX_CS-1));
	SBR_DATA_DisplayCS(C_1632_CS3En,(C_DATA_MAX_CS-1));	//write data into 1632
	
	if(M_UDMask_Cnt > 3)
	{
		M_Function_Step++;				//next function
		M_TMR_SEC = M_TMR_MS = 0;
	}
}

//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP8
//in : 		NULL
//out : 	NULL
//description:	step8,move form up & down
//-----------------------------------------------
void SBR_FUNCTION_STEP8(void)
{
	M_DATA_TableCnt = 0;
	M_DATA_UDMask = T_Data_UpDown[M_UDMask_Cnt];
	M_UDMask_Cnt++;
	
	SBR_DATA_DisplayCS(C_1632_CS1En,(C_DATA_MAX_CS-1));
	SBR_DATA_DisplayCS(C_1632_CS2En,(C_DATA_MAX_CS-1));
	SBR_DATA_DisplayCS(C_1632_CS3En,(C_DATA_MAX_CS-1));	//write data into 1632
	
	if(M_UDMask_Cnt > 7)
	{
		M_Function_Step++;				//next function
		M_TMR_SEC = M_TMR_MS = 0;
	}
}

//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP10
//in : 		NULL
//out : 	NULL
//description:	step10,move form Left & Right
//-----------------------------------------------
void SBR_FUNCTION_STEP10(void)
{
	unsigned char x1,x2,data1,data2;
	
	data1 = T_Data_Value[M_DATA_TableCnt];					//load data which need display at Left
	data2 = T_Data_Value[((C_DATA_MAX_Length - 1) - M_DATA_TableCnt)];	//load data which need display at Right
	
	if(M_DATA_TableCnt < C_DATA_MAX_CS)
	{
		//data at CS1 & CS3
		x1 = M_DATA_TableCnt;		//count Left station
		x2 = (C_DATA_MAX_CS - 1) - x1;	//count Right station
		SBR_DATA_DisplayByte(C_1632_CS1En,x1,data1);
		SBR_DATA_DisplayByte(C_1632_CS3En,x2,data2);
	}
	else
	{
		//data at CS2
		x1 = M_DATA_TableCnt - C_DATA_MAX_CS;
		x2 = (C_DATA_MAX_CS - 1) - x1;	//count Right station
		SBR_DATA_DisplayByte(C_1632_CS2En,x1,data1);
		SBR_DATA_DisplayByte(C_1632_CS2En,x2,data2);
	}
	M_DATA_TableCnt++;			//next data	
	
	if(M_DATA_TableCnt >= C_DATA_MAX_Length/2)
	{
		//step end
		M_Function_Step++;		//next function
		M_TMR_SEC = M_TMR_MS = 0;
		M_DATA_TableCnt = (C_DATA_MAX_Length/2);
	}
}

//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP12
//in : 		NULL
//out : 	NULL
//description:	step12,move form Left & Right
//-----------------------------------------------
void SBR_FUNCTION_STEP12(void)
{
	unsigned char x1,x2;
	
	M_DATA_TableCnt--;			//next data
	if(M_DATA_TableCnt < C_DATA_MAX_CS)
	{
		//data at CS1 & CS3
		x1 = M_DATA_TableCnt;		//count Left station
		x2 = (C_DATA_MAX_CS - 1) - x1;	//count Right station
		SBR_DATA_DisplayByte(C_1632_CS1En,x1,0);
		SBR_DATA_DisplayByte(C_1632_CS3En,x2,0);
	}
	else
	{
		//data at CS2
		x1 = M_DATA_TableCnt - C_DATA_MAX_CS;
		x2 = (C_DATA_MAX_CS - 1) - x1;	//count Right station
		SBR_DATA_DisplayByte(C_1632_CS2En,x1,0);
		SBR_DATA_DisplayByte(C_1632_CS2En,x2,0);
	}
		
	if(!M_DATA_TableCnt)
	{
		//step end
		M_Function_Step++;		//next function
		M_TMR_SEC = M_TMR_MS = 0;
	}
}

//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP14
//in : 		NULL
//out : 	NULL
//description:	step14,CS1 & CS3 all on
//-----------------------------------------------
void SBR_FUNCTION_STEP14(void)
{
	//data write
	P_CS1_1632 = P_CS3_1632 = C_1632_CSOn;	//1632 CS1 & CS3 enable
	SBR_ALLRAM_1632(1);			//all LED write 1
	P_CS1_1632 = P_CS3_1632 = C_1632_CSOff;	//1632 CS1 & CS3 disable
	
	SBR_DATA_DisplayByte(C_1632_CS1En,(C_DATA_MAX_CS-1),0);
	SBR_DATA_DisplayByte(C_1632_CS3En,0,0);	//clear one line
	
	//insert initial step code at here
	M_Function_Step++;			//next function step
	M_TMR_SEC = M_TMR_MS = 0;
}

//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP16
//in : 		NULL
//out : 	NULL
//description:	step16,display HOLTEK
//-----------------------------------------------
void SBR_FUNCTION_STEP16(void)
{
	unsigned char x,data;
	
	for(x=0 ; x < 36 ; x++)
	{
		data = T_Data_Value[x];
		SBR_DATA_DisplayByte(C_1632_CS2En,x,data);
	}
	
	for(x=36 ; x < 48 ; x++)
	{
		//display HT logoicon
		data = T_HT_LogoIcon[(x-36)];
		SBR_DATA_DisplayByte(C_1632_CS2En,x,data);
	}
	
//	x = (C_DATA_MAX_CS-1) - x;		//set next address.(notice:in sbr function,the address will sub by MAX)
//	M_DATA_TableCnt = 0;			//Load begin data 0.(HOLTEK)
//	SBR_DATA_DisplayCS(C_1632_CS2En,x);	//Write one 1632
	
	//insert initial step code at here
	M_Function_Step++;			//next function step
	M_TMR_SEC = M_TMR_MS = 0;
}

//-----------------------------------------------
//function : 	SBR_FUNCTION_STEP18
//in : 		NULL
//out : 	NULL
//description:	step18,clear all LED display
//-----------------------------------------------
void SBR_FUNCTION_STEP18(void)
{
	//data write
	P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOn;	//1632 CS1 & CS2 & CS3 enable
	SBR_ALLRAM_1632(0);			//all LED write 0
	P_CS1_1632 = P_CS2_1632 = P_CS3_1632 = C_1632_CSOff;	//1632 CS1 & CS2 & CS3 disable
	
	//insert initial step code at here
	M_Function_Step++;			//next function step
	M_TMR_SEC = M_TMR_MS = 0;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -