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

📄 main_30_11.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	//串口接收完所有数据的最大时间,100ms

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;		//故障延时计数器

//申明应用定义在KEY.C中的全局变量
extern  struct  COUNT   idata  CountDate; 
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,SAVEERROR_ADD);
	DataWrite25045EEROM(0,SAVEERROR_ADD+2);	
	GuZhangState = NOGUZHANG;
	//取出累计时间
	CountDate.fen=ByteRead25045EEROM(SAVETIME_ADD);
	CountDate.shi=ByteRead25045EEROM(SAVETIME_ADD+2);//先取出高八位
	CountDate.shi=(CountDate.shi<<8)+ByteRead25045EEROM(SAVETIME_ADD+1);
		
	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(SAVEERROR_ADD)|Incomedata.ErrorCodeShuZi;
						DataWrite25045EEROM(ErrorTemp,SAVEERROR_ADD);
						GuZhangState = GUZHANGDELAY;
//						GuZhangTime = 0;
						ErrorLight = SetLight;
						RunLight  = ResetLight;
					}		
					if(Incomedata.ErrorCodeMoNi!=0)
					{
						ErrorTemp=DataRead25045EEROM(SAVEERROR_ADD+2)|Incomedata.ErrorCodeMoNi;
						DataWrite25045EEROM(ErrorTemp,SAVEERROR_ADD+2);	
						GuZhangState = GUZHANGDELAY;
//						GuZhangTime = 0;
						ErrorLight = SetLight;
						RunLight  = ResetLight;
					}
					delay(15);
					SerialLight = ResetLight;
				}
				Serial_Init();
		}
		//故障延时已到且当前没有收到故障
		if(GuZhangState == GUZHANGDELAYOVER&&Incomedata.ErrorCodeShuZi==0&&Incomedata.ErrorCodeMoNi==0)
		{
				ErrorLight = ResetLight;
				RunLight   =  SetLight;
				GuZhangState = NOGUZHANG;
		}
		if(((ReceiveState == RECEIVING)||(ReceiveState == STARTRECEIVE2))&&(SerialTime >= SEARIALTIME))//数据丢失
				Serial_Init();

		if(IsSaveTime)
		{
				IsSaveTime = 0;
				ByteWrite25045EEROM(CountDate.fen,SAVETIME_ADD);
				ByteWrite25045EEROM((unsigned char)CountDate.shi,SAVETIME_ADD+1);
				ByteWrite25045EEROM((unsigned char)(CountDate.shi>>8),SAVETIME_ADD+2);
		}					
	}
	
}

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;
                }
        }
		if(SerialTime < SEARIALTIME) SerialTime++;	
		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;
		if(CountDate.fen<59)
		{	
			CountDate.fen ++;
		}
		else 
		{
			CountDate.fen = 0;
			CountDate.shi ++;
		}
		if(GuZhangState == GUZHANGDELAY)
		{
			if(GuZhangTime<GUZHANGDELAYTIME)
				GuZhangTime++;
			else
			{
				GuZhangState = GUZHANGDELAYOVER;
				GuZhangTime = 0;
			}	
		}
}


void Receive_INT(void) interrupt  4	
{
		unsigned  char  datatemp;
		RI = 0;
		TI = 0;
		datatemp = SBUF;
		if( ReceiveState == STARTRECEIVE1 && datatemp == ADDRESSL ) //收第一个起始地址
		{
				ReceiveState = STARTRECEIVE2;
				SerialTime = 0;
				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)
{
	ReceiveState = STARTRECEIVE1;
	RealReceiveLen = 0;
	CheckSum = 0;
}


void delay(unsigned int delaydata)
{
	while(delaydata--);
}

⌨️ 快捷键说明

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