📄 lcmdrv.c
字号:
/****************************************************************************
* 文件名: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 + -