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

📄 lcmdrv.c

📁 在msp430f1611上实现的zlggui,lcm模块采用的是cm19264。
💻 C
📖 第 1 页 / 共 2 页
字号:
/****************************************************************************
* 文件名:LCMDRV.C
* 功能:MG19264图形液晶模块驱动程序。使用MSP430的GPIO口控制操作。
*       用于ZLG/GUI用户图形界面。
* MSP430的P2口表示数据,P6口输出命令
* 液晶模块与MSP430的连接如下所示:
*	D0  --		P2.0
*	.		--		.
*	.		--		.
*	.		--		.
*	D7 	        --		P2.7
*
*       CS1		--		P6.7
*	CS2		--		P6.5
*	cs3             --              P6.4
*       RST             --              P6.6
*	D/I		--		P6.2
*	R/W		--		P6.1
*	E		--		P6.0
*
*  R/W为0进行写操作,为1时进行读操作;
*  D/I为1表示数据传送, 为0表示命令传送;
*  E读写脉冲;
*  CS1和CS2为左右半屏选择,低电平选中;
*  RST为复位控制,低电平复位。
*  
*  作者:何志业
*  日期:2008/10/27
****************************************************************************/
#include<msp430x16x.h>
#include "..\ZLG_GUI\config.h"

#define lcd_set_di()   (P6OUT |= BIT2)                
#define lcd_set_rw()   (P6OUT |= BIT1)
#define lcd_set_e()    (P6OUT |= BIT0)
#define lcd_set_cs1()    (P6OUT |= BIT7)
#define lcd_set_cs2()    (P6OUT |= BIT5)
#define lcd_set_cs3()    (P6OUT |= BIT4)
#define lcd_set_RST()    (P6OUT |= BIT6)
#define lcd_clear_cs1()  (P6OUT &= ~BIT7)
#define lcd_clear_cs2()  (P6OUT &= ~BIT5)
#define lcd_clear_cs3()  (P6OUT &= ~BIT4)
#define lcd_clear_di()   (P6OUT &= ~BIT2)
#define lcd_clear_rw()   (P6OUT &= ~BIT1)
#define lcd_clear_e()    (P6OUT &= ~BIT0)
#define lcd_clear_RST()  (P6OUT &= ~BIT6)
#define lcd_busy        0x80                    //    BUSY位                 
#define lcd_read_status() (P2IN & lcd_busy)    //     判断BUSY位

/*选择左半部分*/
# define LCM_SELECT_LEFT()   P6DIR=0XFF;lcd_clear_cs1();lcd_set_cs2();lcd_set_cs3()
/*选择中间部分*/
# define LCM_SELECT_MIDDLE() P6DIR=0XFF;lcd_clear_cs2();lcd_set_cs1();lcd_set_cs3()
/*选择右半部分*/
# define LCM_SELECT_RIGHT()  P6DIR=0XFF;lcd_clear_cs3();lcd_set_cs1();lcd_set_cs2()
/*设置为命令输出*/
# define LCM_COM_OUT()       P6DIR=0XFF;lcd_clear_di();lcd_clear_rw()
/*设置为数据输出*/
# define LCM_DATA_OUT()      P6DIR=0XFF;lcd_set_di();lcd_clear_rw()
/*设置为数据输入*/
# define LCM_DATA_IN()       P6DIR=0XFF;lcd_set_di();lcd_set_rw()
/*检查状态*/
# define LCM_CHECK_STAT()    P6DIR=0XFF;lcd_clear_di();lcd_set_rw()
/*使能引脚*/
# define LCM_EN_1            P6DIR=0XFF;lcd_set_e()
/*使能取消*/
# define LCM_EN_0            P6DIR=0XFF;lcd_clear_e()
/*数据总线*/
# define LCM19264DATAPORT    P2OUT
/*数据总线方向*/
# define DATADPUT            P2DIR=0X0
/*数据总线方向*/
# define DATADOUT            P2DIR=0XFF


/* 定义显示缓冲区 */
TCOLOR  gui_disp_buf[GUI_LCM_XMAX][GUI_LCM_YMAX/8];

static const unsigned  char gu8LCMPtSet[8]=    /*设置点查询表*/
{
    0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80
};
static const unsigned  char gu8LCMPtClr[8]=   /*清除点查询表*/
{
    0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f
};

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

/***********************************************\
* *                 LCM_RESET
* *说明:复位
* *入口参数:无
* *出口参数:无
\************************************************/
static void LCM_RESET(void)
{
  int i;
  P6DIR=0XFF;
  lcd_clear_RST();
  for(i=0;i<10000;i++);
  lcd_set_RST();
}
/*********************************************************************************
* 名称:CheckState()
* 功能:检查输入状态。
* 入口参数:无
* 出口参数:无
**********************************************************************************/
static void CheckState(void)
{
   unsigned char temp;
   LCM_CHECK_STAT();    /*检查状态*/
   do
   {
   LCM_EN_1;
   DATADPUT;
   temp=P2IN;  /*读写使能为高电平时读取*/
   LCM_EN_0;
   temp=0x80 & temp;       /*判断忙标志*/
   }   
   while(temp!=0x00);/*一直读取LCD数据口直到数据端口不忙*/
}

/***********************************************************************
* 名称:LCM_WrCommand()
* 功能:写命令子程序
* 入口参数:command  	要写入LCM的命令字
* 注:数据口为P0口(作IO口)
***********************************************************************/
static void LCM_WrCommand(uint8 command) 
{ 
  CheckState();                  /*检查LCD状态*/
  LCM_COM_OUT();                 /*输出为命令*/
  DATADOUT;
  LCM19264DATAPORT=command;          /*输出命令*/
  LCM_EN_1;                      /*模拟总线使能信号*/
  LCM_EN_0;    
}

/***********************************************************************
* 名称:LCM_WrData()
* 功能:写数据子程序
* 入口参数:wrdata  	要写入LCM的数据
***********************************************************************/
static void LCM_WrData(uint8 wrdata) 
{  
  CheckState();                  /*检查LCD状态*/
  LCM_DATA_OUT();                /*设置输出内容为数据*/
  DATADOUT;
  LCM19264DATAPORT=wrdata;       /*输出数据*/
  LCM_EN_1;                      /*模拟总线使能信号*/
  LCM_EN_0;         
}

/************************************************\
* *      setOnOff
* * 说明:  设置显示开关
* *入口参数:0————关显示;————开显示
* *出口参数:无
\************************************************/
static void setOnOff( unsigned char onoff)  
{
  onoff &=0x3f;               /*参数过滤*/
  onoff |=0x3e;
  LCM_WrCommand(onoff);      /*写开关命令*/
}
/************************************************\
* *      setX
* * 说明:   设置X寄存器
* *入口参数:line行地址
* *出口参数:无
\************************************************/
static void setX( unsigned char line)  
{
  line &=0x07;              /*参数过滤,0<=line<=7*/
  line |=0xb8;
  LCM_WrCommand(line);      /*设置行寄存器*/
}
/************************************************\
* *      setY
* * 说明:   设置Y寄存器
* *入口参数:Y列地址
* *出口参数:无
\************************************************/
static void setY( unsigned char line)  
{
  line &=0x3F;               /*参数过滤,0<=column<=63*/
  line |=0x40;
  LCM_WrCommand(line);      /*设置行寄存器*/
}
/************************************************\
* *      setStartLine
* * 说明:   设置起始行
* *入口参数:setStartLine,从哪一行考试显示
* *出口参数:无
\************************************************/
static void setStartLine( unsigned char StartLine)  
{
   StartLine=StartLine & 0x07;      /*参数过滤,0<=StartLine<=7*/ 
   StartLine=StartLine | 0xc0;
   LCM_WrCommand(StartLine);      /*设置显示起始行*/
}
/***********************************************************************
* 名称:LCM_WriteByte()
* 功能:向指定点写数据(一字节)。
* 入口参数:x 		x坐标值(0-191)
*	    	y       y坐标值(0-63)
*           wrdata	所要写的数据
* 说明:会重新设置CS1/CS2/CS3,及其内部指针
***********************************************************************/
 void LCM_WriteByte(uint8 x, uint8 y, uint8 wrdata) 
{ 
  x = x&0xff;				// 参数过滤
  y = y&0x3f;
   
  // 更新LCD显示
  if(x<64)					// 选择液晶控制芯片(即CS1--控制前64个点,CS2--控制后64个点)
  { 
    LCM_SELECT_LEFT();  
  }
  else if(x<128)
  { 
    LCM_SELECT_MIDDLE();
  }
  else
  {
    LCM_SELECT_RIGHT();
  }
  LCM_WrCommand(LCM_ADDRSTRY+x%64);	// 设置当前列地址,即x坐标
  LCM_WrCommand(LCM_ADDRSTRX+y/8);	// 设置当前页地址,即y坐标

  LCM_WrData(wrdata);
}

/***********************************************************************
* 名称:LCM_ReadByte()
* 功能:读取指定点上的数据。
* 入口参数:x 	  x坐标值(0-192)
*	   	    y     y坐标值(0-63)
* 出口参数:返回该点上的字节数据。
***********************************************************************/
 uint8  LCM_ReadByte(uint8 x, uint8 y)

⌨️ 快捷键说明

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