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

📄 lcd.cpp

📁 msp430的C++液晶(并行绿光12864)驱动。 (用msp430F247测试成功。)
💻 CPP
📖 第 1 页 / 共 2 页
字号:

/****************************************************************************************
* 文件名:LCD.cpp
* 功能:LCD驱动程序,包括底层驱动,刷新显示子程序。
* 说明:msp430_247
****************************************************************************************/

#ifndef __LCD_CPP
#define __LCD_CPP
#include "LCD.h"

LCD::LCD()
/***********************************************************************
* 名称:LCD()
* 功能:LCM显示初始化。
* 入口参数:	无
* 出口参数:无
* 说明:初始化显示后,清屏并设置显示起始行为0
*		会复位LCM_DISPCX,LCM_DISPCY.(并会只选中CS1)
***********************************************************************/
{
  	
        DCB2HEX_TAB[0] = 0x80;
        DCB2HEX_TAB[1] = 0x40;
        DCB2HEX_TAB[2] = 0x20;
        DCB2HEX_TAB[3] = 0x10;
        DCB2HEX_TAB[4] = 0x08;
        DCB2HEX_TAB[5] = 0x04;
        DCB2HEX_TAB[6] = 0x02;
        DCB2HEX_TAB[7] = 0x01;
        
        FronColor=0x01;
        BackColor=0x00;
        CurenRow=0;
        CurenLin=0;
        
        ZeroX=0;
        ZeroY=63;
 
        uchar 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();
	
	Wcmd(LCM_DISP_ON);			// 打开显示
	Wcmd(LCM_Y);				// 设置显示起始行为0
	Wcmd(LCM_PAGE);			// 设置起始页地址为0
	Wcmd(LCM_X);				// 设置起始列地址为0
        FillSCR(0x00);		// 初始化缓冲区为0x00,并输出屏幕(清屏)

}

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

void LCD::Wdata(uchar wrdat)
/***********************************************************************
* 名称:Wdata()
* 功能:写数据子程序
* 入口参数:wrdat  	要写入LCM的数据
* 出口参数:无
***********************************************************************/
{
	CLR_E();
	SET_DI();
	
	OutData(wrdat);
	
	Delay(10);
	SET_E();
	Delay(10);
	CLR_E();
	Delay(10);
}

void LCD::Wbyt(uchar x,uchar y,uchar wrdat)
/***********************************************************************
* 名称:Wbyt()
* 功能:向指定点写数据(一字节)
* 入口参数:wrdat  	要写入LCM的数据
*	    x		x座标值(0-127)
*	    y		y座标值(0-63)
* 出口参数:无
* 说明:会重新设置CS1/CS2,及其内部指针
***********************************************************************/
{
	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;
	}
	Wcmd(LCM_X+x);			//设置当前列地址,即x座标
	Wcmd(LCM_PAGE+y);		//设置当前页地址,即y座标
	Wdata(wrdat);
}

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

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

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

void LCD::Clc(void)
/****************************************************************************
* 名称:Clc()
* 功能:清屏。
* 入口参数:无
* 出口参数:无
* 说明:用户根据LCM的实际情况编写此函数。
****************************************************************************/
{
    FillSCR(0x00);				// 清屏
}

uchar const DEC_HEX_TAB[8] = {0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80};
uchar LCD::Point(uchar x, uchar y, TCOLOR color)
/***********************************************************************
* 名称:Point()
* 功能:在指定位置上画点.
* 入口参数:	x		指定点所在列的位置
*		y		指定点所在行的位置
*		color	        显示颜色(对于黑白LCM,为0时灭,为1时显示)
* 出口参数:返回值为1时,表示操作成功,为0时表示操作失败.
* 说明:操作失败原因是指定地址超出缓冲区范围.
***********************************************************************/
{  
   uchar bak;
   
    /* 参数过滤 */
   if(x>LCM_XMAX) 
   {
     PutStr(8,40,"Xov:");
     PutF(40,40,x);
     return(0);
   }
   if(y>LCM_YMAX) 
   {
     PutStr(8,40,"Yov:");
     PutF(40,40,y);
      return(0);
   }
   
   /* 设置相应的点为1或0 */
   bak = Rbyt(x,y);
   if(color==0)
   {
     bak &= (~DEC_HEX_TAB[(y&0x07)]);
   }
   else
   {
      bak |= DEC_HEX_TAB[(y&0x07)];
   }
   
  /* 刷新显示 */
   Wbyt(x,y,bak);
   return(1);
}

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

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

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

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

⌨️ 快捷键说明

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