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

📄 12864.c

📁 LCD12864的嵌入式C程序 很有参考价值!
💻 C
📖 第 1 页 / 共 2 页
字号:
/**********************************************************************************
12864管脚说明:1--CS1(片选左半屏)   2--CS2(片选右半屏)   3--GND   4--VDD(5.0V)
               5--V0(液晶驱动电压灰度调节)  6--D/I(数据/指令R/S)  7--R/W(读/写)
               8--E(使能端) 9~16--DB0~DB7(数据) 17--LED+(背光+ 5.0V)   18--LED-(背光- 0V)
        数据--P0  DI--P2.0  RW--P2.1  CS1--P2.2  CS2--P2.3  E--P2.4  V0--电位器+5.0  
***********************************************************************************/
#include <reg52.h>
#include <stdio.h>
#include <intrins.h>
#include <string.h>
#include <math.h>

sbit RS  = P2^2;	/*"H" is send or read the data;"L" is the instruction*/
sbit RW  = P2^4;
sbit E   = P2^3;	 /*Operation enable*/
sbit CS1 = P2^0;
sbit CS2 = P2^1;

#define DataPort  P0                      //数据口为P0口
unsigned char code ASCII_code[10][16];    //0-9的字模

void InitLCD();                           //清屏函数
void delay1ms(unsigned char x);           //延时1ms函数
void delay10ms(unsigned char x);          //延时10ms函数
void OutFI(unsigned char i);              //左屏显示送指令函数
void OutSI(unsigned char i);              //右屏显示送指令函数
void OutFD(unsigned char i);              //左屏显示送数据函数
void OutSD(unsigned char i);              //右屏显示送数据函数
void biaoge();                            //画表格函数
void Clrscreen(unsigned char m);          //送指定数据函数
void Clrscreen_ge(unsigned char dat,unsigned char layer,unsigned char column,unsigned char whidth);   //送固定数据\画表格
void Clrscreen_data(unsigned char dat,unsigned char layer,unsigned char column,unsigned char whidth); //送固定数据子函数
void display_GD(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,signed char KY,signed char HY,unsigned char *china_code);  //移动显示子函数
void display(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,unsigned char *china_code);   //随意显示子函数
void display_LM(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,unsigned char *china_code);//拉幕显示子函数
void QU_ASCII(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,unsigned char *china_code);  //取数字的ASCII码显示
/*-----------------------------------------------------------------------------
函 数 名:	void delay1ms(unsigned char x)
功    能:	延时1MS函数
说    明:	X为1MS的倍数	              
------------------------------------------------------------------------------*/
void delay1ms(unsigned char x)
{
 unsigned char i,j;
 for(i=0;i<x;i++)  
  for(j=0;j<120;j++);
}
/*-----------------------------------------------------------------------------
函 数 名:	void delay10ms(unsigned char x)
功    能:	延时10MS函数
说    明:	X为10MS的倍数	              
------------------------------------------------------------------------------*/
void delay10ms(unsigned char x)
{
 unsigned char i,j,k;
 for(i=0;i<x;i++)  
  for(j=0;j<10;j++)
   for(k=0;k<120;k++);
}
/*------------------------------------------------------------------------
函 数 名:	void InitLCD()
功    能:	初始化
说    明:	
--------------------------------------------------------------------------*/
void InitLCD()
{
	OutFI(0x40);			/*Set the Y address 0 */
	OutSI(0x40);
	OutFI(0xb8);			/*Set the Page 0 */
	OutSI(0xb8);
	OutFI(0xc0);			/*Set the display start line 0 */
	OutSI(0xc0);
	OutFI(0x3f);			/*Display ON */
	OutSI(0x3f);
}
/*-----------------------------------------------------------------------------------
函 数 名:	void OutFI(uchar i)
功    能:	给左半屏发送指令
说    明:	I为要送的指令
/*-----------------------------------------------------------------------------------*/
void OutFI(unsigned char i)
{ 
	unsigned char data_sta;
	EA=0;
  	do{ 
  		E=0;RW=1;RS=0;CS1=0;_nop_();
		E=1;_nop_();_nop_();_nop_();
		data_sta=DataPort;
		_nop_();_nop_();
		E=0;RW=0;CS1=1;
  	}while(data_sta&0x80);

    E=0;RW=0;RS=0;CS1=0;_nop_();
    DataPort=i;
    E=1;_nop_();_nop_();_nop_();
	E=0;RW=1;CS1=1;
	EA=1;
}

/*----------------------------------------------------------------------------
函 数 名:	void OutSI(uchar i)
功    能:	给右半屏发送指令
说    明:	I为要送的指令
----------------------------------------------------------------------------*/
void OutSI(unsigned char i)
{ 
	unsigned char data_sta;
	EA=0;
  	do{ 
  		E=0;RW=1;RS=0;CS2=0;_nop_();
		E=1;_nop_();_nop_();_nop_();
		data_sta=DataPort;
		_nop_();_nop_();
		E=0;RW=0;CS2=1;
  	}while(data_sta&0x80);

    E=0;RW=0;RS=0;CS2=0;_nop_();
    DataPort=i;
    E=1;_nop_();_nop_();_nop_();
	E=0;RW=1;CS2=1;
	EA=1;
}

/*----------------------------------------------------------------------------
函 数 名:	void OutFD(uchar i)
功    能:   给左半屏送数据
说    明:	I为要送的数据
----------------------------------------------------------------------------*/
void OutFD(unsigned char i)
{ 
	unsigned char data_sta;
	EA=0;
  	do{ 
  		E=0;RW=1;RS=0;CS1=0;_nop_();
		E=1;_nop_();_nop_();_nop_();
		data_sta=DataPort;
		_nop_();_nop_();
		E=0;RW=0;CS1=1;
  	}while(data_sta&0x80);

    E=0;RW=0;RS=1;CS1=0;_nop_();
    DataPort=i;     
    E=1;_nop_();_nop_();_nop_();
	E=0;RW=1;CS1=1;	
	EA=1;
}
/*----------------------------------------------------------------------------
函 数 名:	void OutSD(uchar i)
功    能:	给右半屏送数据
说    明:	I为要送的数据
----------------------------------------------------------------------------*/
void OutSD(unsigned char i)
{ 
	unsigned char data_sta;
	EA=0;
  	do{ 
  		E=0;RW=1;RS=0;CS2=0;_nop_();
		E=1;_nop_();_nop_();_nop_();
		data_sta=DataPort;
		_nop_();_nop_();
		E=0;RW=0;CS2=1;
  	}while(data_sta&0x80);

    E=0;RW=0;RS=1;CS2=0;_nop_();
    DataPort=i;
    E=1;_nop_();_nop_();_nop_();
	E=0;RW=1;CS2=1;
	EA=1;
}
/*-------------------------------------------------------------------------
函 数 名:	void Clrscreen(unsigned char m)
功    能:	全屏显示某一个数据
说    明:	M为要显示的数据		m=0x00则为清屏
----------------------------------------------------------------------------*/
void Clrscreen(unsigned char m)
{
	unsigned char i,j;

	for(i=8;i>0;i--)
	{
		OutFI(0xb8|(i-1));
		for(j=0;j<64;j++)
		{
			OutFI(j|0x40);
			OutFD(m);
		}
	}
	for(i=0;i<8;i++)
	{
		OutSI(0xb8|i);	
		for(j=0;j<64;j++)
		{
			OutSI(j|0x40);
			OutSD(m);
		}
	}
}
/*************************************************************
函 数 名:	void Clrscreen_ge
功    能:	送固定数据\画表格
说    明:   (数据,起始页,起始列,显示宽度)                    
**************************************************************/
void Clrscreen_ge(unsigned char dat,unsigned char layer,unsigned char column,unsigned char whidth)
{
 unsigned char i,D,C,W,z,x;
 D=dat;
 C=column;
 W=whidth;
 if(column<64)
 {
  if(column+whidth<64)
  {
   for(i=0;i<W;i++)
   {
    OutFI(0xb8|layer);          //送页地址
    OutFI(C|0x40);              //送列地址
    OutFD(D);                   //送显示数据
    C++;
   }
  }
  else
  {
   z=64-column;
   for(i=0;i<z;i++)
   {
    OutFI(0xb8|layer);
    OutFI(C|0x40);
    OutFD(D);
    C++;
   } 
   x=column+whidth-64;
   for(i=0;i<x;i++)
   {
    OutSI(0xb8|layer);
    OutSI(C|0x40);
    OutSD(D);
    C++;
   }
  }
 }
else
 {
  for(i=0;i<W;i++)
   {
    OutSI(0xb8|layer);
    OutSI(C|0x40);
    OutSD(D);
    C++;
   }
 }

}
/***********************************************************
函 数 名:	void baoge()
功    能:	画固定表格
说    明:                            
************************************************************/
void biaoge()
{
 Clrscreen_ge(0x01,0,1,126);
 Clrscreen_ge(0x01,6,1,126);
 Clrscreen_ge(0x80,7,1,126);
 Clrscreen_data(0xff,0,0,1);
 Clrscreen_data(0xff,2,0,1);
 Clrscreen_data(0xff,4,0,1);
 Clrscreen_data(0xff,6,0,1);
 Clrscreen_data(0xff,0,127,1);
 Clrscreen_data(0xff,2,127,1);
 Clrscreen_data(0xff,4,127,1);
 Clrscreen_data(0xff,6,127,1);
}
/*************************************************************
函 数 名:	void Clrscreen_data
功    能:	在固定位置送固定数据函数
说    明:	(要送的数据,页地址,列地址,显示宽度)
**************************************************************/
void Clrscreen_data(unsigned char dat,unsigned char layer,unsigned char column,unsigned char whidth)
{
 unsigned char i,D,C,W,z,x;
 D=dat;
 C=column;
 W=whidth;
 if(column<64)
 {
  if(column+whidth<64)
  {
   for(i=0;i<W;i++)
   {
    OutFI(0xb8|layer);
    OutFI(C|0x40);
    OutFD(D);
    C++;
   }
   C=C-W;
   for(i=0;i<W;i++)
   {
    OutFI(0xb8|layer+1);
    OutFI(C|0x40);
    OutFD(D);
    C++;
   }
  }
  else
  {
   z=64-column;
   for(i=0;i<z;i++)
   {
    OutFI(0xb8|layer);
    OutFI(C|0x40);
    OutFD(D);
    C++;
   }
   C=C-z;
   for(i=0;i<z;i++)
   {
    OutFI(0xb8|layer+1);
    OutFI(C|0x40);
    OutFD(D);
    C++;
   }  
   x=column+whidth-64;
   for(i=0;i<x;i++)
   {
    OutSI(0xb8|layer);
    OutSI(C|0x40);
    OutSD(D);
    C++;
   }
   C=C-x;
   for(i=0;i<x;i++)
   {
    OutSI(0xb8|layer+1);
    OutSI(C|0x40);
    OutSD(D);
    C++;
   }
  }
}
else
 {
  for(i=0;i<W;i++)
   {
    OutSI(0xb8|layer);
    OutSI(C|0x40);
    OutSD(D);
    C++;
   }
   C=C-W;
  for(i=0;i<W;i++)
   {
    OutSI(0xb8|layer+1);
    OutSI(C|0x40);
    OutSD(D);
    C++;
   }
 }

}
/*******************************************************************************************
函 数 名:	void display_GD
功    能:	实现显示水平滚动
说    明:	[起始页,显示列,显示宽度,字的大小,水平滚动起始列,上下滚动的行数(为0时在指定的页位置,
             为正数时向上移,为负数时向下移动),字模]水平滚动和上下滚动时与FOR循环配合使用
            例如:  for(i=124,j=1;i>0,j<124;i--,j++)
  					{
  						display_GD(4,i,j,16,125,i,arrayadress2[0]);
  						delay10ms(10);
  					}
*******************************************************************************************/
void display_GD(unsigned char layer,unsigned char column,unsigned char whidth,unsigned char daxiao,signed char KY,signed char HY,unsigned char *china_code)
{
unsigned int p=0;
unsigned char i,k,x;
unsigned char DX,W,CO;
W=whidth;
CO=column;
DX=daxiao;
if(column<64)
{
 if(column+whidth<64)
 {
  W=whidth/daxiao; 
  for(i=0;i<W;i++)
  {
   for(k=0;k<DX;k++)
   {
    OutFI(0xb8|layer);
    OutFI(CO|0x40);
    OutFI(HY|0xC0);
    OutFD(china_code[p]);
    p++;
    CO+=1;
   }
   p+=DX;
  }
  CO-=W*DX;
  p=0;
  for(i=0;i<W;i++)
  {
   for(k=0;k<DX;k++)
   {
    OutFI(0xb8|layer+1);
    OutFI(CO|0x40);
	OutFI(HY|0xC0);
    OutFD(china_code[p+DX]);
    p++;
    CO+=1;
   }  
   p+=DX;
  }
  W=whidth%DX;
  for(k=0;k<W;k++)
   {
    OutFI(0xb8|layer);
    OutFI(CO|0x40);
	OutFI(HY|0xC0);
    OutFD(china_code[p]);
    p++;
    CO+=1;
   } 
  CO=CO-W;
  for(k=0;k<W;k++)
   {
    OutFI(0xb8|layer+1);
    OutFI(CO|0x40);
	OutFI(HY|0xC0);
    OutFD(china_code[p+DX-W]);
    p++;
    CO+=1;
   }
 }
//****************************************字全部在左半屏
/*******************************************************************************************/
  else
  {
    W=(64-CO)/DX;
   for(i=0;i<W;i++)
    {
     for(k=0;k<DX;k++)
      {
       OutFI(0xb8|layer);
       OutFI(CO|0x40);
	   OutFI(HY|0xC0);
       OutFD(china_code[p]);
       p++;
       CO+=1;
      }  
      p+=DX;
    }
     CO-=DX*W;
     p-=DX*W*2;
     for(i=0;i<W;i++)
     {
      for(k=0;k<DX;k++)
      {
       OutFI(0xb8|layer+1);
       OutFI(CO|0x40);
	   OutFI(HY|0xC0);
       OutFD(china_code[p+DX]);
       p++;
       CO+=1;
      }  
      p+=DX;
     }
//****************************处理在左半屏显的整个字的部分
/********************************************************/
    W=(64-CO)%DX;
    for(k=0;k<W;k++)
     {
      OutFI(0xb8|layer);
      OutFI(CO|0x40);
	  OutFI(HY|0xC0);
      OutFD(china_code[p]);          //*2+j*whidth
      p++;
      CO+=1;
     }
	CO-=W;
    p+=DX-W;
    for(k=0;k<W;k++)
     {
      OutFI(0xb8|layer+1);
      OutFI(CO|0x40);
	  OutFI(HY|0xC0);
      OutFD(china_code[p]);      //*2+j*whidth+(j-z)
      p++;
      CO+=1;
     }
/*******************************左右半屏过度的左半屏部分
/*******************************************************/
   if((whidth+column-63)>(DX-W))  x=DX-W;
   else x=whidth+column-63; 
    if(x==DX) x=0;
    else x=x;
    CO=64;
    p-=DX;    
    for(k=0;k<x;k++)
     {     
      OutSI(0xb8|layer);
      OutSI(CO|0x40);
	  OutSI(HY|0xC0);
      OutSD(china_code[p]);        //*2+j*whidth-z
      p++;  
      CO+=1;
     }
    CO=64;
    p+=W;
    for(k=0;k<x;k++)
     {     
      OutSI(0xb8|layer+1);
      OutSI(CO|0x40);
	  OutSI(HY|0xC0);
      OutSD(china_code[p]);         //*2+j*whidth-z+x
      p++;
      CO+=1;
     }
/***********************************左右半屏过度的右半屏部分
/**********************************************************/
    if(x==0) W=(whidth-(64-column))/DX;
	if(x<=(KY-64)%DX) W=(whidth-(64-column))/DX;
    else W=(whidth-(64-column))/DX-1;
    for(i=0;i<W;i++)
     {
      for(k=0;k<DX;k++)
      {
       OutSI(0xb8|layer);
       OutSI(CO|0x40);
	   OutSI(HY|0xC0);
       OutSD(china_code[p]);
       p++;
       CO+=1;
      }  
      p+=DX;
     }
     CO-=DX*W;
     p-=W*2*DX;
     for(i=0;i<W;i++)
     {
      for(k=0;k<DX;k++)
      {
       OutSI(0xb8|layer+1);
       OutSI(CO|0x40);
	   OutSI(HY|0xC0);
       OutSD(china_code[p+DX]);
       p++;
       CO+=1;
      }  
      p+=DX;
     }  
     W=KY-CO;                           //拉幕问题
	 for(i=0;i<W;i++)
	 {
      OutSI(0xb8|layer);
      OutSI(CO|0x40);
	  OutSI(HY|0xC0);
      OutSD(china_code[p]);
      p++;
      CO+=1;
     }
     CO-=W;
	 p+=DX-W;

⌨️ 快捷键说明

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