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

📄 main.c

📁 自己做的一个简单的设备.使用Freescale HC908SR12单片机,使用KEYS,AD,PWM,FLASH,LCD等模块.经使用运行稳定.
💻 C
📖 第 1 页 / 共 2 页
字号:
				break;
			case '\n':
				return;
			default:
				break;
		}
	}while(1);	
}

const char SystemMenu[][16] = {{"背景灯  开"},
							  {"亮  度  210"},
							  {"触发方式 高"},
							  {"信号输出 高"}};
							  

void SetSystem(void)
{
	unsigned char cursel;
	unsigned char sLight;
	unsigned char sld;
	char sTargetType;
	char sOutType;
	unsigned char key;
	
	sLight = mSystem.bLight;
	sld = mSystem.ld;
	if(sld < 150 )
		sld = 150;
	sTargetType = mSystem.TargetType;
	sOutType = mSystem.OutType;
	
	cursel = 0;
	LCD_Cls();
	LCD_SetAdd(0);
	Str("背景灯");
	if(sLight)
		Str("    开");
	else
		Str("    关");

	LCD_DrawNum(4,1,sld);
	LCD_SetAdd(8);
	Str("亮  度");
	
	LCD_SetAdd(16);
	Str("触发方式");
	switch(sTargetType)
	{
		case 0:
			Str("  低");
			break;
		case 1:
			Str("  高");
			break;
		case 2:
			Str("  下");
			break;
		case 3:
			Str("  上");
			break;
		default:
			Str("  低");
			sTargetType = 0;
	}
	
	LCD_SetAdd(24);
	Str("输出方式");
	switch(sOutType)
	{
		case 0:
			Str("  低");
			break;
		case 1:
			Str("  高");
			break;
		default:
			Str("  低");
			sOutType = 0;
	}
	
	
	LCD_Reverse(cursel);
	
	while(1)
	{
		key = GetKey();
		if(key)
		{
			switch(key)
			{
				case 'U':
					if( cursel > 0)
						cursel--;
					break;
				case 'D':
					if(cursel < 4)
						cursel++;
					break;
				case '<':
					switch(cursel)
					{
						case 0:
							sLight = 0x00;
							break;
						case 1:
							if(sld > 150)
								sld--;
							break;
						case 2:
							sTargetType--;
							if(sTargetType < 0)
								sTargetType = 3;
							break; 
						case 3:
							sOutType--;
							if(sOutType < 0)
								sOutType = 1; 		
						default:
							break;
					}
					break;
				case '>':
					switch(cursel)
					{
						case 0:
							sLight = 0x0FF;
							break;
						case 1:
							if(sld <254)
								sld++;
							break;
						case 2:
							sTargetType++;
							if(sTargetType > 3)
								sTargetType = 0;
							break; 
						case 3:
							sOutType++;
							if(sOutType > 1)
								sOutType = 0; 		
						default:
							break;
					}
					break;
				case '\n':
					mSystem.ld = sld;
					mSystem.bLight = sLight;
					mSystem.TargetType = sTargetType;
					mSystem.OutType = sOutType;
					
					if(mSystem.OutType)
						TRG_OUT = 0;	//输出触发
					else
						TRG_OUT = 1;
										
					EraseSystem();
					if(WriteSystem())
					{
						Error();
					};
					return;
				case 'E':
					return;
				case '7':
					HideMenu();
					break;
				default:
					break;
			}
			
			SetLight(sld);
			
			LCD_Cls();
			LCD_SetAdd(0);
			Str("背景灯");
			if(sLight)
			{
				BKLIGHT = 1;
				Str("    开");
			}
			else
			{
				BKLIGHT = 0;
				Str("    关");
			}
				
			LCD_DrawNum(4,1,sld);
			LCD_SetAdd(8);
			Str("亮  度");
			
			LCD_SetAdd(16);
			Str("触发方式");
			switch(sTargetType)
			{
				case 0:
					Str("  低");
					break;
				case 1:
					Str("  高");
					break;
				case 2:
					Str("  下");
					break;
				case 3:
					Str("  上");
					break;
				default:
					Str("  低");
					sTargetType = 0;
			}
			
			LCD_SetAdd(24);
			Str("输出方式");
			switch(sOutType)
			{
				case 0:
					Str("  低");
					break;
				case 1:
					Str("  高");
					break;
				default:
					Str("  低");
					sOutType = 0;
			}
			if(cursel < 4)
				LCD_Reverse(cursel);			
		}
	}
};

const char SetRecord[][16] = {{"0 记录零"},
							  {"1 记录一"},
							  {"2 记录二"},
							  {"3 记录三"},
							  {"4 记录四"},
							  {"5 记录五"},
							  {"6 记录六"},
							  {"7 记录七"},
							  {"8 记录八"}};
							  
void SaveSet(void)
{
	unsigned char sMenu,oldsMenu;
	unsigned char i,cursel,oldcur;

	
	oldcur = cursel = 0;
	oldsMenu = sMenu = 0;
	 
	LCD_Cls();
	LCD_SetAdd(0);
	Str("    保存记录    ");
	for(i = 0; i < 3; i++)
	{
		LCD_SetAdd(i * 8 + 8);
		Str(SetRecord[sMenu + i]);			
	}
	LCD_Reverse(cursel - sMenu + 1);
	
	while(1)
	{
		key = GetKey();
		
		switch(key)
		{
		case KEY_UP:
			if(cursel > 0)
			{
				cursel--;
				if(cursel < sMenu)
					sMenu--;
			}
			break;
		case KEY_DOWN:
			if(cursel < 8)
			{
				cursel++;
				if(cursel > sMenu + 2)
					sMenu++;
			}
			break;
		case KEY_ENTER:
			EraseRecord(cursel);
			WriteRecord(cursel);
			return;
		case KEY_ESC:
			
			return;
		default:
			if(key >= '0' && key < '9')
			{
				EraseRecord(key - '0');
				WriteRecord(key - '0');
				return;
			}
					
		 	break;
		}
		
		if(oldsMenu != sMenu)
		{
			for(i = 0; i < 3; i++)
			{
				LCD_SetAdd(i * 8 + 8);
				Str(SetRecord[sMenu + i]);			
			}
			oldsMenu = sMenu;
		}
		if(cursel != oldcur)
		{
			LCD_Reverse(cursel - sMenu + 1);
			oldcur = cursel;
		}
	}
};



void ReadSet(void)
{
	unsigned char sMenu,oldsMenu;
	unsigned char i,cursel,oldcur;

	
	oldcur = cursel = 0;
	oldsMenu = sMenu = 0;
	 
	LCD_Cls();
	LCD_SetAdd(0);
	Str("    读取记录    ");
	for(i = 0; i < 3; i++)
	{
		LCD_SetAdd(i * 8 + 8);
		Str(SetRecord[sMenu + i]);			
	}
	LCD_Reverse(cursel - sMenu + 1);
	
	while(1)
	{
		key = GetKey();
		
		switch(key)
		{
		case KEY_UP:
			if(cursel > 0)
			{
				cursel--;
				if(cursel < sMenu)
					sMenu--;
			}
			break;
		case KEY_DOWN:
			if(cursel < 8)
			{
				cursel++;
				if(cursel > sMenu + 2)
					sMenu++;
			}
			break;
		case KEY_ENTER:
			ReadRecord(cursel);
			return;
		case KEY_ESC:
			
			return;
		default:
			if(key >= '0' && key < '9')
			{
				ReadRecord(key - '0');
				return;
			}
		 	break;
		}
		
		if(oldsMenu != sMenu)
		{
			for(i = 0; i < 3; i++)
			{
				LCD_SetAdd(i * 8 + 8);
				Str(SetRecord[sMenu + i]);			
			}
			oldsMenu = sMenu;
		}
		if(cursel != oldcur)
		{
			LCD_Reverse(cursel - sMenu + 1);
			oldcur = cursel;
		}
	}
};

void About(void)
{
	LCD_SetAdd(0);
	Str("脉冲发生器V1.0  ");
	LCD_SetAdd(8);
	Str("上海东方久乐公司");
	LCD_SetAdd(16);
	Str("制作  文洪奎    ");
	LCD_SetAdd(24);
	Str("Tel:021-58973027");
	while(!GetKey());
};

struct MenuStruct
{
	const char MenuStr[16];
	void (* const Fun)();
};



const struct MenuStruct MainMenu[10] = {{"1 读取设置  ",ReadSet},
								  {"2 点    火  ",Start},
								  {"3 设置通道一",SetCh1},
								  {"4 设置通道二",SetCh2},
								  {"5 系统设置  ",SetSystem},
								  {"6 保存设置  ",SaveSet},
								  {"7 关    于  ",About}};	
								  				
void RootMenu(void)
{
	unsigned char sMenu,oldsMenu;
	unsigned char i,cursel,oldcur;

	
	oldcur = cursel = 0;
	oldsMenu = sMenu = 0;
	 
ReDraw:
	LCD_Cls();
	for(i = 0; i < 4; i++)
	{
		LCD_SetAdd(i * 8);
		Str(MainMenu[sMenu + i].MenuStr);			
	}
	LCD_Reverse(cursel - sMenu);
	
	while(1)
	{
		key = GetKey();
		
		switch(key)
		{
		case KEY_UP:
			if(cursel > 0)
			{
				cursel--;
				if(cursel < sMenu)
					sMenu--;
			}
			break;
		case KEY_DOWN:
			if(cursel < 6)
			{
				cursel++;
				if(cursel > sMenu + 3)
					sMenu++;
			}
			break;
		case KEY_ENTER:
			MainMenu[cursel].Fun();
			goto ReDraw;
			break;
		default:
			if(key > '0' && key < '8')
			{
				MainMenu[key - '0' - 1].Fun();
				goto ReDraw;				
			}
		}
		
		if(oldsMenu != sMenu)
		{
			for(i = 0; i < 4; i++)
			{
				LCD_SetAdd(i * 8);
				Str(MainMenu[sMenu + i].MenuStr);			
			}
			oldsMenu = sMenu;
		}
		if(cursel != oldcur)
		{
			LCD_Reverse(cursel - sMenu);
			oldcur = cursel;
		}
	}
}

void InitPort(void)
{
	T1 = 0;
	T2 = 0;
	
	DDRA_DDRA5 = 1;
	DDRA_DDRA6 = 1;
	
	TI1 = 0;	//点火上端
	TI2 = 0;	//点火上端
	
	DDRA_DDRA3 = 1;	//点火上端
	DDRA_DDRA4 = 1;	//点火上端
	
	DDRC_DDRC3 = 0;		//电阻测量
	DDRC_DDRC4 = 0;		//电阻测量
	
	PTC_PTC5 = 0;	//点火下端
	PTC_PTC6 = 0;	//点火下端

	DDRC_DDRC5 = 1;	//点火下端
	DDRC_DDRC6 = 1;	//点火下端

}

void SetCurrent(unsigned int Ch1,unsigned int Ch2)
{
	unsigned int temp;
	Ch1 = Ch1 / 64;
	temp = (Ch1 + mSystem.I1_O) * mSystem.I1_S;  // I1_S = 84
	PWMDR1 = temp >> 8;
	Ch2 = Ch2 / 64;
	temp = (Ch2 + mSystem.I2_O) * mSystem.I2_S;
	PWMDR2 = temp >> 8;	
}

/*
void SetCurrent(unsigned int Ch1,unsigned int Ch2)
{
	unsigned int i;
	unsigned int vCh1,vCh2;

	FIRE_CURRENT1_DDR = 1;
	while(GetAD(0) < Ch1)
	{
		FIRE_CURRENT1 = 1;
	}
	FIRE_CURRENT1_DDR = 0;
	
	
	FIRE_CURRENT2_DDR = 1;
	while(GetAD(1) < Ch2)
	{
		FIRE_CURRENT2 = 1;
	}
	FIRE_CURRENT2_DDR = 0;
	
	while(1)
	{
		vCh1 = GetAD(0);
		vCh2 = GetAD(1);
		
		if(GetAD(0) == Ch1 &)
		{
			FIRE_CURRENT1_DDR = 0;
		}
		
		if(GetAD(0) < Ch1)
		{
			FIRE_CURRENT1_DDR = 1;
			FIRE_CURRENT1 = 1;
		}

		if(GetAD(0) > Ch1)
		{
			FIRE_CURRENT1 = 0;
			FIRE_CURRENT1_DDR = 1;
		}
		
		if(GetAD(1) == Ch2)
		{
			FIRE_CURRENT2_DDR = 0;
		}
		
		if(GetAD(1) < Ch2)
		{
			FIRE_CURRENT2 = 1;
			FIRE_CURRENT2_DDR = 1;
		}

		if(GetAD(1) > Ch2)
		{
			FIRE_CURRENT1 = 0;
			FIRE_CURRENT1_DDR = 1;
		}
	}
}
*/

void StartFire(void)
{
	T1MOD = 0x00001;
	T1SC = 0x030;	// 125K  = 8MHz / (64 * 255 * 255)
	T1MOD = SYSCLK / 10000;  
	T1SC = 0x070;	//允许中断,停止工作,复位TCNT
	
	
	TI1 = 1;
	TI2 = 1;
	
	sT0 = mRecord.sTime0;
	sT1 = mRecord.sTime1;
	lT0 = mRecord.lTime0 + 2;
	lT1 = mRecord.lTime1 + 2;
	
	T1SC_TSTOP = 0;	//开始中断
	
	while(lT0 | lT1)		//等待点火完成
	{
		if(GetKey() == KEY_ESC)
		{
			T1SC_TSTOP = 1;
			lT0 = 0; 
			lT1 = 0;
			sT0 = 0;
			sT1 = 0;
			break;
		};
	}
	
	T1SC_TSTOP = 1;
	nFired = 0x00;
	
	TI1 = 0;
	TI2 = 0;
	
	SetCurrent(0,0);
		
	if(mSystem.OutType)
		TRG_OUT = 0;	//输出触发
	else
		TRG_OUT = 1;
			

	
}

__interrupt void Timer1_Interrupt(void)		//10KHz
{
	T1SC_TOF = T1SC_TRST;	//新中断
	
	if(nFired != 0x0C5)
	{	nError = 0x01;
		return;
	}
	
	if(mSystem.OutType)
		TRG_OUT = 1;	//输出触发
	else
		TRG_OUT = 0;
	
	if(sT0 > 0)
	{
		sT0--;
		FIRE1 = 0;
	}
	else if(lT0 > 0)
	{
		lT0--;
		
		//点火
		FIRE1 = 1;
	}
	
	if(lT0 == 0)
	{
		//结束点火
		FIRE1 = 0;
	}
	
	if(sT1 > 0)
	{
		sT1--;
		FIRE2 = 0;
	}
	else if(lT1 > 0)
	{
		lT1--;
		//点火
		FIRE2 = 1;
	}
	
	if(lT1 == 0)
	{
		//结束点火
		FIRE2 = 0;
	}
};

__interrupt void IRQ1_Interrupt(void)	//外部触发
{
	if(nTrg_In != 0x0C5)
	{
		nError = 0x02;
		return;
	}
	
	StartFire();	
};

⌨️ 快捷键说明

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