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

📄 lcd.c

📁 基于LPC2148的UCOSII
💻 C
字号:
#include "config.h"



TCOLOR gui_disp_buf[GUI_LCM_YMAX][GUI_LCM_XMAX/8];







/********************************/
/*     液晶初始化               */
/********************************/

void LCM_DispIni(void)
{
	OS_ENTER_CRITICAL();
	LCM_WrCommand(0x30);
	delay1us(400);
	LCM_WrCommand(0x30);
	delay1us(400);
	LCM_WrCommand(0x0c);
	delay1us(400);
	LCM_WrCommand(0x01);
	delay1us(400);
	LCM_WrCommand(0x06);
	delay1us(400);
	LCM_WrCommand(0x36);
	delay1us(400);
	OS_EXIT_CRITICAL();
}


void GUI_FillSCR(TCOLOR dat)
{
	uint32 i,j;
	for(i=0;i<GUI_LCM_YMAX;i++)
	{
		for(j=0;j<(GUI_LCM_XMAX/8);j++)
			gui_disp_buf[i][j] = dat;
	}
	LCM_DispFill(dat);
}


 void LCM_DispFill(uint8 dat)
 {
 	uint32 i,j;
	OS_ENTER_CRITICAL();
	for(i=0;i<32;i++)
	{
		LCM_WrCommand(0x34);		
		LCM_WrCommand(0x80+i);	
		LCM_WrCommand(0x80);
		for(j=0;j<8;j++)
		{
			LCM_WrData(dat);
			LCM_WrData(dat);
			delay1us(40);
		}
	}
	LCM_WrCommand(0x34);
	LCM_WrCommand(0x36);
	delay1us(40);
	OS_EXIT_CRITICAL();
 }

/********************************/
/*     延时1us字程序            */
/********************************/
void delay1us(uint32 dly)
{
	uint8 i;
	for(;dly>0;dly--)
	{
		i=5;
		while(i--);
	}
}


/********************************/
/*     延时1ms字程序            */
/********************************/
void delay1ms(uint32 dly)
{
	uint16 i;
	for(;dly>0;dly--)
	{
		i=6000;
		while(i--);
	}
}



/********************************/
/*     检查液晶是否处于忙状态   */
/********************************/
void LCM_CheckBusy(void)
{
	OS_ENTER_CRITICAL();
	
	IODIR0 = ( IODIR0 | LCD_RW ) & (~LCD_XD);
	IODIR1 = IODIR1 | LCD_E | LCD_A0; 
	IOCLR1 = LCD_A0;
	IOSET0 = LCD_RW;
	IOSET1 = LCD_E;
	delay1us(1);
	while(!(IOPIN0 & 0x00800000)==0);	
	IOCLR1 = LCD_E;
	IODIR0 = IODIR0 | LCD_XD;
	OS_EXIT_CRITICAL();
}


/********************************/
/*     从液晶读数据             */
/********************************/
uint8 LCM_RdData(void)
{
	uint8 readata;
	LCM_CheckBusy();
	OS_ENTER_CRITICAL();
	IODIR0 = ( IODIR0 | LCD_RW ) & (~LCD_XD);
	IODIR1 = IODIR1 | LCD_E | LCD_A0; 
	IOSET0 = LCD_RW;
	IOSET1 = LCD_E | LCD_A0;
	delay1us(1);
	readata=LCD_XDATA;
	IOCLR1 = LCD_E;
	delay1us(1);	
	IODIR0 = IODIR0 | LCD_XD;	//SET DATA PORT OUT 1
	OS_EXIT_CRITICAL();
	return readata;
	
}

/********************************/
/*     向液晶写控制命令         */
/********************************/
void LCM_WrCommand(uint8 cmd)			//write command to ST7920
{
	LCM_CheckBusy();
	OS_ENTER_CRITICAL();
	IODIR0 = IODIR0 | LCD_RW |LCD_XD;
	IODIR1 = IODIR1 | LCD_E | LCD_A0; 
	IOPIN0 = (IOPIN0 & (~LCD_XD)) | (cmd<<16);
	IOCLR0 = LCD_RW;
	IOCLR1 = LCD_A0;
	IOSET1 = LCD_E;	
	delay1us(1);
	IOCLR1 = LCD_E;
	delay1us(1);
	IOPIN0 = (IOPIN0 & (~LCD_XD)) | (0xff<<16);
	OS_EXIT_CRITICAL();
}


/********************************/
/*     向液晶写入数据           */
/********************************/
void LCM_WrData(uint8 dat)			//write data to ST7920
{
	
	LCM_CheckBusy();
	OS_ENTER_CRITICAL();
	IODIR0 = IODIR0 | LCD_RW |LCD_XD;
	IODIR1 = IODIR1 | LCD_E | LCD_A0; 
	IOPIN0 = (IOPIN0 & (~LCD_XD)) | (dat<<16);
	IOCLR0 = LCD_RW;
	IOSET1 = LCD_E | LCD_A0;	
	delay1us(1);
	IOCLR1 = LCD_E;
	delay1us(1);
	IOPIN0 = (IOPIN0 & (~LCD_XD)) | (0xff<<16);
	OS_EXIT_CRITICAL();
}


void LCM_WriteByte(uint8 x,uint8 y,uint8 wrdata)
{
	//uint8 data;
	x = x&0x7f;
	y = y&0x1f;
	
	gui_disp_buf[y][x>>3] = wrdata;
	
	LCM_WrCommand(0x34);		
	LCM_WrCommand(0x80 + y);	
	LCM_WrCommand(0x80 + (x>>4));
	if((x>>3)%2 == 1)
	{
		delay1us(40);
		LCM_WrData(LCM_ReadByte(x-8,y));
		delay1us(40);
		LCM_WrData(wrdata);
		delay1us(40);
	}
	else
	{
		delay1us(40);
		LCM_WrData(wrdata);
		delay1us(40);
		LCM_WrData(LCM_ReadByte(x+8,y));
		delay1us(40);
	}
		
	LCM_WrCommand(0x34);
	LCM_WrCommand(0x36);
	delay1us(40);
	
}
uint8 LCM_ReadByte(uint8 x,uint8 y)
{
	x = x&0x7f;
	y = y&0x1f;
	x = x>>3;
	return(gui_disp_buf[y][x]);
}

void GUI_Initialize(void)
{
	LCM_DispIni();
	GUI_FillSCR(0x00);
}
uint8 const DEC_HEX_TAB[8] = {0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};

uint8 GUI_Point(uint8 x,uint8 y,TCOLOR color)
{
	uint8 bak;
	if(x>=GUI_LCM_XMAX)return(0);
	if(y>=GUI_LCM_YMAX)return(0);
	bak = LCM_ReadByte(x,y);
	if(color == 0)
	{
		bak &= (~DEC_HEX_TAB[x & 0x07]);
	}
	else
	{
		bak |= DEC_HEX_TAB[x & 0x07];
	}
	LCM_WriteByte(x,y,bak);
	return (1);
}



uint8 GUI_ReadPoint(uint8 x,uint8 y,TCOLOR *ret)
{
	uint8 bak;
	if(x>=GUI_LCM_XMAX)return(0);
	if(y>=GUI_LCM_YMAX)return(0);
	bak = LCM_ReadByte(x,y);
	if((bak&(DEC_HEX_TAB[y&0x07])) == 0) *ret = 0x00;
	else	*ret = 0x01;
	return(1);
}



void GUI_HLine(uint8 x0,uint8 y0,uint8 x1,TCOLOR color)
{
	uint8 bak;
	if(x0>x1)
	{
		bak = x1;
		x1  = x0;
		x0  = bak;
	}
	do
	{
		GUI_Point(x0,y0,color);
		x0++;
	}
	while(x0<=x1);

}



void GUI_RLine(uint8 x0,uint8 y0,uint8 y1,TCOLOR color)
{
	uint8 bak;
	if(y0>y1)
	{
		bak = y1;
		y1  = y0;
		y0  = bak;
	}
	do
	{
		GUI_Point(x0,y0,color);
		y0++;
	}
	while(y0<=y1);
}




/*****************************************/
/*在第line行,第addr个位置显示一个字符str*/
/* 			line = 1~2  addr = 1~15      */
/*****************************************/
void displayachar(uint8 line,uint8 addr,char str)
{
	uint8 readata;
	if(line>2 || line<1 || addr<1 ||addr>15)
	return;
	//OS_ENTER_CRITICAL();
	LCM_WrCommand(0x34);
	LCM_WrCommand(0x30);
	switch(line)
	{
		case 1:
		if(addr%2==1)
		{
			addr = (addr-1)/2 + 0x80;
			LCM_WrCommand(addr);
		}
		else
		{
			addr = addr/2 - 1 + 0x80;
			LCM_WrCommand(addr);
			delay1us(50);
			readata = LCM_RdData();
			delay1us(50);
			LCM_WrCommand(addr);
			delay1us(50);
			LCM_WrData(readata);
		}
		break;
		case 2:
		if(addr%2==1)
		{
			addr = (addr-1)/2 + 0x90;
			LCM_WrCommand(addr);
		}
		else
		{
			addr = addr/2 - 1 + 0x90;
			LCM_WrCommand(addr);
			delay1us(50);
			readata = LCM_RdData();
			delay1us(50);
			LCM_WrCommand(addr);
			delay1us(50);
			LCM_WrData(readata);
		}
		break;
		default:break;
	}
	
	delay1us(50);
	LCM_WrData(str);
	delay1us(50);
	LCM_WrCommand(0x34);
	LCM_WrCommand(0x36);
	//OS_EXIT_CRITICAL();
}


/********************************/
/*在第line行,第addr个位置显示一个汉字*str*/
/* line = 1~2  addr = 1~7       */
/********************************/
void displayachinese(uint8 line,uint8 addr,char *str)
{	
	if(line>2 || line<1 || addr<1 ||addr>7)
	return;
	//OS_ENTER_CRITICAL();
	LCM_WrCommand(0x34);
	LCM_WrCommand(0x30);
	if(line == 1)
	addr = addr -1 + 0x80;
	else 
	addr = addr -1 + 0x90;
	LCM_WrCommand(addr);
	delay1us(50);
	LCM_WrData(*str);
	delay1us(50);
	LCM_WrData(*(str+1));
	delay1us(50);
	LCM_WrCommand(0x34);
	LCM_WrCommand(0x36);
	//OS_ENTER_CRITICAL();
}


/********************************/
/*在第line行,第addr个位置显示字符串*str*/
/* line = 1~2  addr = 1~15      */
/********************************/
void displayastr(uint8 line,uint8 addr,char *str)
{
	uint8 len,i;
	if(line>2 || line<1 || addr<1 ||addr>7)
		return;
	LCM_WrCommand(0x34);
	LCM_WrCommand(0x30);
	len = strlen(str);
	if(len+(addr-1)*2>15)
	len = 15 - (addr-1)*2;
	if(line == 1)
	addr = addr -1 + 0x80;
	else 
	addr = addr -1 + 0x90;
	LCM_WrCommand(addr);
	delay1us(50);
	for(i=0;i<len;i++)
	{
		LCM_WrData(*(str+i));
		delay1us(50);
	}
	LCM_WrCommand(0x34);
	LCM_WrCommand(0x36);
}




⌨️ 快捷键说明

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