⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 lcd12864.c

📁 lcd19264 用C51控制12864显示汉字
💻 C
字号:
#include <reg51.h>
#include <Text.h>
#include <intrins.h>
#define Dataport P0 //LCD数据线
sbit RS=P2^2; // 数据\指令 选择
sbit RW=P2^1; // 读\写 选择
sbit EN=P2^0; // 读\写使能
sbit cs1=P2^4; // 片选1
sbit cs2=P2^3; // 片选2

void CheckState()		//状态检查,LCD是否忙?
{
   unsigned char dat;
   RS=0;
   RW=1;
   do{
      Dataport=0x00;
      EN=1; 
	  dat=Dataport;
      EN=0;
      dat=0x80&dat; //仅当第7位为0时才可操作(判别busy信号)
      }while(!(dat==0x00));
}
SendCommandToLCD(unsigned char command)	   //写命令到LCD中
{
   CheckState();
   RS=0;	 //向LCD发送命令
   RW=0;
   Dataport=command;	 //command :命令
   EN=1;
   EN=0;
}
void SetLine(unsigned char page)	//设置页 0xb8是页的首地址////////
{
  page=0xb8|page; //1011 1xxx		 0<=page<=7 设定页地址--X 0-7,8行为一页64/8=8,共8页
  SendCommandToLCD(page);
}

void SetStartLine(unsigned char startline)//设定显示开始行,0xc0是行的首地址//////////
{
  startline=0xc0|startline; //1100 0000
  SendCommandToLCD(startline); //设置从哪行开始:0--63,一般从0 行开始显示
 }

 void SetColumn(unsigned char column)	//设定列地址--Y 0-63 ,0x40是列的首地址/////////
{
  column=column &0x3f; //column最大值为64,越出 0=<column<=63
  column= 0x40|column; //01xx xxxx
  SendCommandToLCD(column);
}

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

void WriteByte(unsigned char dat)	//写显示数据
{
   CheckState();
   RS=1; 
   RW=0;
   Dataport=dat;//dat:显示数据
   EN=1;
   EN=0;
  }

void SelectScreen(unsigned char screen)	  //选择屏幕screen: 0-全屏,1-左屏,2-右屏
{ 						 
   switch(screen)
   { case 0: cs1=0;//全屏
             _nop_(); _nop_(); _nop_(); 
             cs2=0; 
             _nop_(); _nop_(); _nop_(); 
             break; 
     case 1: cs1=0;//左屏
             _nop_(); _nop_(); _nop_(); 
             cs2=1;
             _nop_(); _nop_(); _nop_(); 
             break;
     case 2: cs1=1;//右屏
             _nop_(); _nop_(); _nop_(); 
             cs2=0;
             _nop_(); _nop_(); _nop_(); 
             break;
   }
}


void ClearScreen(unsigned char screen)	  //清屏screen: 0-全屏,1-左屏,2-右
{ 	
     unsigned char 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); //写入 0,列地址自动加1
                }
     }
					 
}

void InitLCD() 	  //初始化LCD	 
{ 

	CheckState();//检查LCD是否忙

	SelectScreen(0);//选择全屏
	SetOnOff(0); //关显示

	SelectScreen(0);
	SetOnOff(1); //开显示

	SelectScreen(0);
	ClearScreen(0);//清屏

	SetStartLine(0); //开始行:0

}


//显示汉字
void Display(unsigned char ss,unsigned char page,unsigned char column,unsigned char 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 delay1()
{unsigned int i,j;
  for(i=0;i<1000;i++)
   for(j=0;j<100;j++)
   ;
}
void main()
{  int i;
   InitLCD();
   

 { for(i=0;i<4;i++)
      {  
	Display(2,0,i*16,i);      //显示右半屏,第一页和第二页 ,
	Display(1,0,i*16,i+4);    //显示左半屏,第一页和第二页 ,
	
	Display(2,0+2,i*16,i+8);  //显示右半屏,第三页和第四页 ,
	Display(1,0+2,i*16,i+12); //显示左半屏,第三页和第四页 ,

	Display(2,0+2+2,i*16,i+16);
	Display(1,0+2+2,i*16,i+20);

	Display(2,0+2+2+2,i*16,i+24);
	Display(1,0+2+2+2,i*16,i+28);
   
	  } 
    while(1);
 }
 }

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -