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

📄 interface.c

📁 2005年全国大学生电子设计竞赛论文集
💻 C
字号:
/***************************************************************************************************
	file			:	Interface.c
	author			:	Group23.EEICST.HUST
	finish			:	2005-08-15 10:42
	related files	:	Interface.h
----------------------------------------------------------------------------------------------------
	the basic API for SPCE061 with LCD(FM12864) and KeyBoard
	used 8 IOs for control,and they are exclusive
	used 8 IOs for Data,and they can be shared
	used IRQ6_TMB1
Attention:
	1.	At the very begining of your programe fire the "Interface_Init" before
	2.	If using different IO ports definitions,only the "#define"s should be modified
***************************************************************************************************/

#include "Global.h"
#include "ENCL12.h"			//this is the Lattices of the English Characters.

#define LCD_Nop
#define SIGN(x)	((x)<0?-1:1)
#define ABS(x)	((x)<0?-(x):(x))

#define bmLCD_DATA	(BIT0|BIT1|BIT2|BIT3|BIT4|BIT5|BIT6|BIT7)	//DATA:		IOB[0..7]
#define bmLCD_CSA	BIT9										//CSA:		IOB[9]
#define bmLCD_CSB	BIT8										//CSB:		IOB[8]
#define bmLCD_DI	BIT10										//DI:		IOB[10]
#define bmLCD_RW	BIT11										//RW:		IOB[11]
#define bmLCD_E		BIT12										//E:		IOB[12]
#define bmLCD_RST	BIT13										//Reset:	IOB[13]
#define bmLCD_CTRL	(BIT8|BIT9|BIT10|BIT11|BIT12|BIT13)

#define LCD_GET_DATA	((*P_IOA_Data)&bmLCD_DATA)
#define LCD_SET_DATA(x)	((*P_IOA_Data)=(*P_IOA_Data)&(~bmLCD_DATA)|x)	//!Attention!:x must <0x0100

#define LCD_CSNone	do{SET_PORTA(bmLCD_CSA);SET_PORTA(bmLCD_CSB);}while(0)
#define LCD_CSA		do{CLR_PORTA(bmLCD_CSA);SET_PORTA(bmLCD_CSB);}while(0)
#define LCD_CSB		do{SET_PORTA(bmLCD_CSA);CLR_PORTA(bmLCD_CSB);}while(0)
#define LCD_CSAll	do{CLR_PORTA(bmLCD_CSA);CLR_PORTA(bmLCD_CSB);}while(0)

#define LCD_DATA	SET_PORTA(bmLCD_DI)		//DI:	IOB[10]
#define LCD_CMD		CLR_PORTA(bmLCD_DI)

#define LCD_READ	SET_PORTA(bmLCD_RW)		//RW:	IOB[11]
#define LCD_WRITE	CLR_PORTA(bmLCD_RW)

#define LCD_SET_E	SET_PORTA(bmLCD_E)		//E:	IOB[12]
#define LCD_CLR_E	CLR_PORTA(bmLCD_E)

#define LCD_RESET	CLR_PORTA(bmLCD_RST)		//RST:	IOB[13]
#define LCD_UNRESET	SET_PORTA(bmLCD_RST)

#define LCD_CTRL_OUT	SET_PORTA_OUT(bmLCD_CTRL)

#define LCD_DATA_IN		SET_PORTA_IN(bmLCD_DATA)	//DATA
#define LCD_DATA_OUT	SET_PORTA_OUT(bmLCD_DATA)

#define LCD_CMD_ON		0x003F
#define LCD_CMD_OFF		0x003E
#define LCD_CMD_STARTR	0x00C0
#define LCD_CMD_PAGE	0x00B8
#define LCD_CMD_Y		0x0040
//=========================================================================================
//
//=========================================================================================
void LCD_WriteCMD(unsigned char Data)
{
	unsigned char status;
	LCD_DATA_IN;
	LCD_READ;
	LCD_CMD;
	do
	{
		LCD_Nop;
		LCD_SET_E;
		LCD_Nop;
		status=LCD_GET_DATA;
		LCD_CLR_E;
	}while(status&0x80);
	LCD_DATA_OUT;
	LCD_SET_DATA(Data);
	LCD_WRITE;
	LCD_Nop;
	LCD_SET_E;
	LCD_Nop;
	LCD_CLR_E;
}
//=========================================================================================
//
//=========================================================================================
unsigned char LCD_ReadDATA()
{
	unsigned char data;
	LCD_DATA_IN;
	LCD_READ;
	LCD_CMD;
	do
	{
		LCD_Nop;
		LCD_SET_E;
		LCD_Nop;
		data=LCD_GET_DATA;
		LCD_CLR_E;
	}while(data&0x80);
	LCD_DATA;
	LCD_Nop;
	LCD_SET_E;
	LCD_Nop;
	data=LCD_GET_DATA;
	LCD_CLR_E;
	return data;
}
//=========================================================================================
//
//=========================================================================================
void LCD_WriteDATA(unsigned char Data)
{
	unsigned char status;
	LCD_DATA_IN;
	LCD_READ;
	LCD_CMD;
	do
	{
		LCD_Nop;
		LCD_SET_E;
		LCD_Nop;
		status=LCD_GET_DATA;
		LCD_CLR_E;
	}while(status&0x80);
 	LCD_DATA_OUT;
	LCD_SET_DATA(Data);
	LCD_WRITE;
	LCD_DATA;
	LCD_Nop;
	LCD_SET_E;
	LCD_Nop;
	LCD_CLR_E;
}
//=========================================================================================
//
//=========================================================================================
void LCD_Init()
{
	int i;
	LCD_CTRL_OUT;
	LCD_DATA_OUT;
	LCD_RESET;
	for(i=0;i<0x40;i++)
		LCD_Nop;
	LCD_UNRESET;
	for(i=0;i<0x40;i++)
		LCD_Nop;
	LCD_CSNone;
	LCD_WriteCMD(LCD_CMD_ON);
	LCD_WriteCMD(LCD_CMD_STARTR|0x00);
}
//=========================================================================================
//
//=========================================================================================
void LCD_CLS(unsigned char Color)
{
	unsigned char page,y;
	LCD_CSA;
	for(page=0;page<8;page++)
	{
		LCD_WriteCMD(LCD_CMD_PAGE|page);
		for(y=0;y<64;y++)
			LCD_WriteDATA(Color);
	}
	LCD_CSB;
	for(page=0;page<8;page++)
	{
		LCD_WriteCMD(LCD_CMD_PAGE|page);
		for(y=0;y<64;y++)
			LCD_WriteDATA(Color);
	}
	LCD_CSNone;
}
//=========================================================================================
//
//=========================================================================================
void LCD_StartRow(int x)
{
	LCD_WriteCMD(LCD_CMD_STARTR|(~x&0x3F));
}
//=========================================================================================
//
//=========================================================================================
void LCD_Pixel(int x,int y,unsigned char Color)
{
	unsigned char temp;
	if(x<0||x>127||y<0||y>63)
		return;
	if(x&0x40)
		LCD_CSB;
	else
		LCD_CSA;
	x&=0x3F;
	LCD_WriteCMD(LCD_CMD_PAGE|(y>>3));
	LCD_WriteCMD(LCD_CMD_Y|x);
	temp=LCD_ReadDATA();
	LCD_WriteCMD(LCD_CMD_Y|x);
	temp=LCD_ReadDATA();
	LCD_WriteCMD(LCD_CMD_Y|x);
	if(Color==1)
		LCD_WriteDATA(temp|(0x01<<(y&0x07)));
	else if(Color==0)
		LCD_WriteDATA(temp&(~(0x01<<(y&0x07))));
	else if(Color==2)
		LCD_WriteDATA(temp^(0x01<<(y&0x07)));
	LCD_CSNone;
}
//=========================================================================================
//
//=========================================================================================
void LCD_Line(int x0,int y0,int x1,int y1,unsigned char Color)
{
	int x,y,sx,sy,e,dx,dy,temp;
	dx=x1-x0;
	dy=y1-y0;
	if(!(dx|dy))
		return;
	if(ABS(dx)>ABS(dy))
	{
		if(x0>x1)
		{
			temp=x0;
			x0=x1;
			x1=temp;
			temp=y0;
			y0=y1;
			y1=temp;
		}
		dx=x1-x0;
		dy=y1-y0;
		sy=SIGN(dy);
		dy=ABS(dy);
		e=(dy>>1);
		y=y0;
		for(x=x0;x<=x1;x++)
		{
			LCD_Pixel(x,y,Color);
			e+=dy;
			if(e>=dx)
			{
				y+=sy;
				e-=dx;
			}
		}
	}
	else
	{
		if(y0>y1)
		{
			temp=x0;
			x0=x1;
			x1=temp;
			temp=y0;
			y0=y1;
			y1=temp;
		}
		dx=x1-x0;
		dy=y1-y0;
		sx=SIGN(dx);
		dx=ABS(dx);
		e=(dx>>1);
		x=x0;
		for(y=y0;y<=y1;y++)
		{
			LCD_Pixel(x,y,Color);
			e+=dx;
			if(e>=dy)
			{
				x+=sx;
				e-=dy;
			}
		}
	}
}
//=========================================================================================
//
//=========================================================================================
void LCD_Bar(int x0,int y0,int x1,int y1,unsigned char LineColor,unsigned char FillColor)
{
	int x,y,temp;
	if(x0>x1)
	{
		temp=x0;
		x0=x1;
		x1=temp;
	}
	for(x=x0+1;x<x1;x++)
	{
		*P_Watchdog_Clear=1;
		for(y=y0+1;y<y1;y++)
			LCD_Pixel(x,y,FillColor);
	}
	for(x=x0;x<=x1;x++)
	{
		LCD_Pixel(x,y0,LineColor);
		LCD_Pixel(x,y1,LineColor);
	}
	for(y=y0+1;y<y1;y++)
	{
		LCD_Pixel(x0,y,LineColor);
		LCD_Pixel(x1,y,LineColor);
	}
}
//=========================================================================================
//
//=========================================================================================
void LCD_Box(int x0,int y0,int x1,int y1,unsigned char Color)
{
	int x,y,temp;
	if(x0>x1)
	{
		temp=x0;
		x0=x1;
		x1=temp;
	}
	for(x=x0;x<=x1;x++)
	{
		LCD_Pixel(x,y0,Color);
		LCD_Pixel(x,y1,Color);
	}
	for(y=y0+1;y<y1;y++)
	{
		LCD_Pixel(x0,y,Color);
		LCD_Pixel(x1,y,Color);
	}
}
//=========================================================================================
//
//=========================================================================================
int LCD_DrawText(char *str,int x,int y,char ForeColor,char BackColor)	//Color:0-white,1-black,2-reverse,3-lucency
{
	int i,j,k,n,qu,wei,location;
	while(*str)
	{
		if(*str<128)
		{
			for(i=0;i<12;i++)
				for(k=0;k<7;k++)
					if((CL12[*str-32][i]>>k)&0x01)
					{
						if(ForeColor!=3)
							LCD_Pixel(x+k,y+i,ForeColor);
					}
					else
					{
						if(BackColor!=3)
							LCD_Pixel(x+k,y+i,BackColor);
					}
			x+=6;
			str++;
		}
#ifdef __CN_CHAR__
		else
		{
			qu=*(str++)-0xa0;
			wei=*(str++)-0xa0;
			location=qu*94+wei;
			for(n=0;n<NUM_STR;n++)
			{
				if(ZKQW[n]==location)
				{
					for(i=0;i<12;i++)
					{
							for(k=0;k<8;k++)
								if((ZKDATA[n*24+i*2]>>(7-k))&0x01)
								{
									if(ForeColor!=3)
										LCD_Pixel(x+k,y+i,ForeColor);
								}
								else
								{
									if(ForeColor!=3)
										LCD_Pixel(x+k,y+i,BackColor);
								}
							for(k=0;k<4;k++)
								if((ZKDATA[n*24+i*2+1]>>(7-k))&0x01)
								{
									if(ForeColor!=3)
										LCD_Pixel(x+8+k,y+i,ForeColor);
								}
								else
								{
									if(ForeColor!=3)
										LCD_Pixel(x+8+k,y+i,BackColor);
								}
					}
					break;
				}
			}
			x+=12;
		}
#endif
	}
	return x;
}
//=========================================================================================
//
//=========================================================================================
int LCD_VirtualDrawText(char *str,int x)	//for getting the pixel length of str
{
	while(*str)
	{
		if(*str<128)
		{
			x+=6;
			str++;
		}
#ifdef __CN_CHAR__
		else
		{
			str+=2;
			x+=12;
		}
#endif
	}
	return x;
}
//=========================================================================================
//this function is a copy from group5.EEICSR.HUST
//It's faster then LCD_Bar(x0,y0,x1,y1,2,2)
//=========================================================================================
void LCD_Reverse(int x0,int y0,int x1,int y1)
{
	unsigned char tmp,tmpDa;
	unsigned char sy=y0>>3;
	unsigned char ey=y1>>3;
	unsigned char mod,count;
	unsigned char backup,backupY;

	count = ey-sy+1;

	if(x0>=64 || x1<64)
	{
		backupY = sy;
		if(x1<64)
			LCD_CSA;
		else
			LCD_CSB;
		while(count--)
		{
			LCD_WriteCMD(LCD_CMD_PAGE|backupY++);
			if(count == (ey-sy))
			{
				if(ey == sy)
					mod = ((1<<((y1&0x07)+1))-1)^((1<<(y0&0x07))-1);
				else
					mod = 0xFF&(0xFF<<(y0&0x07));
			}
			else if(count == 0)
				mod = ((y1&0x07)==0x07)?0xFF:((1<<((y1&0x07)+1))-1);
			else
				mod = 0xFF;
			for(tmp=x0;tmp<=x1;tmp++)
			{
				LCD_WriteCMD(LCD_CMD_Y|tmp);
				tmpDa = LCD_ReadDATA();
				LCD_WriteCMD(LCD_CMD_Y|tmp);
				tmpDa = LCD_ReadDATA();
				LCD_WriteCMD(LCD_CMD_Y|tmp);
				LCD_WriteDATA(tmpDa^mod);
			}
		}
		LCD_CSNone;
	}
	else
	{
		LCD_CSA;
		backup = count;
		backupY = sy;
		while(count--)
		{
			LCD_WriteCMD(LCD_CMD_PAGE|backupY++);
			if(count == (ey-sy))
			{
				if(ey == sy)
					mod = ((1<<((y1&0x07)+1))-1)^((1<<(y0&0x07))-1);
				else
					mod = 0xFF&(0xFF<<(y0&0x07));
			}
			else if(count == 0)
				mod = ((y1&0x07)==0x07)?0xFF:((1<<((y1&0x07)+1))-1);
			else
				mod = 0xFF;
			for(tmp=x0;tmp<64;tmp++)
			{
				LCD_WriteCMD(LCD_CMD_Y|tmp);
				tmpDa = LCD_ReadDATA();
				LCD_WriteCMD(LCD_CMD_Y|tmp);
				tmpDa = LCD_ReadDATA();
				LCD_WriteCMD(LCD_CMD_Y|tmp);
				LCD_WriteDATA(tmpDa^mod);
			}
		}
		count = backup;
		backupY = sy;
		LCD_CSB;
		while(count--)
		{
			LCD_WriteCMD(LCD_CMD_PAGE|backupY++);
			if(count == (ey-sy))
			{
				if(ey == sy)
					mod = ((1<<((y1&0x07)+1))-1)^((1<<(y0&0x07))-1);
				else
					mod = 0xFF&(0xFF<<(y0&0x07));
			}
			else if(count == 0)
				mod = ((y1&0x07)==0x07)?0xFF:((1<<((y1&0x07)+1))-1);
			else
				mod = 0xFF;
			for(tmp=0;tmp<=x1-64;tmp++)
			{
				LCD_WriteCMD(LCD_CMD_Y|tmp);
				tmpDa = LCD_ReadDATA();
				LCD_WriteCMD(LCD_CMD_Y|tmp);
				tmpDa = LCD_ReadDATA();
				LCD_WriteCMD(LCD_CMD_Y|tmp);
				LCD_WriteDATA(tmpDa^mod);
			}
		}
	}
}
//=========================================================================================
//
//=========================================================================================
void Interface_Init()
{
	LCD_Init();	
}

⌨️ 快捷键说明

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