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

📄 mylcd.c

📁 TI5509A-DSP-192*64液晶显示驱动
💻 C
字号:
/*****************************************************************************
  Filename:	    native.c
  Version:	    0.01
  Description:  calculate  measure  value
  Returns:     result
  Revision History:	 
  EQH-01,  屈宵军  09/25/04, - Original release
*****************************************************************************/
/*写汉字液晶子程 液晶屏分为4行*12列汉字,全部使用模拟接口方式。*/
#include<math.h>
#include<tms320.h>
#include "LCD.h"
/********************************/
/* 演示主程序			*/
/********************************/
void Lcd_Driver(void)
    
{ 
   // uint x; 
	col=0;
	row=0;
	Delay(40);			/*延时大约40Ms,等待外设准备好	*/
	Lcminit();			/*液晶模块初始化,包括全屏幕清屏*/
	Putstr(STR2,24);	/*第一行字符输出,24字节	*/
	
}
/****************************************/
/*	一个字串的输出			*/
/****************************************/
void Putstr(char *puts,uint i)
	{
		uint j,X;
		for (j=0;j<i;j++)
		{
		X = puts[j];
			if (X&0x80)
				{
					Putcdot(X&0x7f);	/*只保留低7位*/
				}
			else Putedot(X-0x20);		/*ascii码表从0x20开始*/
		}
	}

/****************************************/
/*   半角字符点阵码数据输出		*/
/****************************************/
void Putedot(uint Order)
	{
	uint i,bakerx,bakery;	/*共定义4个局部变量			*/
	int x;		        	/*偏移量,字符量少的可以定义为uint	*/
	bakerx = col;    		/*暂存x,y坐标,已备下半个字符使用	*/
	bakery = row;
	x=Order * 0x10;	    	/*半角字符,每个字符16字节	*/
/*上半个字符输出,8列	*/
	for(i=0;i<8;i++)
		{
		cbyte = Ezk[x];				/*取点阵码,rom数组	*/
		Wrdata(cbyte);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row++;row++;};	/*下一列,如果列越界换行*/
			if (row>7) row=0;		/*如果行越界,返回首行	*/
		}					/*上半个字符输出结束	*/

	col = bakerx;					/*列对齐		*/
	row = bakery+1;					/*指向下半个字符行	*/
/*下半个字符输出,8列	*/
	for(i=0;i<8;i++)
		{
		cbyte = Ezk[x];				/*取点阵码		*/
		Wrdata(cbyte);				/*写输出一字节		*/
		x++;
		col++;
		if (col==LCMLIMIT){col=0;row=row+2;};	/*下一列,如果列越界换行*/
			if (row>7) row=1;		/*如果行越界,返回首行	*/
		}					/*下半个字符输出结束	*/
	row=bakery;
	}						/*整个字符输出结束	*/

/****************************************/
/*	清屏,全屏幕清零		*/
/****************************************/
void Lcmcls( void )
	{
	for(row=0;row<8;row++)
   		for(col=0;col<LCMLIMIT;col++) Wrdata(0);
	}
void Wrdata(uint X)
	{
	Locatexy();		/*坐标定位,返回时保留分区状态不变	*/
//	wtcom();
	    *str_port= (*str_port)|DIlcd_1;	/*数据输出*/
		*str_port= (*str_port)&RWlcd_0;	/*写输出  */
		*str_data= X;	/*数据输出到数据口 */
		*str_port=(*str_port)|Elcd_1;	/*读入到LCM*/
	//	_nop_();
		*str_port=(*str_port)&Elcd_0;
	}
/********************************/
/* 命令输出到左区控制口		*/
/********************************/

void WrcmdL(uint X)
	{
	     lcdbusyL();	            /*确定分区,返回时保留分区状态不变*/
		*str_port= (*str_port)&DIlcd_0;			/*命令操作	*/
		*str_port= (*str_port)&RWlcd_0;			/*写输出  	*/
		*str_data= X;	    /*数据输出到数据口 */
		*str_port=(*str_port)|Elcd_1;
		*str_port=(*str_port)&Elcd_0;	        /*读入到LCM*/
	}

/********************************/
/* 命令输出到中区控制口		*/
/********************************/

void WrcmdM(uint X)
	{
		lcdbusyM();		/*确定分区,返回时保留分区状态不变*/
		*str_port= (*str_port)&DIlcd_0;			/*命令操作	*/
		*str_port= (*str_port)&RWlcd_0;			/*写输出  	*/
		*str_data= X;			/*命令输出到数据口 */
		*str_port=(*str_port)|Elcd_1;//_nop_();
		*str_port=(*str_port)&Elcd_0;	/*读入到LCM*/
	}

/********************************/
/* 命令输出到右区控制口		*/
/********************************/

void WrcmdR(uint X)
	{
		lcdbusyR();	/*确定分区,返回时保留分区状态不变	*/
		*str_port= (*str_port)&DIlcd_0;			/*命令操作	*/
		*str_port= (*str_port)&RWlcd_0;			/*写输出  	*/
		*str_data= X;			/*命令输出到数据口 */
		*str_port=(*str_port)|Elcd_1;//_nop_();
		*str_port=(*str_port)&Elcd_0;	/*读入到LCM*/
	}
/********************************************************/
/* 分区操作允许等待,返回时保留分区选择状态		*/
/********************************************************/
void lcdbusyL(void)
	{
        *str_port=(*str_port)|CS1_1;		/*CLR	CS1		*/
        *str_port=(*str_port)&CS2_0;		/*SETB	CS2		*/
        *str_port=(*str_port)&CS3_0;
        //CS3LCM = 1;		/*SETB	CS3		*/
	wtcom();		/* waitting for enable	*/
	}

void lcdbusyM(void)
	{
        *str_port=(*str_port)|CS1_1;		/*SETB	CS1		*/
        *str_port=(*str_port)&CS2_0;
        *str_port=(*str_port)|CS3_1;		/*CLR	CS2		*/
        //CS3LCM = 1;		/*SETB	CS3		*/
	wtcom();		/* waitting for enable	*/
	}

void lcdbusyR(void)
	{
        *str_port=(*str_port)|CS1_1;		/*SETB	CS1		*/
        *str_port=(*str_port)|CS2_1;
        *str_port=(*str_port)&CS3_0;		/*SETB	CS2		*/
        //CS3LCM = 0;		/*CLR	CS3		*/
	wtcom();		/* waitting for enable	*/
	}
void wtcom(void)
	{
 	*str_port= (*str_port)&DIlcd_0;		     /*CLR	DI		*/
	*str_port= (*str_port)|RWlcd_1;		     /*SETB	RW		*/
    *str_data= 0xFF;	 /*MOV	DATA_LCM,#0FFH  */
	*str_port=(*str_port)|Elcd_1;//_nop_();		
    while(*str_data& Lcdbusy);
    *str_port=(*str_port)&Elcd_0;
	}

/********************************************************/
/*根据设定的坐标数据,定位LCM上的下一个操作单元位置	*/
/********************************************************/
void Locatexy(void)
	{
	unsigned char  x,y;
	switch (col&0xc0)		/*  col.and.0xC0	*/
		{			/*条件分支执行		*/
		case 0:		{lcdbusyL();break;}	/*左区	*/
		case 0x40:	{lcdbusyM();break;}	/*中区	*/
		case 0x80:	{lcdbusyR();break;}	/*右区	*/
		}
	x = col&0x3F|SETX;		/*  col.and.0x3f.or.setx=0x40	*/
	y = row&0x07|SETY; 		/*  row.and.0x07.or.sety=b8	*/
		wtcom();		/*  waitting for enable		*/
		*str_port= (*str_port)&DIlcd_0;			/*CLR	DI	*/
		*str_port= (*str_port)&RWlcd_0;			/*CLR	RW	*/
		*str_data= y;			/*MOV	P0,Y	*/
		*str_port=(*str_port)|Elcd_1;//_nop_();
		*str_port=(*str_port)&Elcd_0;
		wtcom();		/*  waitting for enable		*/
		*str_port= (*str_port)&DIlcd_0;			/*CLR	DI	*/
		*str_port= (*str_port)&RWlcd_0;			/*CLR	RW	*/
		*str_data= x;			/*MOV	P0,X	*/
		*str_port=(*str_port)|Elcd_1;//_nop_();
		*str_port=(*str_port)&Elcd_0;
	}
/********************************/
/*液晶屏初始化			*/
/********************************/

void Lcminit(void)
	{
		cbyte = DISPOFF;	/*关闭显示屏	*/
		WrcmdL(cbyte);      /*左区*/
		WrcmdM(cbyte);      /*中区*/
		WrcmdR(cbyte);      /*右区*/
		cbyte = DISPON;		/*打开显示屏	*/
		WrcmdL(cbyte);      /*左区*/
		WrcmdM(cbyte);      /*中区*/
		WrcmdR(cbyte);      /*右区*/
		cbyte = DISPFIRST;	/*定义显示起始行为零	*/
		WrcmdL(cbyte);
		WrcmdM(cbyte);
		WrcmdR(cbyte);
		Lcmcls();
		col=0;		/*清屏		*/
		row=0;
		Locatexy();
	}
/********************************/
/* 延时				*/
/********************************/
void Delay(uint MS)
	{
		uint us,usn;
		while(MS!=0)
			{ usn = 4;
				while(usn!=0)
					{
						us=0xf0;
						while (us!=0){us--;};
						usn--;
					}
				MS--;
			}
	}
/****************************************/
/*  从液晶片上读数据,保留在全局变量中	*/
/****************************************/

void Rddata(void)
	{
	Locatexy();		/*坐标定位,返回时保留分区状态不变	*/
 		*str_data=0xFF;
		*str_port= (*str_port)|DIlcd_1;	/*数据*/
		*str_port= (*str_port)|RWlcd_1;	/*读数据*/
		*str_port=(*str_port)|Elcd_1;	/*读入到LCM*/
	//	_nop_();
		cbyte = *str_data;	/*虚读一次 */
		*str_port=(*str_port)&Elcd_0;
	Locatexy();		/*坐标定位,返回时保留分区状态不变	*/
		*str_data=0xFF;
	//	_nop_();
		*str_port= (*str_port)|DIlcd_1;	/*数据*/
		*str_port= (*str_port)|RWlcd_1;	/*读数据*/
		*str_port=(*str_port)|Elcd_1;	/*读入到LCM*/
	//	_nop_();
		cbyte = *str_data;	/*从数据口读数据,真读 */
		*str_port=(*str_port)&Elcd_0;
	}			

⌨️ 快捷键说明

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