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

📄 lcm320240-function.c

📁 51单片机驱动青云创新的LCM3202403的源码
💻 C
字号:
#include"LCM3202403.h"

   
/* ------------------初始化子程序------------------------*/
void LCM_initial(void)
{
    wrcmd(SystemSet);//系统设置
	wrdata(0x30);//8*8                     1
    wrdata(0x87);//8                       2
    wrdata(0x07);//8                       3
    wrdata(0x27);//显示每行字节数40        4         
    wrdata(0x39);//设置显示频率			   5
    wrdata(0xef);//行数240                 6 
    wrdata(0x28);//一行占缓冲区字节数      7
    wrdata(0x00);
      	
	wrcmd(Scroll);//存储设置       
	wrdata(0x00); //                       1
    wrdata(0x00);//起始地址0000H           2
    wrdata(0xef);//240行                   3
    wrdata(0x00);//                        4                         
    wrdata(0x40);//起始地址4000H		   5
    wrdata(0xef);//240行				   6
    wrdata(0x00);//           			   7
    wrdata(0x80);//起始地址8000H		   8
    wrdata(0x00);//						   9
    wrdata(0x00);//起始地址0000H		   10
     
	wrcmd(HdotScr);//设置水平点位移
    wrdata(0x00); 	
	
	wrcmd(Ovlay);//第一层文本格式,三层或关系
    wrdata(0x00);

	wrcmd(CsrForm);//光标格式设置
	wrdata(0x07);//8*8
    wrdata(0x87);//block cursor

	wrcmd(DispOn);//显示屏开
	wrdata(0x16);//一区开不闪,二区开不闪,光标闪烁
	  
}


/* ------------------图形写入子程序--------------------------*/
void LCM_picture(uint x, uint y, uint width, uint height, uchar *p)  //write a dot on the 2nd layer
{
	uchar i, j;
	uint addr;
	addr = 0x4000 + x + y*AP;
	if(width % 8 == 0)
		width = width / 8;		//点阵对应到每行占用的字节数
	else
		width = (width + 8) / 8;//不足一字节,按一字节算,取整
	for(i=0; i<height; i++)		//图形点阵,像素高度
	{	
		wrcmd(CsrW);			// 光标Locate,定位0x46
		wrdata(addr);			// 写入参数CSRL设置参数光标指针低8位
		wrdata(addr>>8);		// 写入参数CSRH设置参数光标指针高8位
		wrcmd(CsrDirR); 		// 光标移动方向定义:自动右移
		wrcmd(mWrite);			// 数据写入指令,代码0x42
		for(j=0; j<width; j++)
		{
			wrdata(*p++);		// 写入数据
		}							
		addr = addr + AP;		//按行写入数据,每行在内存中占用地址为AP,所以地址每次加AP			
	}			    
}


/* ------------------划线子程序--------------------------
void LCM_line(uint x1, uint y1, uint x2, uint y2)  //write a line on the 2nd layer
{												  
	int dalt_x, dalt_y, err = 0;
	if(y1>y2)
	{		
		SWAP(x1, x2);
		SWAP(y1, y2);
	}
	LCM_dot(x1, y1);
	dalt_x=x2-x1;
	dalt_y=y2-y1;
	if(dalt_x>=0)
	{
		if(dalt_y>dalt_x)
		{
			while(y1<y2)
			{
				if(err<0)
				{
					x1=x1+1;
					y1=y1+1;
					err=err+dalt_y-dalt_x;
				}
				else
				{
					y1=y1+1;
					err=err-dalt_x;
				}
				LCM_dot(x1, y1);
			}
		}
		else
		{
			if(dalt_y==0)
				y1=y1-1;
			while(x1<x2)
			{
				if(err<0)
				{
					x1=x1+1;
					err=err+dalt_y;
				}
				else
				{
					y1=y1+1;
					x1=x1+1;
					err=err+dalt_y-dalt_x;
				}
				LCM_dot(x1, y1);
			}
		}
	}
	else
	{
		dalt_x=x1-x2;
		if(dalt_y>dalt_x)
		{
			while(y1<y2)
			{
				if(err<0)
				{
					x1=x1-1;
					y1=y1+1;
					err=err+dalt_y-dalt_x;
				}
				else
				{
					y1=y1+1;
					err=err-dalt_x;
				}
				LCM_dot(x1, y1);
			}
		}
		else
		{
			if(dalt_y==0)
				y1=y1-1;
			while(x1>x2)
			{
				if(err<0)
				{
					x1=x1-1;
					err=err+dalt_y;
				}
				else
				{
					x1=x1-1;
					y1=y1+1;
					err=err+dalt_y-dalt_x;
				}
				LCM_dot(x1, y1);
			}
		}
	}
}*/


/* ------------------坐标点写入子程序--------------------------
void LCM_dot(uint x, uint y)  //write a dot on the 2nd layer
{
	uint addr;
	uchar addrh, addrl;
	uchar dotdata = 0x80, m;
	addr = 0x4000 + x/8 + y*AP;
	m = x%8;
	dotdata = dotdata >> m;
	addrl = addr;
	addrh = addr>>8;
	wrcmd(CsrDirR); 		// 光标移动方向定义:自动右移
	wrcmd(CsrW);			// 光标Locate,定位0x46
	wrdata(addrl);		    // 写入参数CSRL设置参数光标指针低8位
	wrdata(addrh);		    // 写入参数CSRH设置参数光标指针高8位
	wrcmd(mRead);		    // 读数据命令0x43
	m = rddata();
	m = m|dotdata;
	wrcmd(CsrDirR); 		// 光标移动方向定义:自动右移	
	wrcmd(CsrW);			// 光标Locate,定位0x46
	wrdata(addrl);			// 写入参数CSRL设置参数光标指针低8位
	wrdata(addrh);			// 写入参数CSRH设置参数光标指针高8位
	wrcmd( mWrite );		// 数据写入指令,代码0x42
	wrdata(m);			    // 写入数据
	wrcmd(CsrDirR);
}*/


/* ------------------汉字字符串写入子程序--------------------------*/
void LCM_gb(uint x, uint y, uchar n, uchar *p) 
{
	uint addr;
	uchar i, j;
	addr = 0x4000 + x + y*AP;	//第二显示区为图形属性,计算显示ram地址
	for(i=0; i<n*2; i++)		//16*16点阵,每个字占用32字节,一个字分两次写入
	{	
		wrcmd(CsrW);			// 光标Locate,定位0x46
		wrdata(addr);			// 写入参数CSRL设置参数光标指针低8位
		wrdata(addr>>8);		// 写入参数CSRH设置参数光标指针高8位
		wrcmd(CsrDirD); 		// 光标移动方向定义:自动下移
		wrcmd(mWrite);			// 数据写入指令,代码0x42
		for(j=0; j<16; j++)
		{
			wrdata(*(p + 2*j + 32*(i/2) + i%2));	// 写入数据,左半边为0,右半边为1
		}							// 先写左半部分,表内偶数部分,地址addr
		addr = addr + 1;			// 再写右半部分,表内奇数部分,地址addr+1,右移一字节
	}
	wrcmd(CsrDirR);
}


/* ------------------ASCII字符串写入子程序--------------------------*/
void LCM_ASC(uint x, uint y, uchar n, uchar *p)
{
	uint addr;
	uchar i, j;
	uint temp;
	addr = 0x4000 + x + y*AP;	//第二显示区为图形属性,计算显示ram地址
	for(i=0; i<n; i++)		    //8*16点阵,每个字占用16字节,一个字一次写入
	{	
		temp=*(p+i)-0x20;
		wrcmd(CsrW);			// 光标Locate,定位0x46
		wrdata(addr);			// 写入参数CSRL设置参数光标指针低8位
		wrdata(addr>>8);		// 写入参数CSRH设置参数光标指针高8位
		wrcmd(CsrDirD); 		// 光标移动方向定义:自动下移
		wrcmd(mWrite);			// 数据写入指令,代码0x42
		for(j=0; j<16; j++)
		{
			wrdata(ASC_MSK[temp*16+j]);// 写入数据,从上到下的顺序写入
		}							
		addr = addr + 1;			// 每次写入一个数据,地址addr+1,右移一字节的位置
	}
	wrcmd(CsrDirR);
}


/* ------------------ASCII字符串写入子程序--------------------------
void LCM_ascii(uint x, uint y, uchar *p) 
{
	uint addr;
	addr = x + y * AP;//第一显示区为文本属性,计算显示ram地址
	wrcmd(CsrW);				// 光标Locate,定位0x46
	wrdata(addr);				// 写入参数CSRL设置参数光标指针低8位
	wrdata(addr>>8);			// 写入参数CSRH设置参数光标指针高8位
	wrcmd(CsrDirR); 			// 光标移动方向定义:自动右移
	wrcmd(mWrite);			// 数据写入指令,代码0x42
	while(*p>0)	
	{
		wrdata(*p++);			// 写入数据0x00
	}
	wrcmd(CsrDirR);
}
*/

/* ------------------清屏子程序--------------------------*/
void Lcm_clear(void) 
{
	uint i=32768;
	wrcmd(CsrW );				// 光标Locate,定位
	wrdata(0);				// 写入参数CSRL设置参数光标指针低8位
	wrdata(0);				// 写入参数CSRH设置参数光标指针高8位
	wrcmd(CsrDirR); 			// 光标移动方向定义:自动右移
	wrcmd(mWrite);			// 数据写入指令,代码0x42
	while(i--)	
	{
		wrdata(0x00);			// 写入数据0x00
	}
}


/* -------------------全显示子程序-----------------------*/
void Lcm_on(void)
{ 
	uint i=32768;
	wrcmd(CsrW);				// 光标Locate,定位
	wrdata(0);				// 写入参数CSRL设置参数光标指针低8位
	wrdata(0);				// 写入参数CSRH设置参数光标指针高8位
	wrcmd(CsrDirR); 			// 光标移动方向定义:自动右移
	wrcmd(mWrite);			// 数据写入指令,代码0x42
	while(i--)	
	{
		wrdata(0xff);			// 写入数据0xff
	}
}


/* ---------------------读数据子程序-------------------
uchar rddata(void)
{
	uchar num = 0xff;
	a0=1;	
	cs_=0;	
	databus=0xff;
    _nop_();
	rd_=0; 
    _nop_();
	_nop_();	
	num=databus;
	_nop_();
	_nop_();  
	rd_=1;
	cs_=1;
	return num;	
}*/


/* ---------------------写数据子程序-------------------*/
void wrdata(uchar num)
{
	databus=0xff;
	a0=0;
	_nop_();
	databus=num;
	_nop_();
    _nop_();
	cs_=0;
	wr_=0; 
	_nop_();
    _nop_();
    wr_=1;
    cs_=1;
}


/* ---------------------写指令子程序-------------------*/
void wrcmd(uchar cmd)
{
	databus=0xff;
	a0=1;
	_nop_();
	databus=cmd;
	_nop_();
    _nop_();
	cs_=0;
	wr_=0;
	_nop_();
    _nop_();
    wr_=1;
    cs_=1;
}


/*----------------------延时子程序----------------------*/
void delay(ulong n)
{ 
	while(n--);
}

⌨️ 快捷键说明

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