LCD12864图形液晶并口显示2

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LCD12864图形液晶并口显示
【教学引入】
液晶屏,在生活中很常见,我们常见的液晶显示器,如电脑的显示器,电视机,手机等等。

液晶屏在生活中已得到了普遍应用,它显示个各种各样的画面。

上次呢,我们让12864显示了汉字,这次我们让它显示图形。

【教学目标】
1、掌握LCD12864液晶屏的绘图用法;
2、编写LCD12864液晶屏的指令代码;
【知识目标】
1、掌握LCD12864液晶屏的绘图用法;
2、掌握LCD12864液晶屏指令代码;
【教学准备】
电脑、Proteus、Keil、MCS-51系列单片机综合实验箱
【教学方法】
教法:讲授法、讨论法
学法:练习法、探究法
【教学课时】
四课时
【教学过程】
一、12864液晶介绍
12864液晶屏不仅能显示汉字,还能显示图形。

今天呢,我们就来看看液晶屏怎么显示图形的。

首先呢,我们看看显示坐标关系
1、图形显示坐标
水平方向X——以字节为单位
垂直方向Y——以位为单位
由图可知,水平方向为0~31,以位为单位;垂直方向为0~7、8~16,以2个字节为单位,分为上下两个块。

如下图
2、图片取模
有了图像显示的坐标,我们该把图片变成代码了,PCtoLCD2002不仅能取模汉字,还能取模图片。

字模软件PCtoLCD2002
双击图标打开软件可以看到下图所示的画面,此软件也是绿色软件打开后可以直接使用。

软件有两种工作模式:字符模式和图形模式;上图界面是字符模式。

可以通过菜单栏模式(C)切换工作模式。

我们选择图形模式,最大化,如下图。

单击工具栏中的图标按钮,看到如下图所示的对话框。

我们可以根据自己的实际需要而进行的设置,因其简单易用这里不再详细讲述其使用方法。

设置完成后,单击左下角的确定保存。

设置如下图
回到PCtoLCD2002完美版-(图形模式)界面,单击按钮,导入要显示的128X64的bmp图片,单击
图标按钮,可以看到软件下方的数据显示区域出现的对应的显示数据。

如下图
阅“12864M.PDF”12864M液晶显示模块技术手册——四、用户指令集
1、指令表2:(RE=1:扩充指令集),如下图,讲解了12864的扩充指令集。

当模块在接受指令前,微处理器必须先确认模块内部处于非忙碌状态,即读取BF标志时BF需为0。

“RE”为基本指令集与扩充指令集的选择控制位元,往后的指令集将维持在最后的状态。

当选择G=1 :绘图显示ON,绘图显示打开。

二、12864液晶屏驱动电路
所需原件清单
AT89C52的P0口连接12864的并行数据口,RP1为P0口的上拉排阻。

三、52代码编写
(1)打开keil uVision4,建立一个新的工程,工程名为"12864 graphic LCD parallel display",保存类
型*.uvproj,单片机型号AT89C52。

在工程中添加12864 graphic LCD parallel display.c文件,如下图
(2)代码编写
/*********************12864液晶显示***********************
*功能说明:将数组内的图像显示到12864上面
*******************************************************************/
#include<reg52.h> //52系列单片机头文件
#include<intrins.h>
#define uchar unsigned char // define 宏定义
#define uint unsigned int // define 宏定义
/*12864端口定义*/
#define LCD_data P0 //数据口
sbit LCD_RS = P1^0; //寄存器选择输入
sbit L CD_RW = P1^1; //液晶读/写控制
sbit L CD_EN = P2^5; //液晶使能控制
sbit L CD_PSB = P1^2; //串/并方式控制
/////////////////////////////////////////////////////////////////////////
// Bitmap点阵数据表//
// 图片: 兔斯基.bmp,横向取模左高位,数据排列:从左到右从上到下//
// 图片尺寸: 128 * 64 //
/////////////////////////////////////////////////////////////////////////
code uchar Photo[]= //数据表
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0F,0xE0,0x00,0x00,0x03,0xF0,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x1C,0x00,0x00,0x78,0x1E,0x1F,0xE0,0x0F,0xE0, 0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x0C,0x00,0x03,0x80,0x07,0x7F,0xFC,0x7F,0xF8,0x00,0x00, 0x00,0x00,0x00,0x06,0x00,0x1C,0x00,0x1C,0x00,0x07,0xFF,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00, 0x00,0x1C,0x00,0x38,0x00,0xE0,0x00,0x06,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x38,0 x00,0x70,0x01,0x80,0x00,0x0E,0xFF,0xFF,0xFF,0xFE,0x00,0x00,0x00,0x00,0x00,0x30,0x01,0xC0, 0x06,0x00,0x00,0x18,0x7F,0xFF,0xFF,0xFC,0x00,0x00,0x00,0x00,0x03,0xFF,0xFF,0x80,0x18,0x00,0 x00,0xE0,0x1F,0xFF,0xFF,0xF8,0x00,0x00,0x00,0x0F,0xFC,0x00,0x01,0xFF,0xF0,0x00,0x03,0x80,
0x0F,0xFF,0xFF,0xF0,0x00,0x00,0x03,0xF0,0x00,0x00,0x00,0x00,0x7E,0x00,0x1E,0x00,0x03,0xFF,0 xFF,0x80,0x00,0x00,0x7C,0x00,0x00,0x00,0x00,0x00,0x03,0xF1,0xF0,0x00,0x00,0x7F,0xFE,0x00, 0x00,0x07,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x0F,0xF0,0x00,0x00,0x3C, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0xC0,0x00,0x00,0x01,0x80,0x00,0x01,0xE0,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,
0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x01,0x80,0x00,0x00,0x00,0x01,0xC0,0x00,0x00,0x00,0x00,0x1F,0xFF,0xFF,0xE0,0x00,0x00,0xC0, 0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0xFF,0xF0,0x00,0x00,0x00,0x00,0x00,0x20,0x00,0x00, 0x00,0x07,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x1E ,
0x00,0x0F,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x00,0x00,0x00,0x1C,0x01,0xF0, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x08,0x00,0x00,0x00,0x38,0x1E,0x00,0x00,0x00 ,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x04,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,
,0x00,0x06,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 6,
0x00,0x07,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06,0x00,0x1E ,0x3C,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x1C,0x0E,0xE 0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0C,0x00,0x38,0x03,0xE0,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x18,0x01,0xE0,0x00,0x00,0x00,0x0 0,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x18,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x1C,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,
0x00,0x00,0x00,0xE0,0x00,0x0E,0x00,0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x03,0xC0,0x00,0x07,0x00,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x0 0,
0x00,0x01,0xC0,0x01,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00 ,0xE0,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x38,0x0 0,
0x1C,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x1E,0x00,0x03,0x80 ,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x3C,0x00,0x0 0,
0x00,0x00,0x00,0x00,0x07,0xCC,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x03,0xF8,0x00,0x00,0x00 ,0x00,0x00,0xF8,0x0C,0x00,0x00,0x00,0x00,0x00,0x38,0x00,0x00,0x07,0xF0,0x00,0x00,0x00,0x0 0,
0x00,0x04,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x06 ,0x00,0x00,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x02,0x00,0x0 0,
0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00,0x00,0x00,0x60,0x00,0x00,0x03,0x00,0x00,0x00,0x00 ,0x00,0x00,0xF1,0xE0,0x00,0x00,0x00,0x01,0xE0,0x00,0x00,0x01,0x00,0x00,0x00,0x00,0x00,0x0 7,
0x00,0x1F,0x80,0x00,0x00,0x1E,0x00,0x00,0x00,0x01,0x80,0x00,0x00,0x00,0x00,0x0C,0x00,0x01, 0xFF,0x80,0x07,0xE0,0x00,0x00,0x00,0x00,0x80,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x01,0xFF, 0xF8,0x00,0x00,0x00,0x00,0x00,0xC0,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x18,0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x07,0x80,0x00,0x00,0x00,0x00,0x00,0x03,0xE 0,
0x00,0x00,0x60,0x00,0x00,0x00,0x00,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0x00,0x00 ,0x30,0x00,0x00,0x00,0x00,0x00,0x1F,0x80,0x00,0x00,0x00,0x0F,0xC0,0x00,0x00,0x00,0x18,0x00 ,
0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x1F,0xF8,0x00,0x00,0x00,0x00,0x1C,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x7F,0xFF,0xFC,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x30,0x00,0x00,0x00,0x00,0x00,0x0E,0x00,0x00,0x00,0x00,0x00,0x00,0x00 ,0x00,0x00,0x18,0x00,0x00,0x00,0x00,0x00,0x07,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x0 0,
0x0C,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x07,0x00
0,
0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0x00,0x00,0x00,0x00 ,0x00,0xF0,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x70,0x00,0x00,0x00,0x00,0x00,0x7 8,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x10,0x00,0x00,0x00,0x00,0x00,0x18/*兔斯基.bmp",0*/
};
/*****************************************
* 毫秒级延时函数
******************************************/
void Delay_ms(uchar ms)
{
uchar i,j;
for(i=ms;i>0;i--)
for(j=112;j>0;j--);
}
/*****************************************
* 检测12864是否忙标志位
******************************************/
bit Check_12864_busy()
{
bit fgbusy; //忙标志位名称
LCD_RS=0; //命令选择
LCD_RW=1; //液晶读控制
LCD_EN=1; //使能开
_nop_(); //空指令
fgbusy=(bit)(LCD_data&0x80);//获取忙碌标志BF的值,BF=1忙
LCD_EN=0; //使能关
return fgbusy; //返回标志位数值,判断12864内部动作是否完成
}
/*****************************************
* 向12864写命令
******************************************/
void Write_12864_cmd(uchar cmd)
{
while(Check_12864_busy());//忙则一直等待
LCD_RS=0; //命令选择
LCD_RW=0; //液晶写控制
LCD_data=cmd; //发送命令
LCD_EN=1; //使能开
_nop_(); //空指令
_nop_();
LCD_EN=0; //使能关
}
/*****************************************
* 向12864写要显示的数据
******************************************/
void Write_12864_data(uchar dat)
{
while(Check_12864_busy()); //忙则一直等待
LCD_RS=1; //数据选择
LCD_RW=0; //液晶写控制
LCD_data=dat; //发送数据
LCD_EN=1; //使能开
_nop_(); //空指令
_nop_();
LCD_EN=0; //使能关
}
/*****************************************
* 12864初始化
******************************************/
void init_12864()
{
LCD_PSB=1; //8位并口方式
Write_12864_cmd(0x30); //扩充指令集设置:8位设置,RE=0:基本指令集设置,G=0:绘图显示OFF
Delay_ms(5);
Write_12864_cmd(0x30); //基本指令集设置:DL=1,RE=0基本指令集动作
Delay_ms(5);
Write_12864_cmd(0x0c); //显示状态开/关,D=1整体显示ON,C=B=0游标、游标位置关。

Delay_ms(5);
Write_12864_cmd(0x01); //清除显示
Delay_ms(5);
}
/*******************************************
函数功能:清除GCRom的内容,如果不清除会出现花屏现象
清除方法:向GCROM中写入0X00来清除内容
*********************************************/
void clear_gcrom()
{
uchar i,j;
uchar lcd_x=0x80,lcd_y=0x80;
Write_12864_cmd(0x34);//基本指令集设置:DL=1,RE=1扩充指令集动作
Write_12864_cmd(0x36);//RE=1,扩充指令集,G=1,绘图显示ON
for(i=0;i<32;i++) //将12864屏分成上下两屏写入
{
for(j=0;j<16;j++)
{
Write_12864_cmd(lcd_x+i); //垂直的元组坐标
Write_12864_cmd(lcd_y+j); //水平的坐标
Write_12864_data(0x00);
Write_12864_data(0x00);
_nop_(); //空指令
_nop_();
}
}
Write_12864_cmd(0x30);//Re=0,基本指令集,G=0绘图显示Off
}
/*********************
函数功能:向12864中写入一幅图片
函数参数:LCD_x为水平显示位置,lcd_y为垂直显示位置
函数将12864屏分成上下两屏写入,上半屏LCD_y=0x80,下半屏lcd_y=0x88
***********************************/
void display_graphic(uchar *p) //显示图形
{
uchar i,j,k=0;
uchar lcd_x=0x80,lcd_y=0x80;
Write_12864_cmd(0x34); //基本指令集设置:DL=1,RE=1扩充指令集动作
Write_12864_cmd(0x36); //RE=1,扩充指令集,G=1,绘图显示ON
for(k=0;k<2;k++) //将12864屏分成上下两屏写入
{
for(i=0;i<32;i++)
{
for(j=0;j<8;j++)
{
Write_12864_cmd(lcd_x+i); //垂直的元组坐标
Write_12864_cmd(lcd_y+j); //水平的坐标
Write_12864_data(*p++);
Write_12864_data(*p++); //12864处理指令需要时间
_nop_(); //空指令
_nop_(); //延时函数必须有,等待上调指令执行完,才能能发送下调指令
_nop_();
}
}
lcd_y=0x88;
}
Write_12864_cmd(0x30); //Re=0,基本指令集,G=0绘图显示Off
}
void main()
{
init_12864(); //调用12864初始化函数
clear_gcrom();
while(1)
{
display_graphic(Photo);
}
}
代码写好后,单击按钮,打开{Options for Target}对话框,点选{Target}选项卡,在{Xtal(MHz):}后面的框格里,填写"12.0",设置单片机的频率为12M,如下图
点选{Output}选项卡,勾选{Create HEX File}前面的复选框,如下图
编译时生成.HEX文件。

单击OK 按钮,关闭对话框。

单击全部编译按钮,结果如下
0错误,0警告,编译通过,并生成12864 graphic LCD parallel display.HEX文件。

把12864 graphic LCD parallel display.hex文件添加到AT89C52。

仿真:单击仿真进程控制按钮里面的运行按钮,查看仿真结果。

四、操作实验箱
(1)硬件连接
采用USB ISP下载方式,下载器如下图,实验箱采用USB窃电,无需外接电源
将下载器一端连接USB接口,如下图,指示灯亮
另一端连接“单片机核心板”的ISP插座(防呆的),如下图
单片机核心板上单片机引脚EA需要拉高,拉高选择单片机内部程序执行,而不是外部程序执行,如下图
(2)软件操作
双击“烧录软件”文件夹下图标,打开软件烧录界面,如下图
在Select Chip 下面选择AT89S52芯片,其它默认。

单击右侧“文件”下
的图标按钮,如图,打开文件选取对话框,选取"12864 graphic LCD parallel display.hex"文件,如下图
单击图标按钮,回到软件烧录界面,下面空白处显示调入Flash文件:matrix keyboard.hex。

如下图
单击图标按钮,下面空白处显示1:擦除,写Flash,效验Flash,成功,(2015/12/22 17:06:38),
如下图
下载完成。

(3)“单片机核心板”模块连接“LCD 12864”模块。

将“单片机核心板”模块上的“12864-1”接线座与“LCD 12864”模块上的“12864-1”接线座相连;
将“单片机核心板”模块上的“12864-2”接线座与“LCD 12864”模块上的“12864-2”接线座相连.
操作程序的运行状况。

相关文档
最新文档