图形液晶显示实验
一. 实验目的
了解图形液晶模块(单色)的控制方法,实现简单图形显示算法。
二. 实验设备及器件
IBM PC 机 一台
DP-51PROC 单片机综合仿真实验仪 一台
三. 实验内容
控制图形液晶模块显示ASCII 字符,画直线。
四. 实验要求
掌握字符/图形在图形液晶上显示的理论知识,并能够编写相关操作函数。
五. 实验步骤
1. 将A2 区的A0~A2 分别连接到B3 区的A0~A2。
2. 将A2 区的P10 连接到B3 区的RST。
3. 将A3 区的/Y0 连接到B3 区的/CS。
4. 将A2 区的A15~A10 分别连接到A3 区的相应接线柱,连接关系如下:
A15 --- /G2B
A14 --- /G2A
A13 --- G1
A12 --- C
A11 --- B
A10 --- A
5. 在B3 区的J92 插入图形液晶模块(单色,128×64 点)。
6. 将B3 区的JP21 短接,A3 区的JP4 短接。
7. 编写代码,使用TKSMonitor51 仿真器进行仿真调试。
六. 实验预习要求
阅读本书的2.8.9 节内容,理解本实验仪硬件结构,分析实验连线分配给LCM 的
地址,编写实验程序,编译连接后使用TKSMonitor51 仿真器进行仿真调试。
七. 实验参考程序
/*************************************************************
* 文件名:LCM_DRIVE.C
* 功能:图形液晶TG12864B-2 驱动程序。
* 说明:在LCM_DRIVE.H 文件中定义了LCM 操作地址,左半屏的写命令操作地址为
* 2004H,写数
*据操作地址为2005H,右半屏的写命令操作地址为2000H,写数据操作地址为2001H;
*于GRAPHICS.C 中使用了disp_buf 作为作图缓冲区,所以LCM_WriteByte()、LCM_
*DispFill()均要更新disp_buf。
*************************************************************/
#include "CONFIG.H"
/* LCM 复位控制脚定义 */
sbit LCM_RST = P1^0;
/*************************************************************
* 名称:LCM_Wr1Command()
* 功能:写命令子程序,所选屏为左半屏(CS1)。
* 入口参数:command 要写入LCM 的命令字
*************************************************************/
#define LCM_Wr1Command(command) LCMCS1W_COM = command
/*************************************************************
* 名称:LCM_Wr2Command()
* 功能:写命令子程序,所选屏为右半屏(CS2)。
* 入口参数:command 要写入LCM 的命令字
*************************************************************/
#define LCM_Wr2Command(command) LCMCS2W_COM = command
/*************************************************************
* 名称:LCM_Wr1Data()
* 功能:写数据子程序,所选屏为左半屏(CS1)。
* 入口参数:wrdata 要写入LCM 的数据
*************************************************************/
#define LCM_Wr1Data(wrdata) LCMCS1W_DAT = wrdata
/*************************************************************
* 名称:LCM_Wr2Data()
* 功能:写数据子程序,所选屏为右半屏(CS2)。
* 入口参数:wrdata 要写入LCM 的数据
*************************************************************/
#define LCM_Wr2Data(wrdata) LCMCS2W_DAT = wrdata
/*************************************************************
* 名称:LCM_DispIni()
* 功能:LCM 显示初始化。使能显示,设置显示起始行为0 并清屏。
* 入口参数:无
* 出口参数:无
*************************************************************/
void LCM_DispIni(void)
{ uint16 i;
LCM_RST = 0; // 复位驱动芯片
for(i=0; i<500; i++);
LCM_RST = 1;
LCM_Wr1Command(LCM_DISPON); // 打开显示
LCM_Wr1Command(LCM_STARTROW); // 设置显示起始行为0
LCM_Wr2Command(LCM_DISPON);
LCM_Wr2Command(LCM_STARTROW);
LCM_DispClr(); // 清屏
LCM_Wr1Command(LCM_ADDRSTRY+0); // 设置页(行)地址
LCM_Wr1Command(LCM_ADDRSTRX+0); // 设置列地址,即列
LCM_Wr2Command(LCM_ADDRSTRY+0);
LCM_Wr2Command(LCM_ADDRSTRX+0);
}
/*************************************************************
* 名称:LCM_WriteByte()
* 功能:向指定点写数据(一字节)。
* 入口参数:x x 坐标值(0-127)
* y y 坐标值(0-63)
* wrdata 所要写的数据
* 出口参数:无
* 说明:更新disp_buf 相应存储单元
*************************************************************/
void LCM_WriteByte(uint8 x, uint8 y, uint8 wrdata)
{ x = x&0x7f; // 参数过滤
y = y&0x3f;
y = y>>3;
disp_buf[y][x] = wrdata;
if(x<64) // 选择液晶控制芯片(即CS1--控制前64 个点,CS2--控制后64 个点)
{ LCM_Wr1Command(LCM_ADDRSTRX+x); // 设置当前列地址,即x 坐标
LCM_Wr1Command(LCM_ADDRSTRY+y); // 设置当前页地址,即y 坐标
for(x=0; x<5; x++); // 短延时
LCM_Wr1Data(wrdata);
}
else
{ x = x-64; // 调整x 变量值
LCM_Wr2Command(LCM_ADDRSTRX+x);
LCM_Wr2Command(LCM_ADDRSTRY+y);
for(x=0; x<5; x++);
LCM_Wr2Data(wrdata);
}
}
/*************************************************************
* 名称:LCM_DispFill()
* 功能:向显示屏填充数据
* 入口参数:filldata 要写入LCM 的填充数据
* 出口参数:无
* 说明:会更新disp_buf 相应存储单元
*************************************************************/
void LCM_DispFill(uint8 filldata)
{ uint8 x, y;
LCM_Wr1Command(LCM_STARTROW); // 设置显示起始行为0
LCM_Wr2Command(LCM_STARTROW);
for(y=0; y<8; y++)
{ LCM_Wr1Command(LCM_ADDRSTRY+y); // 设置页(行)地址
LCM_Wr1Command(LCM_ADDRSTRX); // 设置列地址
LCM_Wr2Command(LCM_ADDRSTRY+y);
LCM_Wr2Command(LCM_ADDRSTRX);
for(x=0; x<64; x++)
{ LCM_Wr1Data(filldata);
LCM_Wr2Data(filldata);
disp_buf[y][x] = filldata;
disp_buf[y][x+64] = filldata;
}
}
}
(ASCII 码显示函数及画直线函数见原文件)
/*************************************************************
* 文件名:LCM_DISP.C
* 功能:DP_51PRO 实验仪图形液晶显示实验。先在屏幕上的随机位置显示随机数字
* (0--9),然后调用画直线函数以屏幕中心为中点画对称的直线,最后显示一个简单的窗
* 口。
*************************************************************/
#include "CONFIG.H"
/*************************************************************
* 名称:DelayS()
* 功能:长软件延时。
* 入口参数:delayno 延时时间控制
*************************************************************/
void DelayS(uint16 delayno)
{ uint16 i;
for(; delayno>0; delayno--)
{ for(i=0; i<1000; i++);
}
}
/*************************************************************
* 名称:main()
* 功能:主函数,初始化图形液晶模块,在屏幕上的随机位置显示随机数字(0--9),
* 然后调用画直线函数以屏幕中心为中点画对称的直线,最后显示一个简单的窗口。
*************************************************************/
void main(void)
{ uint8 i;
uint8 bak;
while(1)
{ LCM_DispIni(); // 初始化图形液晶模块
/* 提示加载程序,即显示"Load..." */
LCM_DispStr(6, 3, "Load" );
for(i=0; i<5; i++)
{ LCM_DispChar(6, i+7, '.');
DelayS(10);
}
/* 数字显示演示 */
srand(168); // 初始化随机种子
LCM_DispClr();
for(i=0; i<250; i++)
{ uint8 x, y;
x = rand()&0x07; // 取得随机显示位置
y = rand()&0x0f;
bak = rand()%10 + '0'; // 取得随机显示数字'0'--'9'
LCM_DispChar(x, y, bak);
DelayS(2);
}
#define CENTER_X 64
#define CENTER_Y 32
/* 直线演示。由于直线要基于中心点,具有对称性,所以只要随机取出第一个点,
即可计算出总线对称点,两点便可确定一条直线。这样做达到不同直线不同角度
的目的。 */
LCM_DispClr();
for(i=0; i<250; i++)
{ uint8 x0, y0;
uint8 x1, y1;
/* 取第一个点坐标 */
x0 = rand()&0x7f; // 取得随机起点
y0 = rand()&0x3f;
/* 计算出中心对称点 */
x1 = 2*CENTER_X - x0;
y1 = 2*CENTER_Y - y0;
Line(x0, y0, x1, y1, 1);
DelayS(5);
}
/* 画窗口演示 */
LCM_DispClr();
Rectangle(0, 0, 127, 63, 1); // 显示窗口
HLine(0, 10, 127, 1);
RLine(10, 0, 10, 1);
Line(0, 0, 10, 10, 1);
Line(10, 0, 0, 10, 1);
RLine(120, 10, 63, 1); // 显示滚动条
RectangleFill(120, 20, 127, 30, 1);
LCM_DispStr(4, 4, "DP-51PROC" ); // 在窗口中显示内容
LCM_DispStr(5, 1, "www.zlgmcu.com" );
DelayS(1500);
} // end of while(1) ...
}
八. 实验思考题
(1) 如何进行汉字显示?
(提示:汉字是由固定点阵格式组成的图形,字模一般有16×16 和24×24 等)
(2) 如何实现动画显示?
(提示:不断循环操作--显示图像,短延时,擦除原图像,显示新图像……)
评论
查看更多