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

📄 main.c

📁 自己做的一个简单的设备.使用Freescale HC908SR12单片机,使用KEYS,AD,PWM,FLASH,LCD等模块.经使用运行稳定.
💻 C
📖 第 1 页 / 共 2 页
字号:
//文件名   main.C
//目    的 主程序
//Copyright (c) 2006-2007 东方久乐公司电子研究所
//编    写 文洪奎 2007-01-15
//修    改 
//修改原因

#include <hidef.h> /* for EnableInterrupts macro */
#include <MC68HC908SR12.h> /* include peripheral declarations */

#include "global.h"
#include "lcd.h"
#include "key.h"
#include "ad.h"
#include "error.h"
#include "flash.h"


#define FIRE1 PTC_PTC5
#define FIRE2 PTC_PTC6

#define TI1 PTA_PTA4
#define TI2 PTA_PTA3

#define FIRE_CURRENT1 PTC_PTC1
#define FIRE_CURRENT2 PTC_PTC2

#define FIRE_CURRENT1_DDR DDRC_DDRC1
#define FIRE_CURRENT2_DDR DDRC_DDRC2

#define TRG_OUT PTC_PTC7
#define TRG_OUT_DDR DDRC_DDRC7

#define T1 PTA_PTA5
#define T2 PTA_PTA6

extern unsigned char nError;	//故障记录

unsigned char nFired;	//点火标记
unsigned char nTrg_In;	//外部触发标记
void StartFire(void);
void InitPort(void);
void RootMenu(void);
void SetCurrent(unsigned int Ch1,unsigned int Ch2);

char TestRam(void);
char TestProg(void);
char TestSystem(void);

const char name[] = "脉冲发生器";

#pragma DATA_SEG MY_ZEROPAGE
unsigned int sT0,sT1,lT0,lT1;	//点火程序用

int Res0,Res1;		//电阻值

unsigned char key;
SYSTEMSTR mSystem;
RECORDSTR mRecord;

int startAdd;
int endAdd;

#pragma DATA_SEG DEFAULT_RAM



extern	unsigned char KeyBuf[4];
extern	unsigned char pKey;

void main(void) 
{
//	unsigned int i,j,k;
//	unsigned int ad0,ad1,ad5,ad6,ad8,ad9;
//	unsigned char uKey;
//	static unsigned char OldKey;
    CONFIG1 = 1;
	EnableInterrupts; /* enable interrupts */
	/* include your code here */

	
	sT0 = 0;
	sT1 = 0;
	lT0 = 0;
	lT1 = 0;
	
	InitPort();	
	
	InitFlash();
	
	SetLight(200);		//亮度
	BKLIGHT = mSystem.bLight;
	
	LCD_Init();	
	LCD_Cls();
	LCD_TurnOn();
	LCD_SetAdd(0);
				
	Initkey();
	InitAD();
	
	if(TestRam())
	{
		nError = 1;
		Error();
	}

	if(TestProg())
	{
		nError = 2;
		Error();
	}
	
	if(ReadSystem())
	{
		nError = 17;
		Error();
	}
	
	if(TestSystem())
	{
		nError = 5;
		Error();
	}


	
	if(mSystem.OutType) //输出触发
		TRG_OUT = 0;	
	else
		TRG_OUT = 1;

	TRG_OUT_DDR = 1;	
	
	
	if(ReadRecord(0))
	{
		nError = 18;
		Error();
	}	
	
	
	DDRA_DDRA7 = 1;
	PTA_PTA7 = 0;
	

	SetLight(mSystem.ld);		//亮度
	BKLIGHT = mSystem.bLight;
	
	
	LCD_Cls();
	LCD_TurnOn();
	LCD_SetAdd(0);
	Str(name);	

	PWMCR_PWMEN1 = 1;
	PWMCR_PCH1 = 1;	
	
	PWMCR_PWMEN2 = 1;
	PWMCR_PCH2 = 1;
	
	PWMDR1 = 0;
	PWMDR2 = 0;
	
	RootMenu();	

	for(;;) //防止程序
	{
		//强制复位
		nError = 0x01;	//程序跑飞
		_asm jmp $0C080;	//程序重新运行
	}
}


void PreFire(void)
{
	static unsigned int oCh1,oCh2,oCh3,oCh4;
	unsigned int Ch1,Ch2,Ch3,Ch4;
	
	unsigned int i;
	unsigned char bReady;
	
	bReady = 0;
	
	T1 = 1;	//开测量
	T2 = 1;	//开测量
		
	LCD_Cls();
	LCD_SetAdd(0);
	Str("通道一电阻");
	oCh1 = Ch1 = DatatoRes(1,GetAD(8));
	LCD_DrawNum(5,0,Ch1);

	LCD_SetAdd(8);
	Str("通道二电阻");
	oCh2 = Ch2 = DatatoRes(2,GetAD(9));	
	LCD_DrawNum(5,1,Ch2);

	i = GetAD(0) * 49;
	if(i > (mRecord.iCur0 - 200) && i < mRecord.iCur0 + 200)
		bReady = 1;
	else
		bReady = 0;
		
	i = GetAD(1) * 49;
	if(i > (mRecord.iCur1 - 200) && i < mRecord.iCur1 + 200)
		bReady += 1;
	else
		bReady = 0;
		 
	if(bReady == 2)
	{
		LCD_SetAdd(16);
		Str("设备准备就绪");
		LCD_SetAdd(24);
		Str("请按7 键开始点火");
	}
	else
	{	
	
		LCD_SetAdd(16);
		Str("电压一");
		oCh3 = Ch3 = GetAD(0);
		LCD_DrawNum(3,2,Ch3);

		LCD_SetAdd(24);
		Str("电压二");
		oCh4 = Ch4 = GetAD(1);
		LCD_DrawNum(3,3,Ch4);
	}
//	LCD_SetAdd(16);
//	Str("请按7键启动点火");
	
	SetCurrent(mRecord.iCur0,mRecord.iCur1);
		
	while(1)
	{
		i = 10000;
		while(i)
		{
			i--;
		}
		
		key = GetKey();
		
		if(key == KEY_ESC)
		{
		
			T1 = 0;	//关测量
			T2 = 0;	//关测量		
		
			SetCurrent(0,0);
			return;
		}	
		if(key == KEY_7)
		{
			if(bReady == 2)
			{
				T1 = 0;	//关测量
				T2 = 0;	//关测量	
			
				nFired = 0x0C5;
				StartFire();
				//等待点火完成

				nFired = 0x000;
				LCD_Cls();
				LCD_SetAdd(8);
				Str("点火已经完成!");
				LCD_SetAdd(16);
				Str("按Enter 继续");
				while(GetKey() != '\n');
				return;	
			}
		}
		
		
		Ch1 = DatatoRes(1,GetAD(8));
		if(Ch1 != oCh1)
		{
			oCh1 = Ch1;
			LCD_DrawNum(5,0,Ch1);
		}
		
		Ch2 = DatatoRes(2,GetAD(9));
		if(Ch2 != oCh2)
		{
			oCh2 = Ch2;	
			LCD_DrawNum(5,1,Ch2);				
		}
		
		i = GetAD(0) * 49;
		if(i > (mRecord.iCur0 - 250) && i < mRecord.iCur0 + 250)
			bReady = 1;
		else
			bReady = 0;
			
		i = GetAD(1) * 49;
		if(i > (mRecord.iCur1 - 250) && i < mRecord.iCur1 + 250)
			bReady += 1;
		else
			bReady = 0;
			 
		if(bReady == 2)
		{
			LCD_SetAdd(16);
			Str("设备准备就绪");
			LCD_SetAdd(24);
			Str("请按7 键开始点火");
		}
		else
		{		
			Ch3 = GetAD(0);
			if(Ch3 != oCh3)
			{
				oCh3 = Ch3;	
				LCD_DrawNum(3,2,Ch3);				
			}
			
			Ch4 = GetAD(1);	
			if(Ch4 != oCh4)
			{
				oCh4 = Ch4;	
				LCD_DrawNum(3,3,Ch4);				
			}
		}
	}	
}

char TestRam(void)
{
	__asm
	{

	}
	return 0;
}

	
unsigned char TestProg(void)
{
	unsigned char crc;
	unsigned char *far p;
	p = (unsigned char *far) 0x0C500;
	crc = 0;
	do
	{
		crc += *p;
		p++;
	}while(p < (unsigned char *far)(0x0F000));
	
	return crc;
}

char TestSystem(void)
{
	T1 = 0;
	T2 = 0;
	
	if(GetAD(8)  < ( 10 + mSystem.R1_O ) && GetAD(9) <( 10 + mSystem.R2_O))
		return 0;
	else
		return 1;
}

//
void Start(void)
{
StartReDraw:

	LCD_Cls();
	
	LCD_SetAdd(0);
	  
	Str("     CH1    CH2 ");
	LCD_SetAdd(8);   
	Str("I :");	//点火电流
	LCD_DrawTimer(mRecord.iCur0);
	Str(" ");
	LCD_DrawTimer(mRecord.iCur1);	//点火电流
	LCD_SetAdd(16);		
	Str("ST:");
	LCD_DrawTimer(mRecord.sTime0);
	Str(" ");
	LCD_DrawTimer(mRecord.sTime1);	//开始时间
	LCD_SetAdd(24);	
	Str("FL:");
	LCD_DrawTimer(mRecord.lTime0);
	Str(" ");
	LCD_DrawTimer(mRecord.lTime1);	//点火时间
	while(1)
	{
		switch(GetKey())
		{
			case 'E':
				return;
			case '\n':
				PreFire();
				goto StartReDraw;
			default:
				break;
				
		};
	}
};

void SetCh1(void)
{
	unsigned char cursel;
	
	unsigned int siCur;
	unsigned int ssTime;
	unsigned int slTime;
	unsigned char key;
	siCur = mRecord.iCur0;
	ssTime = mRecord.sTime0;
	slTime = mRecord.lTime0;
	cursel = 1;
	
	LCD_Cls();
	
	LCD_SetAdd(0);
	Str("  通道一设置");
	
	LCD_SetAdd(8);
	Str("点火电流");
	LCD_DrawTimer(siCur);
	
	LCD_SetAdd(16);
	Str("延时时间");
	LCD_DrawTimer(ssTime);
	
	LCD_SetAdd(24);
	Str("点火时间");
	LCD_DrawTimer(slTime);
	
	LCD_Reverse(cursel);
	
	while(1)
	{
		key = GetKey();
		if(key)
		{
			switch(key)
			{
				case 'U':
					if( cursel > 1)
						cursel--;
					break;
				case 'D':
					if(cursel < 3)
						cursel++;
					break;
				case '<':
					switch(cursel)
					{
						case 1:
							if(siCur > 100)
								siCur -= 100;
							break;
						case 2:
							if(ssTime > 0)
								ssTime--;
							break;
						case 3:
							if(slTime > 0)
								slTime--;
						default:
							break;
					}
					break;
				case '>':
					switch(cursel)
					{
						case 1:
							if(siCur < 30000)
								siCur += 100;
							break;
						case 2:
							if(ssTime < 30000)
								ssTime++;
							break;
						case 3:
							if(slTime < 30000)
								slTime++;
						default:
							break;
					}
					break;
				case '\n':
					mRecord.iCur0 = siCur;
					mRecord.sTime0 = ssTime;
					mRecord.lTime0 = slTime;				
					return;
				case 'E':

					
					return;
				default:
					break;
			}
			
			LCD_Cls();
			
			LCD_SetAdd(0);
			Str("  通道一设置");
			
			LCD_SetAdd(8);
			Str("点火电流");
			LCD_DrawTimer(siCur);
			
			LCD_SetAdd(16);
			Str("延时时间");
			LCD_DrawTimer(ssTime);
			
			LCD_SetAdd(24);
			Str("点火时间");
			LCD_DrawTimer(slTime);
			
			LCD_Reverse(cursel);		
		}
	}

};

void SetCh2(void)
{
	unsigned char cursel;
	
	unsigned int siCur;
	unsigned int ssTime;
	unsigned int slTime;
	unsigned char key;
	siCur = mRecord.iCur1;
	ssTime = mRecord.sTime1;
	slTime = mRecord.lTime1;
	cursel = 1;
	
	LCD_Cls();
	
	LCD_SetAdd(0);
	Str("  通道二设置");
	
	LCD_SetAdd(8);
	Str("点火电流");
	LCD_DrawTimer(siCur);
	
	LCD_SetAdd(16);
	Str("延时时间");
	LCD_DrawTimer(ssTime);
	
	LCD_SetAdd(24);
	Str("点火时间");
	LCD_DrawTimer(slTime);
	
	LCD_Reverse(cursel);
	
	while(1)
	{
		key = GetKey();
		if(key)
		{
			switch(key)
			{
				case 'U':
					if( cursel > 1)
						cursel--;
					break;
				case 'D':
					if(cursel < 3)
						cursel++;
					break;
				case '<':
					switch(cursel)
					{
						case 1:
							if(siCur > 100)
								siCur-= 100;
							break;
						case 2:
							if(ssTime > 0)
								ssTime--;
							break;
						case 3:
							if(slTime > 0)
								slTime--;
						default:
							break;
					}
					break;
				case '>':
					switch(cursel)
					{
						case 1:
							if(siCur < 30000)
								siCur+= 100;
							break;
						case 2:
							if(ssTime < 60000)
								ssTime++;
							break;
						case 3:
							if(slTime < 60000)
								slTime++;
						default:
							break;
					}
					break;
				case '\n':
					mRecord.iCur1 = siCur;
					mRecord.sTime1 = ssTime;
					mRecord.lTime1 = slTime;
					return;
				case 'E':
					
					return;
				default:
					break;
			}
			
			LCD_Cls();
			
			LCD_SetAdd(0);
			Str("  通道二设置");
			
			LCD_SetAdd(8);
			Str("点火电流");
			LCD_DrawTimer(siCur);
			
			LCD_SetAdd(16);
			Str("延时时间");
			LCD_DrawTimer(ssTime);
			
			LCD_SetAdd(24);
			Str("点火时间");
			LCD_DrawTimer(slTime);
			
			LCD_Reverse(cursel);		
		}
	}

};

const char HideM[][12] = {{"I1_O "},
						  {"I1_S "},
						  {"I2_O "},
						  {"I2_S "},
						  {"R1_O "},
						  {"R1_S "},
						  {"R2_O "},
						  {"R2_S "},
						  {"C1_O "},
						  {"C1_S "},
						  {"C2_O "},
						  {"C2_S "},
						  {"PCRC "}};
						  
void HideMenu(void)
{
	char i;
	unsigned char sMenu,oldsMenu;
	unsigned char cursel,oldcur;
	
	oldcur = cursel = 0;
	oldsMenu = sMenu = 0;
	
	do
	{
		LCD_Cls();
		for(i = 0; i < 4; i++)
		{
			LCD_SetAdd(i * 8);
			Str(HideM[sMenu + i]);
			if(i + sMenu < 12)
				LCD_DrawNum(2,i,*(&(mSystem.I1_O) + i + sMenu));
			else
				LCD_DrawNum(2,i,TestProg()); 
		}
		LCD_Reverse(cursel - sMenu);
		do
		{
			key = GetKey();
		}while(!key);
		
		switch(key)
		{
			case 'U':
				if(cursel > 0)
					cursel--;
				if(cursel < sMenu)
					sMenu = cursel;
				break;
			case 'D':
				if(cursel < 12)
					cursel++;
				if(cursel - sMenu > 3)
					sMenu++;
				break;
			case '<':
				break;
			case '>':

⌨️ 快捷键说明

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