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

📄 ts12864.c

📁 TS12864液晶驱动
💻 C
字号:
/*****************************************************************
 *	Copyright (C) 2008, 华中科技大学电工电子科技创新中心
 *	All Rights Reserved.
 *	
 *	文件名:		TS12864A-1图形点阵LCD驱动程序(C8051版)
 *	文件描述:	此版本专门用于《智能教学楼能源管理系统》的液晶驱动。
 *	资源占用:	8根数据线 5根控制线
 		
 *	当前版本:	1.0
 *	作者:		梁威魄(lwpo2008@yahoo.com.cn)
 *	完成日期:	2008年3月20日 星期四
 *****************************************************************/
 
/*****************************************************************
 *	头文件声明
 *****************************************************************/

 #include "TS12864.h"

/*****************************************************************
函数功能:对LCD的忙状态进行检测,对TS12864A-1来说不是必要
参数说明:空
******************************************************************/
void LcdBusy(void)
{
	unsigned char temp;
	temp=SFRPAGE;
	SFRPAGE= CONFIG_PAGE;

	data_ora=0xff;					//清除端口上数据
	p_rs=0;							//进入忙状态
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
	p_rw=1;							//进入检测忙状态
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
	p_e=1;	
	_nop_(); _nop_(); _nop_();_nop_(); _nop_(); 
	p_bf=1;
	_nop_(); _nop_(); _nop_(); _nop_(); _nop_(); 
	p_bf=p_res=1;
	while(p_bf||p_res==1);			//检测忙状态和复位状态
	p_e=0;
	_nop_(); _nop_();

	SFRPAGE=temp;
}

/*****************************************************************
函数功能:写数据。此函数所有写入液晶的函数均使用此函数。
参数说明:command:DATA时写数据,COMM时写指令;data_comm内容
******************************************************************/
void WriteLcd(unsigned command,unsigned data_comm)
{
	unsigned char temp;
	temp=SFRPAGE;
	SFRPAGE= CONFIG_PAGE;

	LcdBusy();				//检测忙命令
	p_rw=0;					//由于是写数据或者指令,所以RW为0;
	p_rs=command;			//给定写入命令,数据(DATA)或者指令(COMM)
	data_ora=data_comm;		//给写入内容
	p_e=1;					//给下降沿
	_nop_(); _nop_(); _nop_(); _nop_();
	_nop_(); _nop_(); _nop_(); _nop_();
	_nop_(); _nop_(); _nop_(); _nop_();
	p_e=0;					//锁存数据
	_nop_(); _nop_(); _nop_(); _nop_();
	_nop_(); _nop_(); _nop_(); _nop_();
	_nop_(); _nop_(); _nop_(); _nop_();

	SFRPAGE=temp;
}
/*****************************************************************
函数功能:读数据。此函数所有读取液晶的函数均使用此函数。
参数说明:返回值为8位无符号字符
******************************************************************/
/*unsigned char ReadLcd(void)
{
	unsigned char temp;
	temp=SFRPAGE;
	SFRPAGE= CONFIG_PAGE;

	unsigned char readData;
	LcdBusy ();
	p_rw=1;	_nop_(); _nop_(); _nop_(); _nop_();

	p_rs=1;	_nop_(); _nop_(); _nop_(); _nop_();

	p_e=1;
	_nop_(); _nop_(); _nop_(); _nop_();
	_nop_(); _nop_(); _nop_(); _nop_();
	_nop_(); _nop_(); _nop_(); _nop_();

	readData=data_ora;		//读取数据

	p_e=0;
	_nop_(); _nop_(); _nop_(); _nop_();
	_nop_(); _nop_(); _nop_(); _nop_();
	_nop_(); _nop_(); _nop_(); _nop_();

	SFRPAGE=temp;

	return readData;
}*/
/*****************************************************************
函数功能:设置x,y的位置。从此位置开始显示
参数说明:x(行,取值0~7),y(列,取值0~15)为定位坐标
******************************************************************/
void SetXY(unsigned char x,unsigned char y) 
{
	unsigned char temp;
	temp=SFRPAGE;
	SFRPAGE= CONFIG_PAGE;

	if (x>=64)				//如果显示列数超过液晶左半屏幕
	{						//支持的行数
		p_csa=0;			//则,
		p_csb=1;			//选择右半屏幕
	}
	else					//否则
 	{						//就
		p_csa=1;			//选择左半屏幕
		p_csb=0;
	}
	WriteLcd(COMM,LOCATION_X | x);	//设置x的位置

	WriteLcd(COMM,LOCATION_Y | y);	//设置y的位置

	data_ora=0xff;			//清除端口上的数据

	SFRPAGE=temp;
}

/*****************************************************************
函数功能:数据显示。
参数说明:x(行,取值0~127),y(列,取值0~7)为定位坐标。dd为显示点阵
******************************************************************/
void Display(unsigned char x,unsigned char y,unsigned char dd) 
{
	unsigned char temp;
	temp=SFRPAGE;
	SFRPAGE= CONFIG_PAGE;

	SetXY(x,y);					//设置显示位置
	WriteLcd(DATA,dd);			//写入数据
	data_ora=0xff;				//清除端口上的数据

	SFRPAGE=temp;
}

/*****************************************************************
函数功能:清屏幕
参数说明:LCD_CLEAR	0x00 涂白屏幕指令;LCD_BLACK	0xFF 涂黑屏幕指令
******************************************************************/
void ClearLcd(unsigned char state)
{
	unsigned char i,j;
	for(j=0;j<128;j++)					//进行列数选择
	{	
		for (i=0;i<8;i++) 			//进行行数选择
		{
			Display(j,i,state);		//将选择的点清除。
		}
  	}
}

/*****************************************************************
函数功能:画矩形,可以用来显示进度条
参数说明:x:y:矩形起始坐标;row:line:矩形结束坐标;state表示显示状态
******************************************************************/
/*void Rect(unsigned char x,unsigned char y,unsigned char row,unsigned char line,unsigned char state)
{
	unsigned char i,j;
	for(i=x;i<row;i++)
	{
		for(j=y;j<line;j++)
		{
			Display(i,j,state);
		}
	}
}*/
/*****************************************************************
函数功能:显示任意一点
参数说明:x:y:点阵坐标x:0~128;y:0~64
******************************************************************/
/*void ShowDot(unsigned char x,unsigned char y)
{
	unsigned char page,ram,dot=0x01;

	page=y/8;
	SetXY(x,page);
	y%=8;
	ram=ReadLcd();
	ram=ReadLcd();				//datasheet要求读两次

	while(y)
	{
		dot<<=1;
		y--;
	}
	ram ^=dot;
	Display(x,page,ram);
}*/
/*****************************************************************
函数功能:显示初始化.
参数说明:空
******************************************************************/
#pragma disable					//加入此命令,使LcdInit()执行时,禁止中断
void LcdInit(void) 
{
	p_reset=0;_nop_(); _nop_(); 
	p_reset=1;_nop_(); _nop_(); 
	p_csa=p_csb=1;				//左半边和右半边一起设定
	WriteLcd(COMM,LCD_ON);		//开显示
}
/*****************************************************************
函数功能:显示单个数字
参数说明:x,y:点阵坐标:x:0~15;y:0~3.
*****************************************************************/
void DisplayChar(unsigned char x,unsigned char y,unsigned char n,unsigned char state)
{
	unsigned char i;
	SetXY(8*x,2*y);
	if(state!=LCD_BLACK)
	{
		for(i=0;i<8;i++)
		{
			Display(8*x+i,2*y,asc[(n-32)*16+i]);
			Display(8*x+i,2*y+1,asc[(n-32)*16+i+8]);
		}
	}
	else
	{
		for(i=0;i<8;i++)
		{
			Display(8*x+i,2*y,255-asc[(n-32)*16+i]);
			Display(8*x+i,2*y+1,255-asc[(n-32)*16+i+8]);
		}
	}
}
/*************************************************
函数功能:整数变量转换成液晶显示程序
整数范围:-32768~+32767
参数:num:要显示的变量; y为行,x为列;均从0开始
显示形式:x指定的位置为该数最高位的位置,负号紧贴数字显示
*************************************************/
void DisplayInt(unsigned char x,unsigned char y,signed int num,unsigned char state)
{
	unsigned a[6];
	unsigned i=1,j;

	x-=2;
	if(num<0)
		{
			num=-num;
			a[0]='-';	//负号
		}
	else 
		a[0]=' ';		//什么都不显示

	a[1]=num/10000;num%=10000;
	a[2]=num/1000;num%=1000;
	a[3]=num/100;num%=100;
	a[4]=num/10;num%=10;
	a[5]=num;
	
	while(a[i]==0&&i<=5)++i;
	j=i-1;													//j为负号的位
	while(i<=5){DisplayChar(x+i,y,a[i]+48,state);++i;}
	if(j==5)DisplayChar(x+5,y,48,state);					//全0的情况
	if(a[0]=='-')DisplayChar(x+j,y,'-',state);	//负数的情况
}
/*****************************************************************
函数功能:提取单个汉字显示
参数说明:x:y:点阵坐标x:0~7;y:0~3。n第n个汉字
******************************************************************/
void DisplaySingleChinese(unsigned char x,unsigned char y,unsigned char n,
					unsigned char code *chArray,unsigned char state)
{
	unsigned char i;
	SetXY(16*x,2*y);
	if(state!=LCD_BLACK)
	{
		for(i=0;i<16;i++)
		{
			Display(16*x+i,2*y,chArray[n*32+i]);
			Display(16*x+i,2*y+1,chArray[n*32+i+16]);
		}
	}
	else
	{
		for(i=0;i<16;i++)
		{
			Display(16*x+i,2*y,255-chArray[n*32+i]);
			Display(16*x+i,2*y+1,255-chArray[n*32+i+16]);
		}
	}
}
/*****************************************************************
函数功能:显示汉字
参数说明:x:y:点阵坐标x:0~8;y:0~3。n:共n个汉字
******************************************************************/
void DisplayString(unsigned char x,unsigned char y,unsigned char n,
							unsigned char code *chArray,unsigned char state)
{
	unsigned char i;
	for(i=0;i<n;i++)
	{
		if(x>7)
		{
			if(y<3)
			{
				x=0;
				y++;
			}
		}
		DisplaySingleChinese(x,y,i,chArray,state);
		x++;
	}
}
/*****************************************************************
函数功能:延时
参数说明:传输输入参数。具体时间需计算所用晶振频率
******************************************************************/
void delayX10ms(unsigned char count)
{
	unsigned char i,j,k;
	for (i=0;i<count;i++)
	  for(j=0;j<50;j++)
	    for(k=0;k<80;k++);
}
/*****************************************************************
函数功能:翻屏
参数说明:time:翻屏时间
******************************************************************/
/*void RollScr(unsigned time)
{
	unsigned char i;
	p_csa=p_csb=1;					//左右两边一起选定
	for(i=0;i<64;i++)
	{
		WriteLcd(COMM,0xc0+i);		//设置起始行
		delayX10ms(time);			//延时
	}
	WriteLcd(COMM,0xc0);			//设置起始行	
}*/
/*****************************************************************
函数功能:显示图像
参数说明:*img指向图像数组;state用来取反图像颜色,一般不用。
******************************************************************/
void DisplayImage(unsigned char *img,unsigned char state)
{
	unsigned char i,j;

	if(state==0xFF)
	{

		for(j=0;j<128;j++)
		{
			for(i=0;i<8;i++)
			{
				delayX10ms(1);
				Display(j,i,255-img[i*128+j]);
			}
		}

	}
	else
	{

		for(j=0;j<128;j++)
		{
			for(i=0;i<8;i++)
			{
				Display(j,i,img[i*128+j]);
			}
		}

	}
}

⌨️ 快捷键说明

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