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

📄 lcd240128.c

📁 内嵌T6963C240×128LCD显示驱动 可以显示ASCII码,直线/点.
💻 C
字号:
/************************************************
文件名:LCD240128.c
功  能:内嵌T6963C240×128LCD显示驱动
作  者:
日  期:2007-10-7 20:5:34
备  注:PA数据口 PC0-C/D PC1-RD PC3-WR
************************************************/
#include "include.h"

#define uchar unsigned char
#define uint unsigned int

uchar cctab[2][32]=
{
//1_老
	0x02,0x00,0x02,0x00,0x02,0x88,0x3F,0xD8,
	0x02,0x20,0x02,0x44,0xFF,0xFE,0x01,0x00,
	0x02,0x00,0x04,0x10,0x0C,0x30,0x14,0xC0,
	0x27,0x00,0x44,0x04,0x84,0x04,0x03,0xFC,
//2_婆
	0x20,0x20,0x1B,0xFE,0x4A,0x22,0x22,0x24,
	0x03,0xF8,0x12,0x88,0x22,0x50,0x64,0x20,
	0x28,0x50,0x22,0x8C,0xFF,0xFE,0x08,0x20,
	0x04,0x40,0x03,0x80,0x0C,0x60,0x30,0x10
};
/************************************************
函数名称:readstate(void)
函数功能:读取LCD状态字
输    入:无
输    出:返回状态字
备    注:
************************************************/
uchar readstate(void)
{
	uchar lcd_state; 
 	DDRA=0x00; 
  	DDRC|=(1<<0); 
  	DDRC|=(1<<1); 
  	PORTC|=(1<<0);   // C/D=1 
  	PORTC&=~(1<<1);   // /RD=0 
  	lcd_state=PINA&0xff;   // 读取引脚A物理电平 
  	asm("nop"); 
  	asm("nop"); 
  	PORTC|=(1<<1);   // /RD=1 
  	return lcd_state; 
}


/************************************************
函数名称:st01(void)
函数功能:判断指令(数据)读写状态 
输    入:无
输    出:无
备    注:
************************************************/
void st01(void)
{ 
  	while((readstate()&0x03)!=3);    
} 

/************************************************
函数名称:st02(void)
函数功能:判断数据自动读状态 
输    入:无
输    出:无
备    注:
************************************************/
void st02(void)
{ 
  	while((readstate()&0x04)!=4); 
} 

/************************************************
函数名称:st03(void)
函数功能:判断数据自动写状态 
输    入:无
输    出:无
备    注:
************************************************/
void st03(void)
{ 
  while((readstate()&0x08)!=8); 
}

/************************************************
函数名称:writecode(uchar comd0)
函数功能:指令写入函数 
输    入:指令
输    出:无
备    注:
************************************************/
void writecode(uchar comd0)
{ 
  	st01(); 
  	DDRA=0xff;   //A口方向为输出 
  	PORTA=comd0;   //送数据到A口寄存器 
  	DDRC|=(1<<3);    
  	PORTC&=~(1<<3);  // /WR=0 
  	asm("nop"); 
  	PORTC|=(1<<3);  // /WR=1 
} 

/************************************************
函数名称:writedata(uchar onedata)
函数功能:数据写入函数 
输    入:数据
输    出:无
备    注:
************************************************/
void writedata(uchar onedata)
{ 
  	st01(); 
  	DDRC|=(1<<0); 
  	PORTC&=~(1<<0);  // C/D=0,数据通道 
  	DDRA=0xff;   //A口方向为输出 
  	PORTA=onedata;  //送数据到A口寄存器 
  	DDRC|=(1<<3);    
  	PORTC&=~(1<<3);  // /WR=0 
  	asm("nop"); 
  	PORTC|=(1<<3);  // /WR=1  
} 

/************************************************
函数名称:writeauto(uchar onedata)
函数功能:数据自动写入函数 
输    入:数据
输    出:无
备    注:
************************************************/
void writeauto(uchar onedata)
{ 
  	st03(); 
  	DDRC|=(1<<0); 
  	PORTC&=~(1<<0);  // C/D=0,数据通道 
  	DDRA=0xff;   //A口方向为输出 
  	PORTA=onedata;  //送数据到A口寄存器 
  	DDRC|=(1<<3);    
  	PORTC&=~(1<<3);  // /WR=0 
  	asm("nop"); 
  	PORTC|=(1<<3);  // /WR=1  
} 

/************************************************
函数名称:oneparameter(uchar onep1,uchar comd1)
函数功能:一字节参数指令写入函数 
输    入:参数1 指令代码
输    出:无
备    注:
************************************************/
void oneparameter(uchar onep1,uchar comd1)
{ 
  	writedata(onep1); 
  	writecode(comd1); 
} 

/************************************************
函数名称:twoparameter(uchar twop1,uchar twop2,uchar comd2)
函数功能:两字节参数指令写入函数 
输    入:参数1 参数2 指令代码
输    出:无
备    注:
************************************************/
void twoparameter(uchar twop1,uchar twop2,uchar comd2)
{ 
  	writedata(twop1); 
  	writedata(twop2); 
  	writecode(comd2); 
} 

/************************************************
函数名称:lcd_init(void)
函数功能:内置T6963C控制器液晶初始化函数 
输    入:无
输    出:无
备    注:
************************************************/
void lcd_init(void)
{ 
  	twoparameter(0x00,0x00,0x40);  //文本显示区域首地址0x0000 
  	twoparameter(0x20,0x00,0x41);  //文本显示区域宽度32字节 
  	twoparameter(0x00,0x08,0x42);  //图形显示区域首地址0x0800 
  	twoparameter(0x20,0x00,0x43);  //图形显示区域宽度32字节 
  	writecode(0xa7);  //光标形状 
  	writecode(0x80);  //显示方式设置(使用内部CGROM,逻辑或合成) 
  	writecode(0x9c);  //显示开关(开文本和图形显示方式,禁止光标显示和闪烁) 
} 

/************************************************
函数名称:lcd_clear(void)
函数功能:清除屏幕(清所有8K存储空间) 
输    入:无
输    出:无
备    注:
************************************************/
void lcd_clear(void)
{  
  	uint cl_count; 
  	twoparameter(0x00,0x00,0x24);  //设置显示存储器首地址 
  	writecode(0xb0);  //设置自动写状态 
  	for(cl_count=8192;cl_count>0;cl_count--)
	{ 
    	writeauto(0x00); 
	}
  	writecode(0xb2);  //关闭自动写状态   
} 

/************************************************
函数名称:writeasc(uchar x_asc,uchar y_asc,uchar code_asc)
函数功能:西文字符写入函数
输    入:x坐标 y坐标 字符
输    出:无
备    注:
************************************************/
void writeasc(uchar x_asc,uchar y_asc,uchar code_asc)
{ 
  	uint address; 
  	address=y_asc*32+x_asc; 
  	twoparameter((uchar)(address),(uchar)(address>>8),0x24);  //设置显示存储器地址 
  	oneparameter(code_asc,0xc4);  //装入字符代码,写入数据,地址不变 
} 

/************************************************
函数名称:writestring(uchar x,uchar y,*point)
函数功能:字符串写入函数
输    入:x坐标 y坐标 字符串首地址
输    出:无
备    注:
************************************************/
void writestring(uchar x,uchar y,uchar *point)
{
	if(x>=30)	//对x地限制
	{
		x=29;
	}
	y=y&0x0f;	//对y地址限制
	while((*point)!='\0')
	{
		writeasc(x,y,*point-32);
		point++;	//指针地址加一
		x++;
		if(x>=30)	//换页控制
		{
			x=0;
			y++;
		}
		if(y==16)	//如果超出屏幕范围则退出
		{
			break;
		}
	}
}

/************************************************
函数名称:writehz(uchar x,uchar y,uchar hzpoint)
函数功能:汉字显示
输    入:x坐标 y坐标 汉字地址
输    出:无
备    注:
************************************************/
void writehz(uchar x,uchar y,uchar hzpoint)
{
	uchar i,k=0; 
  	uint address; 
  	address=y*32+x+0x0800;  //计算显示存储器地址  
  	for(i=0;i<16;i++)  //计数值16 
    { 
   		twoparameter((uchar)(address),(uchar)(address>>8),0x24);  //设置显示存储器地址 
   		oneparameter((cctab[hzpoint][k]),0xc0);  //写入汉字字模左部 
		k++;
   		oneparameter((cctab[hzpoint][k]),0xc0);  //写入汉字字模右部 
		k++;
   		address+=32;  //修改显示存储器地址,显示下一列(共16列) 
 	} 
}

/************************************************
函数名称:writepoint(uchar x,uchar y)
函数功能:显示一个点函数
输    入:x坐标 y坐标
输    出:无
备    注:
************************************************/
void writepoint(uchar x,uchar y)
{ 
  	uchar x_pt,y_pt; 
  	uint address; 
  	x_pt=x;   
  	y_pt=y; 
  	address=(y_pt&0x7f)*32+x_pt/8+0x0800;  //计算显示存储器地址 
  	twoparameter((uchar)(address),(uchar)(address>>8),0x24);  //设置显示存储器地址 
  	x_pt=(~(x_pt%8))&0x07; 		//计算位置
  	y_pt=((y_pt&0x80)>>4)|0xf0; //计算点亮或灭
  	writecode(x_pt|y_pt);  //写入数据 (位操作指令)
} 

/************************************************
函数名称:rectangle(uchar xstar,uchar xend,uchar ystar,uchar yend)
函数功能:显示矩形框
输    入:起始x坐标 结束x坐标 起始y坐标 结束y坐标
输    出:无
备    注:
************************************************/
void rectangle(uchar xstar,uchar xend,uchar ystar,uchar yend)
{ 
  	uchar i; 
  	ystar+=128;  //显示点 
  	yend+=128;   
  	for(i=xstar;i<=xend;i++)  //两水平线 
  	{ 
    	writepoint(i,ystar);   
    	writepoint(i,yend); 
  	} 
  	for(i=ystar;i<=yend;i++)  //两垂直线 
  	{ 
    	writepoint(xstar,i); 
 		writepoint(xend,i); 
  	} 
} 

/************************************************
函数名称:clrrect(uchar xstar,uchar xend,uchar ystar,uchar yend)
函数功能:擦除矩形框
输    入:起始x坐标 结束x坐标 起始y坐标 结束y坐标
输    出:无
备    注:
************************************************/
void clrrect(uchar xstar,uchar xend,uchar ystar,uchar yend)
{ 
  	uchar i;  
  	for(i=xstar;i<=xend;i++)  //两水平线 
  	{ 
    	writepoint(i,ystar);   
    	writepoint(i,yend); 
  	} 
  	for(i=ystar;i<=yend;i++)  //两垂直线 
  	{ 
    	writepoint(xstar,i); 
 		writepoint(xend,i); 
  	} 
} 

/************************************************
函数名称:writeline(uchar xstar,uchar ystar,uchar xend,uchar yend)
函数功能:画直线
输    入:起始x坐标 结束x坐标 起始y坐标 结束y坐标
输    出:无
备    注:
************************************************/
void writeline(uchar xstar,uchar ystar,uchar xend,uchar yend)
{
	uchar x,y;
	uchar d_x,d_y;
	uchar temp=0;
	signed char err=0;
	
	if(yend<ystar)
	{
		x=xstar;
		y=ystar;
		xstar=xend;
		ystar=yend;
		xend=x;
		yend=y;
	}

	d_y=yend-ystar;
	if(d_y==0)
	{
		if(xstar>xend)
		{
			x=xstar;
			xstar=xend;
			xend=x;
		}
		for(x=xstar;x<=xend;x++)
		{
			writepoint(x,(ystar+128));
		}
	}
	else
	{
		if(xend>=xstar)
		{
			temp=1;
			d_x=xend-xstar;
		}
		else
		{
			d_x=xstar-xend;
		}
		x=xstar;
		y=ystar;
		writepoint(x,(y+128));
		if(temp&&(d_y<=d_x))
		{
			while(x!=xend)
			{
				if(err<0)
				{
					x=x+1;
					err=err+(yend-y);
				}
				else
				{
					x=x+1;
					y=y+1;
					err=err+(yend-y)-(xend-x);
				}
				writepoint(x,(y+128));
			}
		}
		else if(temp&&(d_y>d_x))
		{
			while(y!=yend)
			{
				d_x=xend-x;
				d_y=yend-y;
				if(err<0)
				{
					x=x+1;
					y=y+1;
					err=err+d_y-d_x;
				}
				else
				{
					y=y+1;
					err=err-d_x;
				}
				writepoint(x,(y+128));
			}
		}
		else if(!temp&&(d_y<=d_x))
		{
			while(x!=xend)
			{
				d_x=x-xend;
				d_y=yend-y;
				if(err<0)
				{
					x=x-1;
					err=err+d_y;
				}
				else
				{
					x=x-1;
					y=y+1;
					err=err+d_y-d_x;
				}
				writepoint(x,(y+128));
			}
		}
		else if(!temp&&(d_y>d_x))
		{
			while(y!=yend)
			{
				d_x=x-xend;
				d_y=yend-y;
				if(err<0)
				{
					x=x-1;
					y=y+1;
					err=err+d_y-d_x;
				}
				else
				{
					y=y+1;
					err=err-d_x;
				}
				writepoint(x,(y+128));
			}
		}
	}
}

/************************************************
函数名称:clearline(uchar xstar,uchar xend,uchar ystar,uchar yend);
函数功能:擦除直线
输    入:起始x坐标 结束x坐标 起始y坐标 结束y坐标
输    出:无
备    注:
************************************************/
void clearline(uchar xstar,uchar xend,uchar ystar,uchar yend)
{
	uchar x,y;
	uchar d_x,d_y;
	uchar temp=0;
	signed char err=0;
	
	if(yend<ystar)
	{
		x=xstar;
		y=ystar;
		xstar=xend;
		ystar=yend;
		xend=x;
		yend=y;
	}

	d_y=yend-ystar;
	if(d_y==0)
	{
		if(xstar>xend)
		{
			x=xstar;
			xstar=xend;
			xend=x;
		}
		for(x=xstar;x<=xend;x++)
		{
			writepoint(x,ystar);
		}
	}
	else
	{
		if(xend>=xstar)
		{
			temp=1;
			d_x=xend-xstar;
		}
		else
		{
			d_x=xstar-xend;
		}
		x=xstar;
		y=ystar;
		writepoint(x,y);
		if(temp&&(d_y<=d_x))
		{
			while(x!=xend)
			{
				if(err<0)
				{
					x=x+1;
					err=err+(yend-y);
				}
				else
				{
					x=x+1;
					y=y+1;
					err=err+(yend-y)-(xend-x);
				}
				writepoint(x,y);
			}
		}
		else if(temp&&(d_y>d_x))
		{
			while(y!=yend)
			{
				d_x=xend-x;
				d_y=yend-y;
				if(err<0)
				{
					x=x+1;
					y=y+1;
					err=err+d_y-d_x;
				}
				else
				{
					y=y+1;
					err=err-d_x;
				}
				writepoint(x,y);
			}
		}
		else if(!temp&&(d_y<=d_x))
		{
			while(x!=xend)
			{
				d_x=x-xend;
				d_y=yend-y;
				if(err<0)
				{
					x=x-1;
					err=err+d_y;
				}
				else
				{
					x=x-1;
					y=y+1;
					err=err+d_y-d_x;
				}
				writepoint(x,y);
			}
		}
		else if(!temp&&(d_y>d_x))
		{
			while(y!=yend)
			{
				d_x=x-xend;
				d_y=yend-y;
				if(err<0)
				{
					x=x-1;
					y=y+1;
					err=err+d_y-d_x;
				}
				else
				{
					y=y+1;
					err=err-d_x;
				}
				writepoint(x,y);
			}
		}
	}
}

⌨️ 快捷键说明

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