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

📄 lcd.c

📁 在C196单片机上做的液晶驱动
💻 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();
}

⌨️ 快捷键说明

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