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

📄 main.c

📁 单片机控制的12864液晶显示器的驱动程序,通过按键控制
💻 C
字号:
#include "MAIN.H"
#include "display.h"
#include "disdrive.h"
#include "KEY.H"
#include "X.H"

//定义串口缓冲区和结构体
#define  ADDRESSL    0xFF 	//地址校验码地位
#define  ADDRESSH    0xFF	//地址校验码高位

#define  BufferLen 	    30
#define  SEARIALTIME	0x64	//串口接收完所有数据的最大时间,5s

unsigned char data RealReceiveLen ;	//实际接收到个数
unsigned char data CheckSum  ;		//校验码
unsigned char data ReceivBuf[BufferLen];
unsigned char data SerialTime ;		//串口接收数据时间计数器,在接收中大于一个数可以认为此次接收丢失
unsigned char data ReceiveState ;   //接收状态标志位

//定义时间变量
unsigned  int   ResetLedBackTime;	//背光灯熄灭时间计数器 
unsigned  int   CountTimeTime;		//累计时间计数器
unsigned  char  IsSaveTime;			//是否保存累计时间数据

unsigned  char  data	GuZhangState;	//故障状态
unsigned  char  data 	GuZhangTime;	//故障延时计数器
unsigned  char  idata 	WriteGuZhangPtr;	//故障存储指针,指向当前可以存储的地址首位
unsigned  char  idata   GuZhangNum;		//当前已经存储了的故障数
unsigned  long  data	GuZhangShiJian; //故障发生时间 
//申明应用定义在KEY.C中的全局变量
extern unsigned long idata CountTime;
extern  struct  INCOME  idata  Incomedata;

extern  unsigned char data  IsKeyDown;
extern  unsigned int  data  AutoKeyTime;
extern  unsigned int  data  KeyDelayTime;
extern  unsigned char data  UpdataLEDTime;

void SYS_Init()
{
        EA = 0;
		ResetLedBackTime = 0;	//变量初始化
		CountTimeTime = 0;

        SysReg_Init();	//system register initial block
        Serial_Init();	//serial initial block;
        HardInitialLED(); //display initial block
        InitialKey();	//key initail block 
        SetWatchDog();	//set watch dog
        FeedDog();		//Error Light off

        TR1 = 1;        //timer1 start
		TR0 = 1;		//timer0 start
        EA =  1;
}


void SysReg_Init()
{
		//IE setting
        EX0 = 0;		//int0 disable
        ET0 = 1;        //timer0 interrupt enable
        EX1 = 0;		//int1 disable
        ET1 = 1;        //tiemr1 interrupt disable
        ES = 1;			//serial intrrupt enable
		ET2 = 0;    	//timer2 interrupt disable
		IP = 0x10;		//serial interrupt high

		//TMOD setting
		SCON	= 0x50;						//串口工作方式1,允许接收	
		//SM0=0; SM1=1;SM2=0;REN=1;TB8=0;RB8=0;TI=0;RI=0;
		PCON	= 0x00;						//波特率倍频
		T2CON	= 0x30;						// 定时器2作为串口1的波特率发生器
		RCAP2	= -(SYSCLK/BAUDRATE/32);
		TR2		= 1;						// TR2=1

		
		//TIMER0 SETTING
		TMOD = 0x11;	//定时器0和1都是方式1,16位计数器
		TF0 = 0;
        TH0 = TIMER0_H;
        TL0 = TIMER0_L ;		
		//TIMER1 SETTING
		TF1 = 0;
       	TH1 = TIMER1_H;	
	    TL1 = TIMER1_L;

		TI = 0;	//初始化发送中断和接收中断
		RI = 0;
}

void main(void)
{	
	unsigned int ErrorTemp;	//故障中间变量 
	SYS_Init();
	ErrorLight=ResetLight;
	SetLEDBackLight();
	LedFillNULL();
	ShowWait();
	FeedDog();
	//初始化故障存储器
	DataWrite25045EEROM(0,SAVEGUZHANG_ADD);
	DataWrite25045EEROM(0,SAVEGUZHANG_ADD+2);	
	GuZhangState = NOGUZHANG;
	//取出累计时间,高位存储在低地址
	PageRead25045EEROM(SAVETIME_ADD,(unsigned char *)(&CountTime));
		
	while(1)
	{	
		FeedDog();
		KeyPro();
		if(ReceiveState == ENDRECEIVE)	//接收完所有数据
		{	
				if(CheckSum == 0x00) 
				{
					SerialLight = SetLight;		//点亮串口灯
					ReadSerialBufData((unsigned int *)ReceivBuf,&(Incomedata.InputUA),14);//取出数据
					if(Incomedata.ErrorCodeShuZi!=0)
					{
						ErrorTemp=DataRead25045EEROM(SAVEGUZHANG_ADD)|Incomedata.ErrorCodeShuZi;
						DataWrite25045EEROM(ErrorTemp,SAVEGUZHANG_ADD);
						GuZhangState = GUZHANGDELAY;
//						GuZhangTime = 0;
						ErrorLight = SetLight;
						RunLight  = ResetLight;
					}		
					if(Incomedata.ErrorCodeMoNi!=0)
					{
						ErrorTemp=DataRead25045EEROM(SAVEGUZHANG_ADD+2)|Incomedata.ErrorCodeMoNi;
						DataWrite25045EEROM(ErrorTemp,SAVEGUZHANG_ADD+2);	
						GuZhangState = GUZHANGDELAY;
//						GuZhangTime = 0;
						ErrorLight = SetLight;
						RunLight  = ResetLight;
					}
					delay(15);
					SerialLight = ResetLight;
				}
				ReceiveState = STARTRECEIVE1;
				RealReceiveLen = 0;
				CheckSum = 0;;
		}
		//故障延时已到且当前没有收到故障
		if(GuZhangState == GUZHANGDELAYOVER&&Incomedata.ErrorCodeShuZi==0&&Incomedata.ErrorCodeMoNi==0)
		{
				ErrorLight = ResetLight;
				RunLight   =  SetLight;
				GuZhangState = NOGUZHANG;
		}
		if(SerialTime >= SEARIALTIME) 	//串口通讯等待时间过长
				Serial_Init();
		if(IsSaveTime)
		{
				IsSaveTime = 0;
				PageWrite25045EEROM(SAVETIME_ADD,(unsigned char *)(&CountTime));
		}					
	}
	
}

void  TO_INT(void) interrupt 1
{
		TF0 = 0;
		if (IsKeyDown == NO_KEY_DOWN)
		{		
				if(AutoKeyTime < KEY_AUTOUPDATE_TIME) 	AutoKeyTime++;
				if(ResetLedBackTime < RESET_LEDBACK_TIME) ResetLedBackTime++;
				else	ResetLEDBackLight(); //Reset LEDBackLight
		}		
        if ( IsKeyDown == KEY_DOWN_TRIGGER)	//按键处于延时状态
        {
                if (KeyDelayTime < KEY_DELAY ) KeyDelayTime++; //key down and delay time counting
				else
				{
                		IsKeyDown = KEY_DOWN_DELAY_OVER;//set key delay time is over;trigger IsKeyDown
               			SetLEDBackLight();		//LEDBack Light On
						ResetLedBackTime = 0;
						AutoKeyTime = 0;
						UpdataLEDTime = 0;
				 }

		}
        if ( IsKeyDown ==  KEY_PRO_COMPLETE_DELAY)      //key pro completed delay
        {
                if ( KeyDelayTime < KEY_COMPLETE_DELAY ) KeyDelayTime++;
                else
                {
						KeyDelayTime = 0;
                        IsKeyDown = NO_KEY_DOWN;
                }
        }
		TH0		= TIMER0_H;					//定时1ms
		TL0		= TIMER0_L;
}
       

void T1_INT(void) interrupt  3
{		
		TF1 = 0;
		TH1		= TIMER1_H;				//定时50ms
		TL1		= TIMER1_L;	
		if(CountTimeTime<TIMER1S)  
		{
			CountTimeTime ++;	
			return;
		}
		CountTimeTime = 0;
		IsSaveTime = 1;
		ountTime++;

		if(GuZhangState == GUZHANGDELAY)
		{
			if(GuZhangTime<GUZHANGDELAYTIME)
				GuZhangTime++;
			else
			{
				GuZhangState = GUZHANGDELAYOVER;
				GuZhangTime = 0;
			}	
		}
		if(SerialTime <= SEARIALTIME)  SerialTime++;		//串口延时计数器	
}


void Receive_INT(void) interrupt  4	
{
		unsigned  char  datatemp;
		RI = 0;
		TI = 0;
		datatemp = SBUF;
		SerialTime = 0;
		if( ReceiveState == STARTRECEIVE1 && datatemp == ADDRESSL ) //收第一个起始地址
		{
				ReceiveState = STARTRECEIVE2;
				CheckSum = 	CheckSum + datatemp;
		}
		else  if(ReceiveState == STARTRECEIVE2 && datatemp==ADDRESSH)	//收第二个起始地址
  	    {
				ReceiveState = RECEIVING ;	
				CheckSum = 	CheckSum + datatemp;
		}
		
	    else  if(ReceiveState == RECEIVING)		//处于数据接收中 
		{
				ReceivBuf[RealReceiveLen]=datatemp;
				RealReceiveLen++;
				CheckSum = 	CheckSum + datatemp;		
		}
		if( RealReceiveLen >= BufferLen )			//数据接收完成
		{
				ReceiveState = ENDRECEIVE;
		}
				
}

void ReadSerialBufData(unsigned int *Bufferptr,unsigned int *Structptr,unsigned char num)
{
		unsigned char i;
		for(i=0;i<num;i++)
			{
				*( Structptr+i) = *(Bufferptr+i);
	 	    }
}

void Serial_Init(void)
{
	unsigned char i;
	ReceiveState = STARTRECEIVE1;
	RealReceiveLen = 0;
	CheckSum = 0;
	for(i=0;i<14;i++)
	{
		*(&Incomedata.InputUA+i)=0;
	}
}

//返回一个故障代码,从低位到高位的数字分别代表了从重要故障到不重要故障,1为发生故障
unsigned char  GetGuZhangCode(void) 
{
	unsigned long GuZhangCode;	//实际需要18位
	unsigned char temp;
	PageRead25045EEROM(SAVETIME_ADD,(unsigned char *)(&GuZhangShiJian));//取出故障时间
	WriteGuZhangPtr = ByteRead25045EEROM(SAVEWRITEGUZHANG_ADD);	//取出缓冲区当前可以存储的地址指针
	GuZhangNum = ByteRead25045EEROM(SAVEGUZHANGNUM_ADD);
	//分析故障
	if((Incomedata.ErrorCodeShuZi&0x08)!=0)	 //IGBT A相短路
	{
		GuZhangCode = (GuZhangCode&0x3FFFE)|0x01;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD);
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeShuZi&0x10)!=0) //IGBT B相短路
	{
		GuZhangCode = (GuZhangCode&0x3FFFD)|0x02;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+1);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+1);	
		SAVEWRITEERROR_ADD  += 8;
	} 
	if((Incomedata.ErrorCodeShuZi&0x20)!=0) //IGBT C相短路
	{
		GuZhangCode = (GuZhangCode&0x3FFFB)|0x04;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+2);
		if(temp < 255)
			ByteWrite25045EEROM((temp++,SAVEGUZHANGCOUNT_ADD+2);
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeShuZi&0x40)!=0||(Incomedata.ErrorCodeMoNi&0x900)!=0)	//输出电压A相过压
	{
		GuZhangCode = (GuZhangCode&0x3FFF7)|0x08;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+3);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+3);	
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeShuZi&0x80)!=0||(Incomedata.ErrorCodeMoNi&0x24!=0))	//输出电压A相欠压
	{
		GuZhangCode = (GuZhangCode&0x3FFE0)|0x10;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+4);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+4);
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeShuZi&0x100)!=0||(Incomedata.ErrorCodeMoNi&0x1200)!=0)//输出电压B相过压	
	{
		GuZhangCode = (GuZhangCode&0x3FFD0)|0x20;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+5);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+5);
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeShuZi&0x200)!=0||(Incomedata.ErrorCodeMoNi&0x48)!=0)//输出电压B相欠压
	{
		GuZhangCode = (GuZhangCode&0x3FFB0)|0x40;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+6);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+6);			
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeShuZi&0x400)!=0||(Incomedata.ErrorCodeMoNi&0x2400)!=0)//输出电压C相欠压
	{
		GuZhangCode = (GuZhangCode&0x3FF70)|0x80;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+7);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+7);	
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeShuZi&0x800)!=0||(Incomedata.ErrorCodeMoNi&0x90)!=0)//输出电压C相欠压
	{
		GuZhangCode = (GuZhangCode&0x3FEFF)|0x100;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+8);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+8);
		SAVEWRITEERROR_ADD  += 8;
	}
	
	if((Incomedata.ErrorCodeMoNi&0x01)!=0)	//输入电压过压
	{
		GuZhangCode = (GuZhangCode&0x3FDFF)|0x200;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+9);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+9);
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeMoNi&0x02)!=0)//输入电压欠压
	{
		GuZhangCode = (GuZhangCode&0x3FBFF)|0x400;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+10);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+10);
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeMoNi&0x4000)!=0)	//输入电流过流
	{
		GuZhangCode = (GuZhangCode&0x3F7FF)|0x800;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+11);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+11);
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeShuZi&0x1000)!=0)	//直流电压过压
	{
		GuZhangCode = (GuZhangCode&0x3EFFF)|0x1000;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+12);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+12);
		SAVEWRITEERROR_ADD  += 8;
	}	
	if((Incomedata.ErrorCodeShuZi&0x2000)!=0)	//直流电压欠压
	{
		GuZhangCode = (GuZhangCode&0x3DFFF)|0x2000;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+13);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+13);
		SAVEWRITEERROR_ADD  += 8;
	}
	if((Incomedata.ErrorCodeShuZi&0x4000)!=0)	//直流电流过流
	{
		GuZhangCode = (GuZhangCode&0x3BFFF)|0x4000;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+14);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+14);
		SAVEWRITEERROR_ADD  += 8;
	}		
	if((Incomedata.ErrorCodeShuZi&0x01)==0)		//晶闸管过温
	{
		GuZhangCode = (GuZhangCode&0x37FFF)|0x8000;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+15);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+15);
	}
	if((Incomedata.ErrorCodeShuZi&0x02)==0)	//IGBT过温
	{
		GuZhangCode = (GuZhangCode&0x2FFFF)|0x10000;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+16);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+16);
	}
	if((Incomedata.ErrorCodeShuZi&0x40)==0)	//变压器过温
	{
		GuZhangCode = (GuZhangCode&0x1FFFF)|0x20000;
		temp=ByteRead25045EEROM(SAVEGUZHANGCOUNT_ADD+17);
		if(temp < 255)
			ByteWrite25045EEROM(temp++,SAVEGUZHANGCOUNT_ADD+17);
	}
	PageWrite25045EEROM(WriteGuZhangPtr,(unsigned char *)(&GuZhangShiJian));
	PageWrite25045EEROM(WriteGuZhangPtr+4,(unsigned char *)(&GuZhangCode));
	WriteGuZhangPtr += 8;
	if(GuZhangNum < 10)
		GuZhangNum++;
	if(WriteGuZhangPtr >= (SAVEGUZHANG_ADD+8*GUZHAHNGLEN));
		WriteGuZhangPtr = SAVEGUZHANG_ADD;
	ByteWrite25045EEROM(SAVEWRITEGUZHANG_ADD,WriteGuZhangPtr);
	ByteWrite25045EEROM(SAVEGUZHANGNUM_ADD,GuZhangNum);
}
void delay(unsigned int delaydata)
{
	while(delaydata--);
}

⌨️ 快捷键说明

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