www.pudn.com > T6963LcdOnC196.rar > lcd.c


#include "includes.h" 
 
char		cCursorX; 
char		cCursorY; 
 
char		cCursorDeltaY; 
 
char		cCursorSelect; 
char		cCursorMaxPos; 
 
//显示光标,光标位置由全局变量cCursorX,cCursorY指定c 
void ShowCursor() 
{ 
	B_AL = cCursorX; 
	B_BL = cCursorY; 
	B_CL = 0x21; 
	LCM1(); 
} 
 
//设置下一个操作的显存地址,以字节为单位 
void SetLcmAddr(char x,char y,char TxtArea) 
{ 
	unsigned int addr; 
 
	addr = y*0x20 + x; 
 
	if(TxtArea) 
	{ 
		addr += 0x1000; 
	} 
 
	B_AL = addr & 0xff; 
	B_BL = addr >> 8; 
	B_CL = 0x24; 
	LCM1(); 
} 
 
//向lcm中写入一个字节的数据,且LCM的数据指针自动增加 
void LcmWriteByte(unsigned char c) 
{ 
	B_BL = c; 
	B_CL = 0xC0; 
	LCM11(); 
} 
 
/* 
//设置CGRAM首址,字符发生器的地址 
void SetCGRAMAddr(unsigned int addr) 
{ 
} 
//设置文本区首地址 
void SetTextAddr(unsigned int addr) 
{ 
} 
//设置图形区首地址 
void SetGraphicAddr(unsigned int addr) 
{ 
} 
*/ 
 
void LcmInit() 
{ 
	//隐藏光标 
	cCursorX = 127; 
	cCursorY = 31; 
	ShowCursor(); 
 
	//设置CGRAM首址,0x3400 
	B_AL = 0x6; 
	B_BL = 0; 
	B_CL = 0x22; 
	LCM1(); 
 
	//设置文本区首地址,0x1000 
	B_AL = 0x00; 
	B_BL = 0x10; 
	B_CL = 0x40; 
	LCM1(); 
 
	//设置文本区宽度 
	B_AL = 0x20; 
	B_BL = 0; 
	B_CL = 0x41; 
	LCM1(); 
 
	//设置图形区首地址,0x0000 
	B_AL = 0; 
	B_BL = 0; 
	B_CL = 0x42; 
	LCM1(); 
 
	//设置图形区宽度 
	B_AL = 0x20; 
	B_BL = 0; 
	B_CL = 0x43; 
	LCM1(); 
 
	//邋设置文本区与图形区“或”操作 
	B_CL = 0x80; 
	LCM12(); 
 
	//使能光标、文本、图形显示 
	B_CL = 0x9F; 
	LCM12(); 
 
	//设置光标形状 
	B_CL = 0xA7; 
	LCM12(); 
 
} 
 
//画水平线 
void LineHorizontal(unsigned char x1,unsigned char x2,unsigned char y) 
{ 
	char head; 
	unsigned char n; 
	unsigned char c; 
 
	SetLcmAddr( x1>>3, y,0); 
 
	head = x1%8; 
	n = x2 - x1; 
 
	if(n >= 8) 
	{ 
            if(head) 
            { 
		c = (1<<(8-head)) - 1; 
		LcmWriteByte(c); 
		n -= 8-head; 
            } 
 
		while(n >= 8) 
		{ 
			LcmWriteByte(0xff); 
			n -= 8; 
		} 
	} 
 
	if(n > 0) 
	{ 
		c = 256 - (1 << (8-n)); 
		LcmWriteByte(c); 
	} 
} 
 
//清除一条水平线 
void ClearLineHorizontal(unsigned char x1,unsigned char x2,unsigned char y) 
{ 
	char head; 
	unsigned char n; 
 
	SetLcmAddr( x1>>3, y,0); 
 
	head = x1%8; 
	n = x2 - x1; 
 
	if(n >= 8) 
	{ 
            if(head) 
            { 
			LcmWriteByte(0); 
			n -= 8-head; 
            } 
 
		while(n >= 8) 
		{ 
			LcmWriteByte(0); 
			n -= 8; 
		} 
	} 
 
	if(n > 0) 
	{ 
		LcmWriteByte(0); 
	} 
} 
 
//画竖直线 
void LineVertical(unsigned char x,unsigned char y1,unsigned char y2) 
{ 
	unsigned char c; 
 
	c = (unsigned char)0x80 >> (x%8); 
 
	while(y1<=y2) 
	{ 
		SetLcmAddr(x>>3, y1, 0); 
		LcmWriteByte(c); 
 
		y1++; 
	} 
} 
 
//画矩形,需要知道左上角坐标与矩形的宽高 
void DrawRect(unsigned char x,unsigned char y,unsigned char width,unsigned char height) 
{ 
	LineVertical(x, y, y+height); 
	LineVertical( x+width,y, y+height); 
	LineHorizontal(x, x+width, y); 
	LineHorizontal(x, x+width, y+height); 
 
} 
 
//清除一个矩形区域 
void ClearRect(unsigned char x,unsigned char y,unsigned char width,unsigned char height,char TxtArea) 
{ 
	while(height--) 
	{ 
		ClearLineHorizontal(x, x+width,y++); 
	} 
} 
 
void ClearScreen() 
{ 
	LcmInit(); 
	CLR_LCMRAM(); 
}