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

📄 lcddrive.c

📁 msp430液晶(并行绿光12864)C驱动 用msp430F247成功测试
💻 C
字号:
/****************************************************************************************
* 文件名:LCMDRI.C
* 功能:图形液晶128*64驱动(型号为MG12864A)。
* 说明:图形液晶采KS0107为LCM控制芯片,内带负压产生器,单5伏供电,并行接口。
* 硬件连接: D0--D7 <===>  P4.0--P4.7
*            CS1    <===>  P5.2
*            CS2    <===>  P5.1
*            RST    <===>  P5.0
*            D/I    <===>  P5.5
*            E      <===>  P5.3
*            R/W    <===>  P5.4
****************************************************************************************/
#include "Includes.h"

TCOLOR  	gui_disp_buf[GUI_LCM_YMAX/8][GUI_LCM_XMAX];				// 声明GUI显示缓冲区

/* 输出总线数据宏定义 */
#define	 OutData(dat)		        P4OUT = dat

/* 定义CS1控制 */
#define	 SET_CS1()			P5OUT |= BIT2
#define	 CLR_CS1()			P5OUT &= ~BIT2

/* 定义CS2控制 */
#define	 SET_CS2()			P5OUT |= BIT1
#define	 CLR_CS2()			P5OUT &= ~BIT1

/* 定义RST控制 */
#define	 SET_RST()			P5OUT |= BIT0
#define	 CLR_RST()			P5OUT &= ~BIT0
	
/* 定义DI控制 */
#define	 SET_DI()			P5OUT |= BIT5
#define	 CLR_DI()			P5OUT &= ~BIT5

/* 定义E控制 */
#define	 SET_E()			P5OUT |= BIT3
#define	 CLR_E()			P5OUT &= ~BIT3

/* 定义E控制 */
#define	 SET_RW()			P5OUT |= BIT4
#define	 CLR_RW()			P5OUT &= ~BIT4

/* 定义LCM操作的命令字 */
#define	 LCM_DISP_ON		        0x3f			/* 打开LCM显示 */
#define	 LCM_PAGE			0xb8			/* 页起始行地址,可以用LCM_PAGE+X设置当前页。(X<8) */
#define	 LCM_Y				0xc0			/* 显示起始行0,可以用LCM_Y+Y设置起始行。(Y<64) */
#define	 LCM_X				0x40			/* 列起始行地址,可以用LCM_X+X设置当前列。(X<64) */

/***********************************************************************
* 名称:DELAY5()
* 功能:软件延时。
* 入口参数:无
* 出口参数:无
***********************************************************************/
void DELAY5(void)
{
	unsigned char i;
	for(i=0;i<10;i++);
}

/***********************************************************************
* 名称:LCM_WrCommand()
* 功能:写命令子程序
* 入口参数:command  	要写入LCM的命令字
* 出口参数:无
* 说明:函数会设置LCM数据总线为输出方式
***********************************************************************/
void LCM_WrCommand(unsigned char command)
{
        CLR_E();
	CLR_DI();
	
	OutData(command);
	
	DELAY5();
	SET_E();
	DELAY5();
	CLR_E();
	DELAY5();
}

/***********************************************************************
* 名称:LCM_WrData()
* 功能:写数据子程序
* 入口参数:wrdat  	要写入LCM的数据
* 出口参数:无
***********************************************************************/
void LCM_WrData(unsigned char wrdat)
{
	CLR_E();
	SET_DI();
	
	OutData(wrdat);
	
	DELAY5();
	SET_E();
	DELAY5();
	CLR_E();
	DELAY5();
}

/***********************************************************************
* 名称:LCM_Position()
* 功能:向指定点写数据(一字节)
* 入口参数:x		x座标值(0-127)
*	    y		y座标值(0-63)
* 出口参数:无
* 说明:会重新设置CS1/CS2,及其内部指针
***********************************************************************/
void LCM_Position(unsigned char x,unsigned char y)
{

}
/***********************************************************************
* 名称:LCM_WriteByte()
* 功能:向指定点写数据(一字节)
* 入口参数:wrdat  	要写入LCM的数据
*	    x		x座标值(0-127)
*	    y		y座标值(0-63)
* 出口参数:无
* 说明:会重新设置CS1/CS2,及其内部指针
***********************************************************************/
void LCM_WriteByte(unsigned char x,unsigned char y,unsigned char wrdat)
{
	x = x&0x7f;
	y = y&0x3f;
	
	CLR_CS1();
	CLR_CS2();
	
	y = y>>3;
        
	gui_disp_buf[y][x] = wrdat;
	if(x<64)
	{
		SET_CS1();
	}
	else
	{
		SET_CS2();
		x = x-64;
	}
	LCM_WrCommand(LCM_X+x);			//设置当前列地址,即x座标
	LCM_WrCommand(LCM_PAGE+y);		//设置当前页地址,即y座标
	LCM_WrData(wrdat);
}

/***********************************************************************
* 名称:LCM_ReadByte()
* 功能:读取指定点上的数据。
* 入口参数:	x	x坐标的值(0-127)
		y	y坐标的值(0-63)
* 出口参数:返回该点上的字节数据
***********************************************************************/
unsigned char  LCM_ReadByte(unsigned char x,unsigned char y)
{
    	x = x&0x7f;
	y = y&0x3f;
	
	y = y>>3;
        return(gui_disp_buf[y][x]);
}

/***********************************************************************
* 名称:LCM_DispFill()
* 功能:向显示缓冲区填充数据。
* 入口参数:	filldata	要写入LCM的填充数据
* 出口参数:此函数会设置显示起始行为0,且会自动选中CS1有效
***********************************************************************/
void LCM_DispFill(unsigned char filldata)
{
	unsigned char x,y;
	
	SET_CS1();			        //选中两个控制芯片
	SET_CS2();
	
	LCM_WrCommand(LCM_Y);			//设置显示起始行为0
	for(y=0;y<8;y++)
	{
		LCM_WrCommand(LCM_PAGE+y);	//设置当前页地址
		LCM_WrCommand(LCM_X);		//设置当前列地址
		for(x=0;x<64;x++)
		{
			LCM_WrData(filldata);
		}
	}
	CLR_CS2();
}

/***********************************************************************
* 名称:LCM_DispIni()
* 功能:LCM显示初始化。
* 入口参数:	无
* 出口参数:无
* 说明:初始化显示后,清屏并设置显示起始行为0
*		会复位LCM_DISPCX,LCM_DISPCY.(并会只选中CS1)
***********************************************************************/
void LCM_DispIni()
{
      unsigned char i;
	/* 设置引脚连接模块 */
        P5SEL = 0x00;
        P4SEL = 0x00;
        
        /* 设置I/O为输出方式 */
	P4DIR = 0x0ff;
        P5DIR = 0x0ff;
	
        /* 复位LCM */
	CLR_RST();
	for(i=0;i<250;i++);
	SET_RST();
	for(i=0;i<250;i++);
        
        /* 默认为写模式 */
        CLR_RW();
	
	SET_CS1();
	SET_CS2();
	
	LCM_WrCommand(LCM_DISP_ON);			// 打开显示

	LCM_WrCommand(LCM_Y);				// 设置显示起始行为0
	LCM_WrCommand(LCM_PAGE);			// 设置起始页地址为0
	LCM_WrCommand(LCM_X);				// 设置起始列地址为0
}

/***********************************************************************
* 名称:GUI_FillSCR()
* 功能:全屏填充.直接使用数据填充显示缓冲区.
* 入口参数:	dat
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数.
***********************************************************************/
void GUI_FillSCR(TCOLOR dat)
{
	unsigned char i,j;
	
	/* 填充缓冲区 */
	for(i=0;i<(GUI_LCM_YMAX/8);i++)
	{
                for(j=0;j<GUI_LCM_XMAX;j++)
		{
			gui_disp_buf[i][j] = dat;
		}
	}
	/* 填充LCM */
	LCM_DispFill(dat);
}

/****************************************************************************
* 名称:GUI_ClearSCR()
* 功能:清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
void  GUI_ClearSCR(void)
{
	GUI_FillSCR(0x00);				// 清屏
}
/***********************************************************************
* 名称:GUI_Initialize()
* 功能:初始化GUI,包括初始化显示缓冲区,初始化LCM并清屏.
* 入口参数: 无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数.
***********************************************************************/
void GUI_Initialize(void)
{
	LCM_DispIni();					// 初始化LCM模块工作模式,纯图形模式
	GUI_FillSCR(0x00);				// 初始化缓冲区为0x00,并输出屏幕(清屏)
}

unsigned char const DEC_HEX_TAB[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};

/***********************************************************************
* 名称:GUI_Point()
* 功能:在指定位置上画点.
* 入口参数:	x		指定点所在列的位置
*		y		指定点所在行的位置
*		color	        显示颜色(对于黑白LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时,表示操作成功,为0时表示操作失败.
* 说明:操作失败原因是指定地址超出缓冲区范围.
***********************************************************************/
unsigned char  GUI_Point(unsigned char x, unsigned char y, TCOLOR color)
{  
	unsigned char bak;

/* 参数过滤 */
   if(x>=GUI_LCM_XMAX) return(0);
   if(y>=GUI_LCM_YMAX) return(0);
   
/* 设置相应的点为1或0 */
   bak = LCM_ReadByte(x,y);
   if(color==0)
   {
   		bak &= (~DEC_HEX_TAB[(y&0x07)]);
   }
   else
   {
   		bak |= DEC_HEX_TAB[(y&0x07)];
   }
   
/* 刷新显示 */
   LCM_WriteByte(x,y,bak);
   return(1);
}

/****************************************************************************
* 名称:GUI_ReadPoint()
* 功能:读取指定点的颜色。
* 入口参数:x		指定点所在列的位置
*      	    y		指定点所在行的位置
*          ret		保存颜色值的指针
* 出口参数:返回0时表示指定地址超出有效范围。
* 说明:对于单色,设置ret的d0位为1或0,4级灰度则为d0、d1有效,8位RGB则d0--d7有效,
*      RGB结构则R、G、B变量有效。
****************************************************************************/
int  GUI_ReadPoint(unsigned char x, unsigned char y, TCOLOR *ret)
{  
    TCOLOR  bak;

   /* 参数过滤 */
   if(x>=GUI_LCM_XMAX) return(0);
   if(y>=GUI_LCM_YMAX) return(0);
  
   /* 取得该点颜色(用户自行更改) */ 
   bak =LCM_ReadByte(x,y);
   if( (bak&(DEC_HEX_TAB[(y&0x07)]))==0 ) *ret = 0x00;
      else  *ret = 0x01;
   
   return(1);
}

/****************************************************************************
* 名称:GUI_HLine()
* 功能:画水平线。
* 入口参数: x0		水平线起点所在列的位置
*           y0		水平线起点所在行的位置
*           x1          水平线终点所在列的位置
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_HLine(unsigned char x0, unsigned char y0, unsigned char x1, TCOLOR color) 
{ 
	unsigned char  bak;

   	if(x0>x1) 						// 对x0、x1大小进行排列,以便画图
   	{
   		bak = x1;
      	x1 = x0;
      	x0 = bak;
   	}
   
   	do
   	{
   		GUI_Point(x0,y0,color);
      	x0++;
   	}while(x1>x0);
}

/****************************************************************************
* 名称:GUI_RLine()
* 功能:画垂直线。
* 入口参数: x0		垂直线起点所在列的位置
*           y0		垂直线起点所在行的位置
*           y1          垂直线终点所在行的位置
*           color	显示颜色(对于黑白色LCM,为0时灭,为1时显示)
* 出口参数:无
* 说明:操作失败原因是指定地址超出缓冲区范围。
****************************************************************************/
void  GUI_RLine(unsigned char x0, unsigned char y0, unsigned char y1, TCOLOR color) 
{  
	unsigned char	bak;
	unsigned char	wr_dat;
	
	if(y0>y1)						//对y0,y1大小进行排列,以便画图
	{
		bak = y1;
		y1 = y0;
		y0 = bak;
	}

	do
	{
		/* 先读取当前点的字节数据 */
		
		bak = LCM_ReadByte(x0,y0);
  		/* 进行"与"/"或"操作后,将正确的数据写回LCM
   			若y0和y1不是同一字节,则y0--当前字节结束,即(y0+8)&0x38,全写1,或者0.
   			若y0和y1是同一字节,则y0--y1,要全写1,或者0.
   			方法:dat = 0xff,然后y0清零dat低位,按y1清零高位.*/
		if((y0>>3)!=(y1>>3))
		{
			wr_dat = 0xff<<(y0&0x07);			//清0低位
			if(color)
			{
				wr_dat = bak|wr_dat;			//若color不为0,则显示
			}
			else
			{
				wr_dat = ~wr_dat;
				wr_dat = bak&wr_dat;
			}
			LCM_WriteByte(x0,y0,wr_dat);
			y0 = (y0+8)&0x38;
		}   			
		else
		{
			wr_dat = 0xff<<(y0&0x07);
			wr_dat = wr_dat&(0xff>>(7-(y1&0x07)));
			if(color)
			{
				wr_dat = bak|wr_dat;			//若color不为0,则显示
			}
			else
			{
				wr_dat = ~wr_dat;				//若color为0,则清除显示
				wr_dat = bak&wr_dat;
			}
                        LCM_WriteByte(x0,y0,wr_dat);
           		return;
		}
    }while(y1>y0);
}

⌨️ 快捷键说明

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