LCD12864液晶显示

@

LCD12864液晶显示

	以Proteus中的AMPIRE12864介绍

LCD12864液晶介绍

在这里插入图片描述
LCD12864与LCD1602同样都被广泛使用,两者有相似之处方便介绍LCD12864。LCD1602是一种字符型液晶显示模块能显示字母、数字以及一般性符号,16值得是一行16个字节(128列),2指的是两行。LCD12864由128列64行组成,分为左右屏(单屏为64行*64列)。它有带字库和不带字库两种,这里只介绍不带字库的AMPIRE12864。不带字库的12864可以显示各种字体、图片和符号,但是前题是你要有字模软件取模。这里介绍一种字模软件PCtoLCD2002,百度网盘链接为:
百度网盘
提取码:gutn
软件使用方法很简单,请自行摸索。

详细介绍

引脚功能:
在这里插入图片描述
RAM地址结构:
在这里插入图片描述
重要指令:在这里插入图片描述
片选:在这里插入图片描述
原理图连接:在这里插入图片描述

示范代码

#include<string.h> 
#include<intrins.h> 
#include <absacc.h> 
#define uint unsigned int 
#define uchar unsigned char 
#define DATA P0 //LCD12864数据线 
sbit RS=P2^0; // 数据\指令 选择 
sbit RW=P2^1; // 读\写 选择 
sbit EN=P2^2; // 读\写使能 
sbit cs1=P2^3; // 片选1 
sbit cs2=P2^4; // 片选2 
/********************************/ 
/* 定义中文字库 */ 
/********************************/ 
uchar code Hzk[]={
/*-- 文字: 相0--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x10,0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,
0x08,0x04,0x03,0x00,0xFF,0x00,0x03,0x00,0xFF,0x42,0x42,0x42,0x42,0xFF,0x00,0x00,
/*-- 文字: 信1--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x80,0x60,0xF8,0x07,0x00,0x04,0x24,0x24,0x25,0x26,0x24,0x24,0x24,0x04,0x00,
0x01,0x00,0x00,0xFF,0x00,0x00,0x00,0xF9,0x49,0x49,0x49,0x49,0x49,0xF9,0x00,0x00,
/*-- 文字: 自2--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x00,0xF8,0x88,0x8C,0x8A,0x89,0x88,0x88,0x88,0xF8,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0xFF,0x44,0x44,0x44,0x44,0x44,0x44,0x44,0xFF,0x00,0x00,0x00,0x00,
/*-- 文字: 己 3--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00,
0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00,
/*-- 文字: 詹 4--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x20,0x10,0xF8,0x4C,0xCB,0xAA,0x9A,0xAA,0xCA,0x8E,0x9A,0xE8,0xA8,0x88,0x00,0x00,
0x80,0x60,0x1F,0x00,0xE0,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xAA,0xE0,0x00,0x00,0x00,
/*-- 文字: 书 5--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x80,0x80,0x88,0x88,0x88,0x88,0xFF,0x88,0x88,0x88,0x88,0xFA,0x84,0x9C,0x08,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x00,0x00,0x10,0x20,0x40,0x30,0x0F,0x00,0x00,
/*-- 文字: 庭 6--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0xFC,0x04,0x14,0x94,0x74,0x05,0xA6,0xA4,0xE4,0x94,0x94,0x94,0x04,0x00,
0x40,0x30,0x8F,0x48,0x31,0x1E,0x20,0x48,0x48,0x48,0x4F,0x48,0x48,0x48,0x48,0x00,
/*-- 文字: ★ 7--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0x40,0xC0,0xC0,0xC0,0xE0,0xFC,0xFF,0xFC,0xE0,0xC0,0xC0,0xC0,0x40,0x40,0x00,
0x00,0x00,0x40,0x39,0x3F,0x1F,0x1F,0x0F,0x1F,0x1F,0x3F,0x39,0x40,0x00,0x00,0x00,
/*-- 文字: ☆ 8--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x40,0xC0,0x40,0x40,0x40,0x60,0x1C,0x03,0x1C,0x60,0x40,0x40,0x40,0xC0,0x40,0x00,
0x00,0x00,0x41,0x39,0x26,0x10,0x10,0x08,0x08,0x10,0x26,0x39,0x41,0x00,0x00,0x00,
/*-- 文字: * 9--*/
/*-- 宋体12; 此字体下对应的点阵为:宽x高=16x16 --*/
0x00,0x00,0x40,0x40,0x80,0x80,0x00,0xFC,0x00,0x80,0x80,0x40,0x40,0x00,0x00,0x00,
0x00,0x00,0x00,0x10,0x08,0x04,0x03,0x01,0x03,0x04,0x08,0x10,0x00,0x00,0x00,0x00,
};

/*状态检查,LCD是否忙*/ 
void CheckState() 
{uchar dat;//状态信息(判断是否忙) 
RS=0; // 数据\指令选择,D/I(RS)=“L” ,表示 DB7∽DB0 为显示指令 数据
RW=1; //R/W=“H” ,E=“H”数据被读到DB7∽DB0 
do{DATA=0x00;
 EN=1; //EN下降沿 
 dat=DATA; 
 EN=0;
 dat=0x80 & dat; //仅当第7位为0时才可操作(判别busy信号) 
  }while(!(dat==0x00)); }
  
  /*写命令到LCD中*/ 
void SendCommandToLCD(uchar com) 
  {
	CheckState();//状态检查,LCD是否忙 
  RS=0; //向LCD发送命令。RS=0写指令,RS=1写数据 
  RW=0;//R/W=“L” ,E=“H→L”数据被写到 IR 或 DR 
  DATA=com; //com :命令 
  EN=1;//EN下降沿
  EN=0; 
  }
	
  /*设置页 0xb8是页的首地址*/ 
  void SetLine(uchar page) 
	{
	page=0xb8|page; //1011 1xxx 0<=page<=7 设定页地址--X 0-7,8行为一页 64/8=8,共8页 
  SendCommandToLCD(page); 
  }
	
  /*设定显示开始行,0xc0是行的首地址*/ 
  void SetStartLine(uchar startline) 
	{
	startline=0xc0|startline; //1100 0000 
  SendCommandToLCD(startline); //设置从哪行开始:0--63,一般从0 行开 始显示
  }/*设定列地址--Y 0-63 ,0x40是列的首地址*/
	
void SetColumn(uchar column) 
{
column=column &0x3f; //column最大值为64,越出 0=<column<=63 
column= 0x40|column; //01xx xxxx 
SendCommandToLCD(column); 
}

/*开关显示,0x3f是开显示,0x3e是关显示*/ 
void SetOnOff(uchar onoff) 
{
onoff=0x3e|onoff; //0011 111x,onoff只能为0或者1 
SendCommandToLCD(onoff);
}

/*写显示数据 */ 
void WriteByte(uchar dat) 
{
CheckState();//状态检查,LCD是否忙 
RS=1; //RS=0写指令,RS=1写数据 
RW=0;R/W=“L” ,E=“H→L”数据被写到 IR 或 DR 
DATA=dat;//dat:显示数据 
EN=1; //EN下降源 
EN=0; 
}

/*选择屏幕screen: 0-全屏,1-左屏,2-右屏*/ 
void SelectScreen(uchar screen) 
{
	switch(screen) {
		case 0: cs1=1;//全屏 
                cs2=1; break; 
        case 1: cs1=1;//左屏 
                cs2=0; break; 
	    case 2: cs1=0;//右屏 
	            cs2=1; break;
                    }
 }
/*清屏screen: 0-全屏,1-左屏,2-右屏*/ 
void ClearScreen(uchar screen) 
{
    uchar i,j;
   SelectScreen(screen);
   for(i=0;i<8;i++) //控制页数0-7,共8页 
      {
      SetLine(i); 
      SetColumn(0);
      for(j=0;j<64;j++) //控制列数0-63,共64列 
          {WriteByte(0x00);} //写点内容,列地址自动加1 
      }
}
/*延时程序*/ 
void delay(uint z) 
{uint i,j; 
	for(i=0; i<z; i++) 
		for(j = 0; j < 110; j++); 
}
/*初始化LCD*/ 
void InitLCD() 
{
 CheckState(); 
 SelectScreen(0);
 SetOnOff(0); //关显示 
 SelectScreen(0); 
 SetOnOff(1); //开显示 
 SelectScreen(0);
 ClearScreen(0);//清屏 
 SetStartLine(0); //开始行:0 
 }
 /*显示全角汉字*/ 
 void Display(uchar ss,uchar page,uchar column,uchar number) 
 {
	 int i; //选屏参数,page选页参数,column选列参数,number选第几汉 字输出 
	 SelectScreen(ss);
	 column=column&0x3f; 
	 SetLine(page); //写上半页 
   SetColumn(column); //控制列 
 for(i=0;i<16;i++) //控制16列的数据输出
 {
	WriteByte(Hzk[i+32*number]);
 } //i+32*number汉字的前16个数据输出 
	SetLine(page+1); //写下半页 
	SetColumn(column); //控制列 
	for(i=0;i<16;i++) //控制16列的数据输出
       {
          WriteByte(Hzk[i+32*number+16]);}//i+32*number+16汉字的后16个数据 输出
       }
/*显示半角汉字和数字和字母 
void Displayen(uchar ss,uchar page,uchar column,uchar number) {uint i;//选屏参数,pagr选页参数,column选列参数,number选第几汉 字输出
 SelectScreen(ss); column=column&0x3f; SetLine(page); //写上半页 
 SetColumn(column); for(i=0;i<8;i++) {WriteByte(Ezk[i+16*number]);} SetLine(page+1); //写下半页 
 SetColumn(column);
  for(i=0;i<8;i++)
   {WriteByte(Ezk[i+16*number+8]);} 
   }*/  
  /*主函数*/ 
 void main() 
 {
 uint i,j,n=0; 
 InitLCD();//初始12864 
 while(1) {
for(i=0;i<2;i++)//显示边上的☆和* 
 {for(j=1;j<3;j++) 
		{
			 Display(j,0,i*32+n*16,8); //选屏参数,page选页参数,column选列参数,number选第几汉字输出 
			 Display(j,6,i*32+(!n)*16,8); //☆
			 Display(j,0,i*32+(!n)*16,9);  //* 
			 Display(j,6,i*32+n*16,9); 
		}
 }
 Display(1,4-2*n,0,8); 
 Display(2,2+2*n,48,8); 
 Display(1,2+2*n,0,9);
 Display(2,4-2*n,48,9); 
for(i=0;i<2;i++)//显示汉字 
{
	Display(1,2,32+i*16,i);/*Display(选屏参数(cs1,cs2),pagr选页参数, column选列参数,number选第几汉字输出)*/ 
	Display(1,4,32+i*16,i+4); 
	Display(2,2,0+i*16,i+2); 
	Display(2,4,0+i*16,i+6); 
}
n=!n; 
delay(255); 
delay(255); 
}}

代码有很多注释,应该很容易看懂,便于改编。源代码链接:百度文库

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

X340823

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值