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

📄 back.c

📁 AVR单片机ATMEGA32驱动240*128LCD程序
💻 C
📖 第 1 页 / 共 2 页
字号:
			}
		}break;
		case 0x11://等待确认启动
		{
			if(key==ENTER)//已确定启动
			{
				WorkStatus = 0x12;//工作!
				Work_commend=0x00ff;
				vWork();
			}
			else
			{
				WorkStatus = 0x10;//待机
				vStop();
			}
		}break;
		case 0x12://工作
		{
			if(key==ROUND)//停止,需要等待确认
			{
				WorkStatus = 0x13;//确认后停止
				vWait2Ensure();
			}
			if(key==TRIANGEL)
			{
				WorkStatus = 0x14;//查询工作参数
				vCheck();
			}
		}break;
		case 0x13://等待确认停止
		{
			if(key==ENTER)//已确定停止
			{
				WorkStatus = 0x10;
				Work_commend=0xff00;
				vStop();
			}
			else
			{
				WorkStatus = 0x12;
				vWork();
			}
		}break;
		case 0x14://显示工作参数态,按任意键返回工作界面
		{
			WorkStatus = 0x12;
			vDisplay();
			vWork();
		}break;
		case 0x20:
		{
			if(key==ENTER)//进入编辑模式
			{
				WorkStatus = 0x21;//编辑电压
				vSetup();
			}
			else//取消,进入主界面
			{
				WorkStatus = 0x10;
				vStop();
			}
		}break;
		case 0x21://电压设置
		{
			if(key==ROUND)//时间设置
			{
				WorkStatus = 0x24;
			}
			if(key==TRIANGEL)//电压设置
			{
				WorkStatus = 0x22;
			}
			if(key==CANCEL)//取消,进入主界面
			{
				WorkStatus = 0x10;
				vStop();
			}
			if(key==ENTER)//编辑有效,检查是否可用参数
			{
				WorkStatus	= 	0x22;//编辑电压
				if(TempCVoltage>V_MAX)TempCVoltage = 0;
				CVoltage	= 	TempCVoltage;
				EEPROM_write(0,CVoltage%256);
				EEPROM_write(1,CVoltage/256);
			}
			vGetInt(key);
		}break;
		case 0x22://电流设置
		{
			if(key==ROUND)//电压设置
			{
				WorkStatus = 0x21;
			}
			if(key==TRIANGEL)//温度设置
			{
				WorkStatus = 0x23;
			}
			if(key==CANCEL)//取消,进入主界面
			{
				WorkStatus = 0x10;
				vStop();
			}
			if(key==ENTER)//编辑有效,检查是否可用参数
			{
				WorkStatus	=	0x23;//编辑电压
				if(TempCCurrent>A_MAX)TempCCurrent = 0;
				CCurrent	=	TempCCurrent;
				EEPROM_write(2,CCurrent%256);
				EEPROM_write(3,CCurrent/256);
			}
			vGetInt(key);
		}break;
		case 0x23://温度设置
		{
			if(key==ROUND)//电流设置
			{
				WorkStatus = 0x22;
			}
			if(key==TRIANGEL)//时间设置
			{
				WorkStatus = 0x24;
			}
			if(key==CANCEL)//取消,进入主界面
			{
				WorkStatus = 0x10;
				vStop();
			}
			if(key==ENTER)//编辑有效,检查是否可用参数
			{
				WorkStatus	=	0x24;//编辑电压
				if(TempTemp>TE_MAX)TempTemp = 0;
				StopTemp		=	TempTemp;
				EEPROM_write(4,StopTemp%256);
				EEPROM_write(5,StopTemp/256);
			}
			vGetInt(key);
		}break;
		case 0x24://时间设置
		{
			if(key==ROUND)//温度设置
			{
				WorkStatus = 0x23;
			}
			if(key==TRIANGEL)//电压设置
			{
				WorkStatus = 0x21;
			}
			if(key==CANCEL)//取消,进入主界面
			{
				WorkStatus = 0x10;
				vStop();
			}
			if(key==ENTER)//编辑有效,检查是否可用参数
			{
				if(TempTime>TI_MAX)TempTime = 0;
				StopTime		=	TempTime;
				WorkStatus = 0x10;//回主界面
				EEPROM_write(6,StopTime%256);
				EEPROM_write(7,StopTime/256);
				vStop();
			}
			vGetInt(key);
		}break;
		default:break;
	}
}
void vWait(unsigned int us)
{
	unsigned int i = 0;
	{
		for(i=0;i<us;i++)
		{
			__asm__("	WDR");
			__asm__("	WDR");
			__asm__("	WDR");
			__asm__("	WDR");
			__asm__("	WDR");
			__asm__("	WDR");
			__asm__("	WDR");
		}
	}
}

void vWrite(unsigned char data)
{
	PORTA = data;
	DDRA = 0x0ff;
	vWait(2);
	LCD_WR = 0;
	vWait(2);
	LCD_WR = 1;
}
unsigned char ucRead(void)
{
	unsigned char rt = 0;
	
	LCD_RD = 0;
	vWait(2);
	rt = PINA;
	LCD_RD = 1;
	vWait(2);
	return(rt);
}
char LCD_StatusCheck(unsigned char mask)	/*check if mask equer to status*/
{
	unsigned int i = 0;
	
	while(((LCD_ReadStatus()&mask)!=mask)&&(i++<1500))
	{
		if(i==500)__asm__("	WDR");
		if(i>1000)
		{
			LCD_RST = 0;
			vWait(1);
			LCD_RST = 1;
			return(0);
		}
	}
	return(-1);
}
char LCD_WriteCommand(unsigned char cmd)
{
	if(LCD_StatusCheck(LCD_CC)==0)return(0);
	LCD_CMD;
	vWrite(cmd);
	return(-1);
}
char LCD_WriteData(unsigned char dat)
{
	if(LCD_StatusCheck(LCD_CC)==0)return(0);
	LCD_DATA;
	vWrite(dat);
	return(-1);
}
char LCD_AutoWriteData(unsigned char dat)
{
	if(LCD_StatusCheck(LCD_DATA_CW_EN)==0)return(0);
	LCD_DATA;
	vWrite(dat);
	return(-1);
}
unsigned char LCD_ReadStatus(void)
{
	LCD_CMD;
	return(ucRead());
}
unsigned char LCD_ReadData(void)
{
	if(LCD_StatusCheck(LCD_CC)==0)return(0);
	LCD_DATA;
	return(ucRead());
}
unsigned char LCD_AutoReadData(void)
{
	if(LCD_StatusCheck(LCD_DATA_CR_EN)==0)return(0);
	LCD_DATA;
	return(ucRead());
}
char LCD_INIT(void)
{
	OCR1A = 500;//背光0-999
	LCD_RST = 0;
	vWait(10);
	LCD_RST = 1;
	if(LCD_WriteCommand(LCD_MOD_XOR)==0)return(0);
	if(LCD_WriteCommand(LCD_GRA_ON)==0)return(0);
	if(LCD_WriteData(0x1e)==0)return(0);
	if(LCD_WriteData(0x00)==0)return(0);
	if(LCD_WriteCommand(LCD_GRH_WID)==0)return(0);
	if(LCD_WriteData(0x00)==0)return(0);
	if(LCD_WriteData(0x00)==0)return(0);
	if(LCD_WriteCommand(LCD_GRH_STP)==0)return(0);
	
	LCD_page0();
	LCD_page1();
	return(-1);
}
char LCD_FILL(unsigned char page,unsigned char dat)
{
	unsigned int i = 0;
	
	if(LCD_WriteData((page*0x780)%256)==0)return(0);
	if(LCD_WriteData((page*0x780)/256)==0)return(0);
	if(LCD_WriteCommand(LCD_ADD_POS)==0)return(0);
	if(LCD_WriteCommand(LCD_AUT_WR)==0)return(0);
	if(LCD_StatusCheck(LCD_CC)==0)return(0);
	for(i=0;i<240*8;i++)
	{
		if(LCD_AutoWriteData(dat)==0)
		{
			i = LCD_INIT();
			return(0);
		}
	}
	if(LCD_WriteCommand(LCD_AUT_OVR)==0)
	{
		i =LCD_INIT();
		return(0);
	}
	return(-1);
}
char LCD_LOAD_PAGE(unsigned char page,const unsigned char *p)
{
	unsigned int i = 0;
	unsigned char dat = 0;
	
	if(LCD_WriteData((page*0x780)%256)==0)return(0);
	if(LCD_WriteData((page*0x780)/256)==0)return(0);
	if(LCD_WriteCommand(LCD_ADD_POS)==0)return(0);
	if(LCD_WriteCommand(LCD_AUT_WR)==0)return(0);
	if(LCD_StatusCheck(LCD_CC)==0)return(0);
	for(i=0;i<240*8;i++)
	{
		dat = pgm_read_byte(p++);
		if(LCD_AutoWriteData(dat)==0)
		{
			i = LCD_INIT();
			return(0);
		}
	}
	if(LCD_WriteCommand(LCD_AUT_OVR)==0)
	{
		i =LCD_INIT();
		return(0);
	}
	return(-1);
}
char LCD_PutChar(unsigned char page,unsigned int position,const unsigned char *hz)
{
	unsigned char i = 0,k = 0;
	unsigned char dat = 0;
	
	unsigned char x = 0,y = 0;
	
	x = position % 256;
	y = position / 256;
	
	position = y * 240;
	position += x;// * 2;
	position += page * 0x780;

	for(k=0;k<16;k++)
	{
		position += 30;
		x = position % 256;
		y = position / 256;
		if(LCD_WriteData(x)==0)return(0);
		if(LCD_WriteData(y)==0)return(0);
		if(LCD_WriteCommand(LCD_ADD_POS)==0)return(0);
		for(i=0;i<2;i++)
		{
			dat = pgm_read_byte(hz++);
			if(LCD_WriteData(dat)==0)return(0);
			if(LCD_WriteCommand(LCD_INC_WR)==0)return(0);
		}
	}
	return(-1);
}
char LCD_PutEng(unsigned char page,unsigned int position,const unsigned char *eng)
{
	unsigned char i = 0;
	unsigned char dat = 0;
	
	unsigned char x = 0,y = 0;
	
	x = position % 256;
	y = position / 256;
	
	position = y * 240;
	position += x;// * 2;
	position += page * 0x780;

	for(i=0;i<16;i++)
	{
		position += 30;
		x = position % 256;
		y = position / 256;
		if(LCD_WriteData(x)==0)return(0);
		if(LCD_WriteData(y)==0)return(0);
		if(LCD_WriteCommand(LCD_ADD_POS)==0)return(0);
		dat = pgm_read_byte(eng++);
		if(LCD_WriteData(dat)==0)return(0);
		if(LCD_WriteCommand(LCD_INC_WR)==0)return(0);
	}
	return(-1);
}
char LCD_PutAnyThing(unsigned char page,unsigned int position,unsigned char dat)
{
	position += page * 0x780;
	if(LCD_WriteData(position%256)==0)return(0);
	if(LCD_WriteData(position/256)==0)return(0);
	if(LCD_WriteCommand(LCD_ADD_POS)==0)return(0);
	if(LCD_WriteData(dat)==0)return(0);
	if(LCD_WriteCommand(LCD_NOC_WR)==0)return(0);
	return(-1);
}
char LCD_Case(unsigned char page)
{
	unsigned int i=0;
	unsigned char x=0;
	for(i=0;i<60;i++)
	{
		if(LCD_PutAnyThing(page,0x0000+i,0xff)==0)return(0);
	}
	for(i=1860;i<1920;i++)
	{
		if(LCD_PutAnyThing(page,0x0000+i,0xff)==0)return(0);
	}
	i = 30;
	for(x=2;x<62;x++)
	{
		i += 30;
		if(LCD_PutAnyThing(page,i,0xc0)==0)return(0);
		if(LCD_PutAnyThing(page,i+29,0x03)==0)return(0);
	}
	return(-1);
}
void vLCD_Page_Change(unsigned char page)
{
	unsigned int pos = 0;
	unsigned null = 0;
	
//	CurrentPage = page;
	pos = page*0x780;
	null = LCD_WriteData(pos%256);
	null = LCD_WriteData(pos/256);
	null = LCD_WriteCommand(LCD_GRH_STP);
}
void LCD_page0(void)
{
	char null = 0;
	unsigned char i = 0;
	unsigned char page = 0;
	const unsigned char *p = name;
	
	null = LCD_FILL(page,00);
	for(i=2;i<28;i+=2)
	{
		null = LCD_PutChar(page,0x0100+i,p);
		p += 32;
	}
	p = web;
	for(i=4;i<26;i++)
	{
		null = LCD_PutEng(page,0x0300+i,p);
		p += 16;
	}
	p = phone;
	null = LCD_PutChar(page,0x0502,p);
	p += 32;
	null = LCD_PutChar(page,0x0504,p);
	p = pnum;
	for(i=6;i<28;i++)
	{
		null = LCD_PutEng(page,0x0500+i,p);
		p += 16;
	}
	null = LCD_Case(page);
}
void LCD_page1(void)
{
   
	volatile unsigned char null = 0;
	unsigned char page = 1;
	const unsigned char *p = name;
	
	page = 1;
	null = LCD_FILL(page,0);
	vLCD_Page_Change(page);
	
	p = ctrl;
	p += 32*32;
	null = LCD_Case(page);
	null = LCD_PutChar(page,0x0101,p);//状
	p += 32;
	null = LCD_PutChar(page,0x0103,p);//态
	p = web;
	p += 4*16;
	null = LCD_PutEng(page,0x0105,p);//:
	null = LCD_PutEng(page,0x0305,p);//:
	null = LCD_PutEng(page,0x0505,p);//:
	null = LCD_PutEng(page,0x0311,p);//:
	null = LCD_PutEng(page,0x0511,p);//:
	//null = LCD_PutEng(page,0x0510,p);//:
	//null = LCD_PutEng(page,0x0513,p);//:

	p = ctrl;
	p += 24*32;
	null = LCD_PutChar(page,0x0301,p);//电
	p += 32;
	null = LCD_PutChar(page,0x0303,p);//压
	p += 32;
	null = LCD_PutChar(page,0x0501,p);//电
	p += 32;
	null = LCD_PutChar(page,0x0503,p);//流
	p = ctrl;
	p += 30*32;
	null = LCD_PutChar(page,0x030d,p);//温
	p +=32;
	null = LCD_PutChar(page,0x030f,p);//度
	p = ctrl;
	p += 36*32;
	null = LCD_PutChar(page,0x0316,p);//℃
	
	
	p = ctrl;
	p += 40*32;
	null = LCD_PutChar(page,0x0516,p);//分
	p = ctrl;
	p += 14*32;
	null = LCD_PutChar(page,0x050d,p);//时
	p +=32;
	null = LCD_PutChar(page,0x050f,p);//间
}

unsigned char cKeyScan(void)
{
	unsigned char k = 0x00;

	PORTD = 0x30;
	DDRD = 0x30;
	PORTC = 0x0fc;
	DDRC = 0x00;

	DDRD = 0x3f;
	vWait(10);
	if(KEYPIN4 == 0){k = 0x40;KEYDIR4 = 1;}
	if(KEYPIN5 == 0){k = 0x50;KEYDIR5 = 1;}
	if(KEYPIN6 == 0){k = 0x60;KEYDIR6 = 1;}
	if(KEYPIN7 == 0){k = 0x70;KEYDIR7 = 1;}
	DDRD &= 0xf0;
	vWait(10);
	k |= ((~PIND)&0x0f);
	KEYDIR4 = 0;
	KEYDIR5 = 0;
	KEYDIR6 = 0;
	KEYDIR7 = 0;
	return(k);
}
unsigned char cKey(unsigned char keyval)
{
	switch(keyval)
	{
		case 0x41:return(10);
		break;
		case 0x42:return(11);
		break;
		case 0x44:return(12);
		break;
		case 0x48:return(13);
		break;
		case 0x51:return(0);
		break;
		case 0x52:return(3);
		break;
		case 0x54:return(2);
		break;
		case 0x58:return(1);
		break;
		case 0x61:return(14);
		break;
		case 0x62:return(6);
		break;
		case 0x64:return(5);
		break;
		case 0x68:return(4);
		break;
		case 0x71:return(15);
		break;
		case 0x72:return(9);
		break;
		case 0x74:return(8);
		break;
		case 0x78:return(7);
		break;
		default:return(0x0ff);
		break;
	}
}
/////////////////////////////////////////////////////////////////////////
//系统函数区/////////////////////////////////////////////////////////////
void vInit(void)
{
	vPortInit();
	vTimer0Init();
	if(MCUCSR&(1<<WDRF));//wdt rest
	if(MCUCSR&(1<<BORF));//brown out
	if(MCUCSR&(1<<PORF));//power on
	MCUCR = 0x00;
	SREG |= 0x80;
	vOCR1Init();
	vSpiInit();
}

void vPortInit(void)
{
	PORTA = 0x0ff;
	DDRA  = 0x00;

	PORTB = 0x0ff;
	DDRB  = 0x4f;

	PORTC = 0x0ff;
	DDRC  = 0x00;

	PORTD = 0x0ff;
	DDRD  = 0x30;

}
void vTimer0Init(void)
{
	OCR0  = 249;
	TCCR0 = 0x0b;
}
void vOCR1Init(void)
{
	OCR1A  = 0x0000;
	OCR1B  = 0x0000;
	TCCR1A = 0x0f2;
	TCCR1B = 0x19;
	ICR1   = 0x03e7;
}
void vSpiInit(void)
{
	SPCR = 0xce;
	SPSR = 0x00;
}
/////////////////////////////////////////////////////////////////////////

⌨️ 快捷键说明

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