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

📄 lcd.c

📁 128X64点阵LCD驱动电路及源程序。可完成点、线、圆、英文字符、汉字显示。液晶驱动芯片为12864B,开发环境为KEIL C uVersion2。
💻 C
📖 第 1 页 / 共 5 页
字号:
从24LC256任意位置读出一个字节数据
HAdd-24LC256高7位地址
LAdd-24LC256低8位地址
******************************/
static uchar ReadByte(uchar HAdd,uchar LAdd)
{
	uchar x;
	start();
	WriteData(WTCMD);
	WriteData(HAdd);
	WriteData(LAdd);
	start();
	WriteData(RDCMD);
	x=ReadData();
	noack();
	stop();
	return x;
}



/*****************************
从LCD的RAM区域读出一个字节数据
CS1-为1表示选中左半屏
cs2-为1表示选中右半屏
page-表示选中的页数,范围0-7
column-表示选中的列数,范围0-64
******************************/
static uchar RLCDtoI2C(bit cs1,bit cs2,uchar tPage,uchar column)
{
	uchar rdat;
	write_command(cs1,cs2,0x0B8+tPage);
	nop();
	write_command(cs1,cs2,0x40+column);
	nop();
	read_data(cs1,cs2);
	nop();
	rdat = read_data(cs1,cs2);
	return rdat;
}

/*****************************
向24LC256任意位置写入一个字节数据
Add为整形的地址量
dat-写入的字节数据
******************************/
extern void WriteByteInt(uint Add,uchar dt)
{
		uchar HAdd,LAdd;
		LAdd = 0x0FF&Add;
		Add = Add>>8;
		HAdd = 0x0FF&Add;
		WriteByte(HAdd,LAdd,dt);
}

/*****************************
从24LC256任意页读入一页数据
Add为整形的地址量
******************************/
extern uchar ReadByteInt(uint Add)
{
		uchar dat;
		uchar HAdd,LAdd;
		LAdd = 0x0FF&Add;
		Add = Add>>8;
		HAdd = 0x0FF&Add;
		dat = ReadByte(HAdd,LAdd);
                return dat;
}

/*****************************
向LCD的RAM区域写入一个字节数据
CS1-为1表示选中左半屏
cs2-为1表示选中右半屏
page-表示选中的页数,范围0-7
column-表示选中的列数,范围0-64
******************************/
extern void WI2CToLCD(bit cs1,bit cs2,uchar page,uchar column,uchar sdat)
{
	write_command(cs1,cs2,0x0B8+page);
	nop();
	write_command(cs1,cs2,0x40+column);
	nop();
	write_data(cs1,cs2,sdat);
	nop();
}

/*****************************
把I2C中的数据写入LCD的RAM区域
page-读入I2C的页数,范围0-31,每页1KB
******************************/
extern void WriteToLCD(uchar page)
{
	uint Add=0;
	uchar j=0;
	uchar i=0;
	uchar dat=0;
	
	Add = 1024*page;
	for(j=0;j<8;j++)
	{
		for(i=0;i<64;i++)
		{
			dat = ReadByteInt(Add+512+i+j*64);
			WI2CToLCD(0,1,j,i,dat);	//读入的数据写入LCD左半屏
      Dyanshi(DTIME);
      nop();	
			dat = ReadByteInt(Add+i+j*64);
			WI2CToLCD(1,0,j,i,dat);	//读入的数据写入右半屏
      Dyanshi(DTIME);
      nop();		
		}
	}
}

/*****************************
从LCD的RAM区域写入I2C中
page-写入I2C的页数,范围0-31,每页1KB
******************************/
extern void WriteToI2C(uchar page)
{

	uchar dat=0;
	uchar ti=0;
	uchar dj=0;
	uint Add=0;

	Add=1024*page;	//简化Page*1024 = page<<10
	for(dj=0;dj<8;dj++)
	{
    for(ti=0;ti<64;ti++)
		{
			nop();
			dat = RLCDtoI2C(0,1,dj,ti);	//读左半屏
			WriteByteInt(Add+512+ti+dj*64,dat);//写入I2C中,j*64
      B_DrawLine(64+ti,dj*8,64+ti,(dj+1)*8-1,0);
      Dyanshi(DTIME);
      nop();
			nop();
			dat = RLCDtoI2C(1,0,dj,ti);	//读右半屏
			WriteByteInt(Add+ti+dj*64,dat);//写入I2C中,j<<6 = j*64
			B_DrawLine(ti,dj*3,ti,(dj+1)*8-1,0);
      Dyanshi(DTIME);
      nop();
 		}
	}
}

/*****************************
LCD初始化程序程序
******************************/
extern void init_lcd()
{
	write_command(0,1,0x0C0);	//set display 1st line
	write_command(1,0,0x0C0);

	write_command(0,1,0x3F); //open display setting
	write_command(1,0,0x3F);
}

/*****************************
绘点函数
x-表示点的X轴坐标
y-表示点的Y轴坐标
color-表示点的颜色
******************************/
extern void draw_pixel(uchar x,uchar y,bit color)
{
	bit cs1,cs2;
	uchar page,column,rdat,sdat,loc;
	if(x<64)
	{
		cs1 = 1;	//判断在哪个半屏内
		cs2 = 0;
		column = x;
	}
	else
	{
		cs1 = 0;
		cs2 = 1;
		column = x-64;
	}
	loc = y&0x07;
	page = y>>3;
  sdat = 1<<loc;
	write_command(cs1,cs2,0x0B8+page);
	write_command(cs1,cs2,0x40+column);
	if(color)
		{
			read_data(cs1,cs2);
			rdat = read_data(cs1,cs2);
			sdat = sdat|rdat;
		}
	else
		{
			read_data(cs1,cs2);
			rdat = read_data(cs1,cs2);
			sdat = (~sdat)&rdat;
		}
	write_command(cs1,cs2,0x0B8+page);
	write_command(cs1,cs2,0x40+column);
	write_data(cs1,cs2,sdat);
}
/*****************************
全屏显示或者全屏清除
color=1全屏显示,0全屏清除
******************************/
extern void full_display(bit color)
{
	uchar i;
	for(i=0;i<8;i++)
		set_row(i,0,127,color);
}

/*****************************
背光控制
uchCtr=0;关闭Off
uchCtr=1;打开On
uchCtr=2;延时关闭On Time
******************************/
extern void backlight(uchar uchCtr)
{
    uchCtr=0x00;//空**************************
}

/*****************************
向LCD写控制命令
CS1=1表示选中LCD的左半屏
CS2=1表示选中LCD的右半屏
command控制数据
******************************/
extern void write_command(bit CS1,bit CS2,uchar command)
{
	uchar da;
	CSA = CS1;
	CSB = CS2;
	RS = 0;
	RW = 1;
	do{
	P0 = 0x0FF;
	E = 1;
	da = P0;
	E = 0;
	da = da>>7;
	da &= 0x01;
	}while(da);	//busy or not
	P0 = command;
	RW = 0;
	E = 1;
	E = 0;
}

/*****************************
向LCD写显示数据
CS1=1表示选中LCD的左半屏
CS2=1表示选中LCD的右半屏
dat显示数据
******************************/
extern void write_data(bit CS1,bit CS2,uchar dat)
{
	uchar da;
	CSA = CS1;
	CSB = CS2;
	RS = 0;
	RW = 1;
	do{
	P0 = 0x0FF;
	E = 1;
	da = P0;
	E = 0;
	da = da>>7;
	da &= 0x01;
	}while(da);	//busy or not
	P0 = dat;
	RS = 1;
	RW = 0;
	E = 1;
	E = 0;
}

/*****************************
读LCD的RAM中的数据
CS1=1表示选中LCD的左半屏
CS2=1表示选中LCD的右半屏
******************************/
extern uchar read_data(bit CS1,bit CS2)
{
	uchar da;
	CSA = CS1;
	CSB = CS2;
	RS = 0;
	RW = 1;
	do{
	P0 = 0x0FF;
	E = 1;
	da = P0;
	E = 0;
	da = da>>7;
	da &= 0x01;
	}while(da);	//busy or not
	RS = 1;
	P0 = 0x0FF;
	E = 1;
	da = P0;
	E = 0;
	return da;
}



/*****************************
显示某一行或者清除某一行
row行值
color=显示行,0清除行
******************************/
extern void set_row(uchar row,uchar Scol,uchar Ecol,bit color)
{
	uchar i;
	uchar dat;
	if(color)
		dat = 0x0FF;
	else
		dat = 0x00;
	write_command(0,1,0x0B8+row);	//set page address
	write_command(1,0,0x0B8+row);

	if(Scol<64)
	{
		if(Ecol<64)
		{
			write_command(1,0,0x40+Scol);	//set column address
			for(i=0;i<(Ecol-Scol);i++)
			{
						write_data(1,0,dat);
			}
		}
		else
		{
			write_command(1,0,0x40+Scol);	//set column address
			write_command(0,1,0x40);
			for(i=0;i<(64-Scol);i++)
			{
						write_data(1,0,dat);
			}
			for(i=0;i<Ecol-63;i++)
			{
						write_data(0,1,dat);
			}
		}
	}
	else
	{
		write_command(0,1,0x40+Scol-63);
		for(i=0;i<(Ecol-Scol);i++)
		{
					write_data(0,1,dat);
		}
	}
}

/*
************************************************************
* 文件名: GDRW_API.C *
* 说明: 图形LCD扩展作图函数 *
*
* Copyright 2007 WUSE. ALL RIGHTS RESERVED. *
*
* 作者:张弛
* 时间:2007年3月12日
*************************************************************
*/
/*
**********************************************************************
函数名: B_DrawByte
参数: 点座标(Sx,Sy)范围(X=0-MaxHdots,Y=0-MaxVdots)
      ValByte要写入的数据
返回值: 无
作用: 用于在屏幕指定点间点
**********************************************************************
*/
extern void B_DrawByte(uchar Px, uchar Py, uchar ValByte)
{
	bit tcs1,tcs2;
	uchar tpage,tcolumn;
	if(Px<64)
	{
		tcs1 = 1;	//判断在哪个半屏内
		tcs2 = 0;
		tcolumn = Px;
	}
	else
	{

⌨️ 快捷键说明

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