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