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

📄 back.c

📁 AVR单片机ATMEGA32驱动240*128LCD程序
💻 C
📖 第 1 页 / 共 2 页
字号:
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/wdt.h>
#include <avr/pgmspace.h>
//#include <avr/eeprom.h>
#include "HZ.h"
#include "T6963.h"
#include "head.h"
//宏定义区///////////////////////////////////////////////////////////////
#define V_MAX	7200
#define A_MAX	3000
#define TE_MAX	999
#define TI_MAX	1999
#define DMAX	9999
#define VSADDR	0x0000
#define CSADDR	0x0002
#define TESADDR	0x0004
#define TISADDR	0x0006
/////////////////////////////////////////////////////////////////////////
//全局变量区/////////////////////////////////////////////////////////////

unsigned char	WorkStatus	= 0x00;//////////
unsigned char	TimeOut		= 0x0A;//////////

unsigned int	Work_commend= 0x0000;//////////
unsigned int	Voltage		= 0x0000;//72.00V
unsigned int	Current		= 0x0000;//300.0A
unsigned int	Temp		= 0x0000;//099.9C
unsigned int	Time		= 0x0000;//999M

unsigned int	CVoltage	= 0x0000;//72.00V
unsigned int	CCurrent	= 0x0000;//300.0A
unsigned int	StopTemp	= 0x0000;//099.9C
unsigned int	StopTime	= 0x0000;//999M
unsigned int	StopCurrent	= 0x0000;//300.0A

unsigned int	TempSCurrent= 0x0000;//300.0A
unsigned int	TempCVoltage= 0x0000;//72.00V
unsigned int	TempCCurrent= 0x0000;//300.0A
unsigned int	TempTemp	= 0x0000;//099.9C
unsigned int	TempTime	= 0x0000;//999M

unsigned int	LowStatus	= 0x0000;

//unsigned int EESetVoltage	__attribute__((section(".eeprom")));

/////////////////////////////////////////////////////////////////////////
//自编函数区/////////////////////////////////////////////////////////////
unsigned char EEPROM_read(unsigned int uiAddress);
void EEPROM_write(unsigned int uiAddress, unsigned char ucData);
void vDataInit(void);
void vSetPara(void);
void vGetInt(unsigned char key);
void vWork(void);
void vStop(void);
void vWait2Ensure(void);
void vSetup(void);
void vCheck(void);
void vDisplay(void);
void vMenu(unsigned char key);
void vWait(unsigned int us);
void vWrite(unsigned char data);
unsigned char ucRead(void);
char LCD_StatusCheck(unsigned char mask);
char LCD_WriteCommand(unsigned char cmd);
char LCD_WriteData(unsigned char dat);
char LCD_AutoWriteData(unsigned char dat);
unsigned char LCD_ReadStatus(void);
unsigned char LCD_ReadData(void);
unsigned char LCD_AutoReadData(void);

char LCD_INIT(void);
char LCD_FILL(unsigned char page,unsigned char dat);
char LCD_LOAD_PAGE(unsigned char page,const unsigned char *p);
char LCD_PutChar(unsigned char page,unsigned int position,const unsigned char *hz);
char LCD_PutEng(unsigned char page,unsigned int position,const unsigned char *hz);
char LCD_PutAnyThing(unsigned char page,unsigned int position,unsigned char dat);
char LCD_Case(unsigned char page);
void vLCD_Page_Change(unsigned char page);

void LCD_page0(void);
void LCD_page1(void);
void LCD_page2(void);

unsigned char cKeyScan(void);
unsigned char cKey(unsigned char keyval);//按键

/////////////////////////////////////////////////////////////////////////
//系统函数区/////////////////////////////////////////////////////////////
void vPortInit(void);
void vInit(void);
void vTimer0Init(void);
void vOCR1Init(void);
void vSpiInit(void);
void vTWInit(void);
/////////////////////////////////////////////////////////////////////////

/////////////////////////////////////////////////////////////////////////
int main(void)
{
	unsigned int ms = 0;
	unsigned int msa = 0;
	unsigned int msb = 0;
	unsigned int msc = 0;
	volatile unsigned char null = 0;
	unsigned char ka = 0,kb = 0;
	unsigned char k = 0;
	const unsigned char *p = name;
	
	vInit(); //初始化片内设备
	null = LCD_INIT();//LCD初始化
	vLCD_Page_Change(0);
	vDataInit();
	while(1)
	{
		__asm__("	WDR");
		if(TIFR&(1<<OCF0))//1KHz---1000us
		{
			TIFR |=1<<OCF0;
			ms +=1;
			if(TimeOut>0)TimeOut--;			
			if(ms >3999)ms=0;
		}
		if(((ms%30)==5)&&(msa!=ms))
		{
			msa = ms;
			//TODO: the code below will be execute every 30ms
			ka = cKey(cKeyScan());
			if(kb != ka)
			{
				kb = ka;
				if(kb < 0x10)vMenu(kb);
			}
			vSetPara();
			if((LowStatus&0x00ff)==0x0007)
			{
				WorkStatus = 0x10;
				Work_commend=0xff00;
				vStop();
			}
		}
		if(((ms%100)==10)&&(msb!=ms))
		{
			msb = ms;
			//TODO: the code below will be execute every 100ms
			//下面代码显示菜单代码,正式版应屏蔽
			p = nen;
			k = WorkStatus/0x10;
			null = LCD_PutEng(1,0x0117,p+k*16);
			k = WorkStatus%0x10;
			null = LCD_PutEng(1,0x0118,p+k*16);
		}
		if(((ms%100)==15)&&(msb!=ms))
		{
			msc = ms;
			//TODO: the code below will be execute every 100ms
			vDisplay();
		}
	}
	return(-1);
}
/////////////////////////////////////////////////////////////////////////
//中断服务函数区/////////////////////////////////////////////////////////
ISR(SPI_STC_vect)
{
	volatile static unsigned char bn = 0xff;
	static unsigned char kk = 0x00;
	static unsigned char k  = 0x00;
	unsigned char val = 0x00;
	
	val = SPDR;
	if(TimeOut == 0)bn = 0;
	switch(bn)
	{
		case 0:
		{
			k = val;
			switch(k)
			{
				case 0:
				{
					SPDR	=	Work_commend%0x100;//发送命令的低字节
				}break;
				case 1:
				{
					SPDR	=	StopCurrent%0x100;
				}break;
				case 2:
				{
					SPDR = CVoltage%0x100;
				}break;
				case 3:
				{
					SPDR = CCurrent%0x100;
				}break;
				case 4:
				{
					SPDR = StopTemp%0x100;
				}break;
				case 5:
				{
					SPDR = StopTime%0x100;
				}break;
				case 6:
				{
					//SPDR = mWork_state%0x100;
				}break;
				case 7:
				{
				}break;
				case 8:
				{
				}break;
				default: break;
			}
		}break;
		case 1:
		{
			switch(k)
			{
				case 0:
				{
					SPDR	=	Work_commend/0x100;
					kk = val;
				}break;
				case 1:
				{
					SPDR	=	StopCurrent%0x100;
					kk = val;
				}break;
				case 2:
				{
					SPDR = CVoltage/0x100;	
					kk = val;
				}break;
				case 3:
				{
					SPDR = CCurrent/0x100;	
					kk = val;
				}break;
				case 4:
				{
					SPDR = StopTemp/0x100;	
					kk = val;
				}break;
				case 5:
				{
					SPDR = StopTime/0x100;	
					kk = val;
				}break;
				case 6:
				{
					//SPDR = mWork_state/0x100;	
					kk = val;
				}break;
				case 7:
				{
				}break;
				case 8:
				{
					kk = val;
				}break;
				default: break;
			}
		}break;
		case 2:
		{
			switch(k)
			{
				case 0:
				{
					LowStatus = val*0x100+kk;
				}break;
				case 1:
				{
					//FarVoltage =  val*0x100+kk;
				}break;
				case 2:
				{
					Voltage =  val*0x100+kk;
				}break;
				case 3:
				{
					Current =  val*0x100+kk;
				}break;
				case 4:
				{
					Temp =  val*0x100+kk;
				}break;
				case 5:
				{
					Time =  val*0x100+kk;
				}break;
				case 6:
				{
					//Work_state = val*0x100+kk;
				}break;
				case 7:
				{
				}break;
				case 8:
				{
					//eer_data = val*0x100+kk;
				}break;
				default: break;
			}
		}break;
		default:break;
	}
	if((++bn)>2)
	{
		bn = 0;
		k = 0;
		TimeOut = 0;
	}
	else TimeOut = 10;
}
/////////////////////////////////////////////////////////////////////////
//自编函数区/////////////////////////////////////////////////////////////
void EEPROM_write(unsigned int uiAddress, unsigned char ucData)
{
	while(EECR & (1<<EEWE));/* 等待上一次写操作结束 */
	EEARH = uiAddress/0x100;
	EEARL = uiAddress%0x100;		/* 设置地址和数据寄存器*/
	EEDR = ucData;
	EECR |= (1<<EEMWE);/* 置位EEMWE */
	EECR |= (1<<EEWE);/* 置位EEWE 以启动写操作*/
}
unsigned char EEPROM_read(unsigned int uiAddress)
{
	while(EECR & (1<<EEWE));/* 等待上一次写操作结束 */
	EEARH = uiAddress/0x100;
	EEARL = uiAddress%0x100;/* 设置地址寄存器*/
	EECR |= (1<<EERE);/* 设置EERE 以启动读操作*/
	return EEDR;/* 自数据寄存器返回数据 */
}
void vDataInit(void)
{
	CVoltage	= EEPROM_read(0);
	CVoltage	+= EEPROM_read(1)*256;
	if(CVoltage>V_MAX)CVoltage = 0;
	CCurrent	= EEPROM_read(2);
	CCurrent	+= EEPROM_read(3)*256;
	if(CCurrent>A_MAX)CCurrent = 0;
	StopTemp		= EEPROM_read(4);
	StopTemp		+= EEPROM_read(5)*256;
	if(StopTemp>TE_MAX)StopTemp = 0;
	StopTime		= EEPROM_read(6);
	StopTime		+= EEPROM_read(7)*256;
	if(StopTime>TI_MAX)StopTime = 0;
}
void vSetPara(void)
{
	unsigned char null = 0;
	const unsigned char *p = ctrl;
	
	switch(WorkStatus)
	{
		case 0x21:
		{
			null = LCD_PutChar(1,0x010f,p+24*32);//电
			null = LCD_PutChar(1,0x0111,p+25*32);//压
		}break;
		case 0x22:
		{
			null = LCD_PutChar(1,0x010f,p+26*32);//电
			null = LCD_PutChar(1,0x0111,p+27*32);//流
		}break;
		case 0x23:
		{
			null = LCD_PutChar(1,0x010f,p+30*32);//温
			null = LCD_PutChar(1,0x0111,p+31*32);//度
		}break;
		case 0x24:
		{
			null = LCD_PutChar(1,0x010f,p+14*32);//时
			null = LCD_PutChar(1,0x0111,p+15*32);//间
		}break;
		default:
		{
			p = zero;
			null = LCD_PutChar(1,0x010f,p);//
			null = LCD_PutChar(1,0x0111,p);//
			null = LCD_PutChar(1,0x0113,p);//
			null = LCD_PutChar(1,0x0115,p);//
			return;
		}break;
	}
	null = LCD_PutChar(1,0x0113,p+16*32);//设
	null = LCD_PutChar(1,0x0115,p+17*32);//置
}
void vGetInt(unsigned char key)
{
	unsigned int k=0;
	unsigned int *p= &k;
	
	if(key >0x09)return;
	switch(WorkStatus)
	{
		case 0x21:
		{
			p = &TempCVoltage;
		}break;
		case 0x22:
		{
			p = &TempCCurrent;
		}break;
		case 0x23:
		{
			p = &TempTemp;
		}break;
		case 0x24:
		{
			p = &TempTime;
		}break;
		default:break;
	}
	if(WorkStatus==0x23)k = *p%100;
	else k = *p%1000;
	k *= 10;
	k += key;
	*p = k;
	vDisplay();
}
void vWork(void)
{
    unsigned char null = 0;
	const unsigned char *p = ctrl;

	p = ctrl;
	null = LCD_PutChar(1,0x0106,p+6*32);//工
	null = LCD_PutChar(1,0x0108,p+7*32);//作
	null = LCD_PutChar(1,0x0119,p+10*32);//停
	null = LCD_PutChar(1,0x011b,p+11*32);//止
	null = LCD_PutChar(1,0x0519,p+48*32);//查
	null = LCD_PutChar(1,0x051b,p+49*32);//询
	p = zero;
	null = LCD_PutChar(1,0x010a,p);//
	null = LCD_PutChar(1,0x010c,p);//
}
void vStop(void)
{
    unsigned char null = 0;
	const unsigned char *p = ctrl;

	p = ctrl;
	null = LCD_PutChar(1,0x0106,p+10*32);//停
	null = LCD_PutChar(1,0x0108,p+11*32);//止
	null = LCD_PutChar(1,0x0119,p+46*32);//启
	null = LCD_PutChar(1,0x011b,p+47*32);//动
	null = LCD_PutChar(1,0x0519,p+16*32);//设
	null = LCD_PutChar(1,0x051b,p+17*32);//置
	p = zero;
	null = LCD_PutChar(1,0x010a,p);//
	null = LCD_PutChar(1,0x010c,p);//
}
void vWait2Ensure(void)
{
    unsigned char null = 0;
	const unsigned char *p = ctrl;

	p = ctrl;
	null = LCD_PutChar(1,0x0106,p+42*32);//等
	null = LCD_PutChar(1,0x0108,p+43*32);//待
	null = LCD_PutChar(1,0x010a,p+44*32);//确
	null = LCD_PutChar(1,0x010c,p+45*32);//认
	p = zero;
	null = LCD_PutChar(1,0x0119,p);//
	null = LCD_PutChar(1,0x011b,p);//
	null = LCD_PutChar(1,0x0519,p);//
	null = LCD_PutChar(1,0x051b,p);//
}
void vSetup(void)
{
    unsigned char null = 0;
	const unsigned char *p = ctrl;

	p = ctrl;
	null = LCD_PutChar(1,0x0106,p+8*32);//参
	null = LCD_PutChar(1,0x0108,p+9*32);//数
	null = LCD_PutChar(1,0x010a,p+16*32);//设
	null = LCD_PutChar(1,0x010c,p+17*32);//置
	null = LCD_PutChar(1,0x011b,p+2*32);//up
	null = LCD_PutChar(1,0x051b,p+3*32);//down
	p = zero;
	null = LCD_PutChar(1,0x0119,p);//
	null = LCD_PutChar(1,0x0519,p);//
}
void vCheck(void)
{
    unsigned char null = 0;
	const unsigned char *p = ctrl;

	p = ctrl;
	null = LCD_PutChar(1,0x0106,p+8*32);//参
	null = LCD_PutChar(1,0x0108,p+9*32);//数
	null = LCD_PutChar(1,0x010a,p+20*32);//显
	null = LCD_PutChar(1,0x010c,p+21*32);//示
	null = LCD_PutChar(1,0x0119,p+50*32);//
	null = LCD_PutChar(1,0x011b,p+51*32);//
	p = zero;
	null = LCD_PutChar(1,0x0519,p);//
	null = LCD_PutChar(1,0x051b,p);//
}

void vDisplay(void)
{
	const unsigned char *p = nen;
	unsigned int dispa = 0;
	unsigned int dispb = 0;
	unsigned int dispc = 0;
	unsigned int dispd = 0;
	unsigned char k = 0;
	unsigned char null = 0;
	
	switch(WorkStatus)
	{
		case 0x00://上电显示LOGO
		{
			return;
		}break;
		case 0x14:
		case 0x20://查看设置值
		{
			dispa = CVoltage;
			dispb = CCurrent;
			dispc = StopTemp;
			dispd = StopTime;
		}break;
		//修改设置值
		case 0x21:
		case 0x22:
		case 0x23:
		case 0x24:
		{
			dispa = TempCVoltage;
			dispb = TempCCurrent;
			dispc = TempTemp;
			dispd = TempTime;
		}break;
		default://默认显示
		{
			dispa = Voltage;
			dispb = Current;
			dispc = Temp;
			dispd = Time;
		}break;
	}	
	p = nen;
	//电压
	k = (dispa/1000)%10;
	null = LCD_PutEng(1,0x0306,p+k*16);
	k = (dispa/100)%10;
	null = LCD_PutEng(1,0x0307,p+k*16);
	k = (dispa/10)%10;
	null = LCD_PutEng(1,0x0309,p+k*16);
	k = (dispa/1)%10;
	null = LCD_PutEng(1,0x030a,p+k*16);
	//电流
	k = (dispb/1000)%10;
	null = LCD_PutEng(1,0x0506,p+k*16);
	k = (dispb/100)%10;
	null = LCD_PutEng(1,0x0507,p+k*16);
	k = (dispb/10)%10;
	null = LCD_PutEng(1,0x0508,p+k*16);
	k = (dispb/1)%10;
	null = LCD_PutEng(1,0x050a,p+k*16);
	//温度
	k = (dispc/1000)%10;
	//null = LCD_PutEng(1,0x0311,p+k*16);
	k = (dispc/100)%10;
	null = LCD_PutEng(1,0x0312,p+k*16);
	k = (dispc/10)%10;
	null = LCD_PutEng(1,0x0313,p+k*16);
	k = (dispc/1)%10;
	null = LCD_PutEng(1,0x0315,p+k*16);
	//时间
	k = (dispd/1000)%10;
	null = LCD_PutEng(1,0x0512,p+k*16);
	k = (dispd/100)%10;
	null = LCD_PutEng(1,0x0513,p+k*16);
	k = (dispd/10)%10;
	null = LCD_PutEng(1,0x0514,p+k*16);
	k = (dispd/1)%10;
	null = LCD_PutEng(1,0x0515,p+k*16);
	//..................................
	null = LCD_PutEng(1,0x0308,p+53*16);
	null = LCD_PutEng(1,0x0509,p+53*16);
	null = LCD_PutEng(1,0x0314,p+53*16);
	//null = LCD_PutEng(1,0x0514,p+53*16);
	//VVVVVVVVAAAAAAAAAAAAAAAAAAAAAAAAAA
	p = web;
	null = LCD_PutEng(1,0x030b,p+22*16);
	null = LCD_PutEng(1,0x050b,p+23*16);
}
void vMenu(unsigned char key)
{
	if(key>0x10)return;
	switch(WorkStatus)
	{
		case 0x00://上电,显示LOGO,按任意键继续
		{
			if(key<0x10)
			{
				WorkStatus = 0x10;//待机状态
				vLCD_Page_Change(1);//不同页面
				vDisplay();
				vStop();
			}
		}break;
		case 0x10://待机状态
		{
			if(key==ROUND)//启动,需要等待确认(需要确定工作参数合理)
			{
				if((LowStatus&0x00ff)==0x0001)
				{
					WorkStatus = 0x11;
					vWait2Ensure();
				}
			}
			if(key==TRIANGEL)//设定参数
			{
				WorkStatus = 0x20;
				TempCVoltage = CVoltage;
				TempCCurrent = CCurrent;
				TempTemp = StopTemp;
				TempTime = StopTime;
				vDisplay();
				vWait2Ensure();

⌨️ 快捷键说明

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