LCD12864的操作例程

12864液晶屏是工业控制领域常用的显示部件,以下为老朽自己写的一部分程序以搏一洒;


#include "stc8g.h"
#include "intrins.h"
#define DATA_PORT P0
sbit LCD12864_CS1   = P2^5;		 //左半屏高有效;
sbit LCD12864_CS2   = P2^4;		 //右边半屏高有效;
sbit LCD12864_RST   = P2^3; 	 //复位信号低有效
sbit LCD12864_RS    = P2^0;		 //指令数据选择信号低指令高数据;
sbit LCD12864_RW    = P2^1;		 //读写信号,(高度低些)高为读低为写;
sbit LCD12864_E     = P2^2;		 //使能操作;

char code hanzi[]= 
{
/*--  文字0:  本  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x10,0x10,0x10,0x10,0xD0,0x30,0xFF,0x30,0xD0,0x10,0x10,0x10,0x10,0x00,0x00,
0x10,0x08,0x04,0x02,0x09,0x08,0x08,0xFF,0x08,0x08,0x09,0x02,0x04,0x08,0x10,0x00,

/*--  文字1:  机  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x10,0xD0,0xFF,0x90,0x10,0x00,0xFE,0x02,0x02,0x02,0xFE,0x00,0x00,0x00,0x00,
0x04,0x03,0x00,0xFF,0x00,0x83,0x60,0x1F,0x00,0x00,0x00,0x3F,0x40,0x40,0x78,0x00,

/*--  文字2:  地  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x20,0x20,0xFF,0x20,0x20,0x80,0xF8,0x80,0x40,0xFF,0x20,0x10,0xF0,0x00,0x00,
0x10,0x30,0x10,0x0F,0x08,0x08,0x00,0x3F,0x40,0x40,0x5F,0x42,0x44,0x43,0x78,0x00,

/*--  文字3:  址  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x20,0x20,0x20,0xFF,0x20,0x20,0x00,0xF8,0x00,0x00,0xFF,0x40,0x40,0x40,0x00,0x00,
0x10,0x30,0x10,0x0F,0x08,0x48,0x40,0x7F,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x00,

/*--  文字4:  串  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0x3C,0x24,0x24,0x24,0x24,0xFF,0x24,0x24,0x24,0x24,0x3C,0x00,0x00,0x00,
0x00,0x1F,0x09,0x09,0x09,0x09,0x09,0xFF,0x09,0x09,0x09,0x09,0x09,0x1F,0x00,0x00,

/*--  文字5:  口  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x00,0xFC,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0xFC,0x00,0x00,0x00,
0x00,0x00,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x00,0x00,0x00,

/*--  文字6:  波  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x10,0x60,0x02,0x0C,0xC0,0x00,0xF8,0x88,0x88,0x88,0xFF,0x88,0x88,0xA8,0x18,0x00,
0x04,0x04,0x7C,0x03,0x80,0x60,0x1F,0x80,0x43,0x2C,0x10,0x28,0x46,0x81,0x80,0x00,

/*--  文字7:  特  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x40,0x3C,0x10,0xFF,0x10,0x10,0x40,0x48,0x48,0x48,0x7F,0x48,0xC8,0x48,0x40,0x00,
0x02,0x06,0x02,0xFF,0x01,0x01,0x00,0x02,0x0A,0x12,0x42,0x82,0x7F,0x02,0x02,0x00,

/*--  文字8:  率  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0x00,0x14,0xA4,0x44,0x24,0x34,0xAD,0x66,0x24,0x94,0x04,0x44,0xA4,0x14,0x00,0x00,
0x08,0x09,0x08,0x08,0x09,0x09,0x09,0xFD,0x09,0x09,0x0B,0x08,0x08,0x09,0x08,0x00,

/*--  文字9:  黑方块  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=16x16   --*/
0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0xff,0xff,0xff,0xFF,0xff,0xff,0xff,0xff,0xff,
0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,0xff,
/*--  清零10 --*/
/*--  宽度x高度=16x16  --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
/*--  文字11;横线图像  --*/
/*--  宽度x高度=16x16  --*/
0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,
0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x01,
};
 char code shuzi[]= 

{
/*--  文字10:  0  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,
/*--  文字11:  1  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,
/*--  文字12:  2  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,
/*--  文字13:  3  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,
/*--  文字14:  4  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,
/*--  文字15:  5  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,
/*--  文字16:  6  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,
/*--  文字17:  7  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,
/*--  文字18:  8  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,
/*--  文字19:  9  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,
/*--  文字A:  冒号  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,
/*--  文字b:  清空  --*/
/*--  宋体12;  此字体下对应的点阵为:宽x高=8x16   --*/
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,

};

/*******************************************************************************
* 函 数 名         : LCD12864_WriteCmd
* 函数功能		   : 写入一个命令到12864
* 输    入         : cmd RS=H;数据,L指令
* 输    出         : 无	 WR=H: 读	 L写;
*******************************************************************************/


void lcd12864_writecmd(unsigned char cmd)

{	
	unsigned char xh;
	LCD12864_E  = 1;	//E初始为高延时一段时间
	LCD12864_RS = 1;
	LCD12864_RW = 1;
	xh=60;
	while(xh--);
	LCD12864_E  = 0;
	xh=20;
	while(xh--);
	LCD12864_RS = 0;
	LCD12864_RW = 0;
	xh=40;
	while(xh--);
    LCD12864_E  = 1;
    DATA_PORT = cmd; 
    xh=60;
	while(xh--);
    LCD12864_E  = 0;// 锁存
	xh=10;
	while(xh--);

}

/*******************************************************************************
* 函 数 名         : Lcd2864WriteData
* 函数功能		   : 写入一个数据到12864
* 输    入         : cmd RS=H;数据,L指令
* 输    出         : 无	 WR=H: 读	 L写;
*******************************************************************************/

 void lcd12864_writedat(unsigned char dat)
{
	unsigned char xh;
	LCD12864_E  = 1;	//E初始为高延时一段时间
	LCD12864_RS = 0;
	LCD12864_RW = 1;
	xh=60;
	while(xh--);
	LCD12864_E  = 0;
	xh=20;
	while(xh--);
	LCD12864_RS = 1;
	LCD12864_RW = 0;
	xh=40;
	while(xh--);
   LCD12864_E  = 1;
   DATA_PORT = dat; 
   xh=60;
	while(xh--);
  LCD12864_E  = 0;// 锁存
	xh=10;
	while(xh--);


}

/*******************************************
***** 函 数 名         : LCD12864_Init	****
***** 函数功能		   : 初始化12864	****
***** 输    入         : 无				****
***** 输    出         : 无				****
* ****说    明         : 				****
********************************************/

void lcd12864_init(void)
{	unsigned char hczz;
	LCD12864_RST = 0;
	hczz=20;
	while(hczz--);
	LCD12864_RST = 1;
	hczz=20;
	while(hczz--);
	lcd12864_writecmd(0x3F);  //打开显示;
	lcd12864_writecmd(0xC0);  // 显示起始行设置;
}
 /****************************************************************************************************
* 函 数 名        * :LcdWrite_Word(unsigned char x,unsigned char y,unsigned char *p)		         *
* 函数功能		  * : 在液晶屏指定位置写一个字;p为存放数据的地址;x为纵坐标从上到下取值为0到3;	     *
*                 * : y为左右,取值范围为0到f,程序没有检测数值范围注意不要超过;					         *
* 输    入        * : 页地址,位地址,数据存放位置指针数值;							  	         *
* 输    出        * : 无	
x代表从上到下的位置从0到3共四行可选;
y代表从左到右的位置:从0到f,共15个位置可选,汉字两个位置组成一个汉字每行能写8个汉字
num:是汉字数组里的排序:数组里面写好了编号;bit  fan为布尔值,0代表正写,1代表反白;																         
*****************************************************************************************************/
void lcdwrite_word(unsigned char x,unsigned char y,unsigned char num,bit fan)
	{
		 unsigned char yin,i,datain;
		 unsigned char *p;
		if(y<=7)							  //如果字符横坐标在0到7选左面片区
		  {
		    LCD12864_CS1   =  1;			   //选中左片区;
   			LCD12864_CS2   =  0;			  //选中左片区;
			yin=y;
		  }
		else								  //如果字符横坐标在8到e选右面片区
		   {
		   	 LCD12864_CS1   =  0;			  //选中右片区;
             LCD12864_CS2   =  1;		      //选中右片区;
			 yin=y-8;
		   }
		      //写汉字上面8行16列;
		  lcd12864_writecmd(0xB8+x*2);		  //设置页面x地址垂直地址上小下大;实际取值范围是b8到bf
		  lcd12864_writecmd(0x40+(yin<<3));   //设置y地址;水平地址,左边小右边大,取值范围是40到8f;
			p=&hanzi[0]+num*0x20;

		   for(i=0;i<16;i++)				 //字模软件取得垂直八个点为一个字节,顺序取16列。是汉字的上面
			  {
			   datain=*p;					 //指针数值是程序区域存储的字模数据位置
			   if(fan==1)								 //调用之前找到数组用&hanzi[0]数组取得数值
				datain=~datain;							 //赋值给p;p=&shuzu[x];就行	 ;
		   	   lcd12864_writedat(datain) ;
			   p++;
			   }
	                                         //写汉字下面16列;
		  lcd12864_writecmd(0xB8+x*2+1);	 //设置x地址;上下方向为x
		 
		  lcd12864_writecmd(0x40+(yin<<3));  //设置y地址;左右方向为y
		   for(i=0;i<16;i++)
			  {
			   datain=*p;					 //指针没有动继续写下一行;
			   if(fan==1)								 //调用之前找到数组用&hanzi[0]数组取得数值
				datain=~datain;
		   	   lcd12864_writedat(datain) ;
			 
			   p++;
			   }

	}

/*******************************************************************************
* 函 数 名         : void Write0()											   *
* 函数功能		   : 清屏12864时往数据ram区域写零清屏;						   *
* 输    入         : 无														   *
* 输    出         : 无														   *
*******************************************************************************/

 void write0(void)
 {	 
	  unsigned char j,i,xh;
         LCD12864_CS1   =  1;			   //选中左片区;
   		 LCD12864_CS2   =  0;			   //选中左片区;
		 xh=5;
		 while(xh--)
		 for(i=0;i<8;i++)				   //x坐标循环设置
		     {
			 lcd12864_writecmd(0xB8+i);
			 lcd12864_writecmd(0x40);
			 for(j=0;j<64;j++)			   //y坐标自动加一;
				{
				 lcd12864_writedat(0x00);
				}
			  }
		 LCD12864_CS1   =  0;			  //选中右片区;
         LCD12864_CS2   =  1;		      //选中右片区;
		  xh=5;
		 while(xh--)
		 for(i=0;i<8;i++)
			{
		     lcd12864_writecmd(0xB8+i);
			 lcd12864_writecmd(0x40);
			 for(j=0;j<64;j++)
				{
				 lcd12864_writedat(0x00);
				}
			}
}		  
/**********************************************
* 函 数 名         : void write——unmb()       *
* 函数功能		   : 在液晶上写数字           *
* 输    入         : 无						  *
* 输    出         : 无						  *
方法同写汉字一样,本例程全是正显示,需要反白的自己根据写汉字的方法修改程序即可;



***********************************************/
  void write_numb(unsigned char x,unsigned char y,unsigned char num)
	{
		 unsigned char yin,i,datain,xh;
		 unsigned char *p;
		if(y<=7)							  //如果字符横坐标在0到7选左面片区
		  {
		    LCD12864_CS1   =  1;			  //选中左片区;
   			LCD12864_CS2   =  0;			  //选中左片区;
			xh=5;
			while(xh--)
			yin=y;
		  }
		else								  //如果字符横坐标在8到f选右面片区
		   {
		   	 LCD12864_CS1   =  0;			  //选中右片区;
             LCD12864_CS2   =  1;		      //选中右片区;
			 	xh=5;
			while(xh--)
			 yin=y-8;
		   }								  //写数字上面8列;
		  lcd12864_writecmd(0xB8+x*2);		  //设置页面x地址垂直地址上小下大;实际取值范围是b8到bf
		  lcd12864_writecmd(0xB8+x*2);
		  lcd12864_writecmd(0x40+(yin<<3));   //设置y地址;水平地址,左边小右边大,取值范围是40到8f;
			p=&shuzi[0]+num*0x10;

		   for(i=0;i<8;i++)				      //字模软件取得垂直八个点为一个字节,顺序取8列。是数字的上面
			  {
			   datain=*p;					  //指针数值是程序区域存储的字模数据位置
			   								  //调用之前找到数组用&shuzi[0]数组取得数值
											  //赋值给p;p=&shuzu[x];就行	 ;
		   	   lcd12864_writedat(datain) ;
			   p++;
			   }
	                                          //写数字下面8列;
		  lcd12864_writecmd(0xB8+x*2+1);	  //设置x地址;上下方向为x
		  lcd12864_writecmd(0xB8+x*2+1);
		  lcd12864_writecmd(0x40+(yin<<3));   //设置y地址;左右方向为y
		   for(i=0;i<8;i++)
			  {
			   datain=*p;					  //指针没有动继续写下一行;
		   	   lcd12864_writedat(datain) ;
			 
			   p++;
			   }

	}

  • 1
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值