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

📄 12864.c

📁 128×64LCD显示控制屏底层驱动
💻 C
字号:
#include <INTRINS.H>

#define uchar unsigned char
#define uint  unsigned int
#define LCM_Data    P2          //定义LCM接口
#define RS          P3_3
#define RW          P3_4
#define E           P3_5
#define CS1         P3_7
#define CS2         P3_6
#define RSTB        P0_2

#define SelCS1      0x0
#define SelCS2      0x1
#define Page0       0xB8        //页面0
#define StartSeg    0x40        //第0列
#define DisplayOn   0x3F        //开显示
#define DisplayOff  0x3E        //关显示
#define StartRow    0xC0        //显示起始行
/******************************************************************** 
* 名称:Invert 
* 功能:
* 调用:无
* 输入: 
* 返回值: 无
***********************************************************************
uchar Invert(uchar org_data)
{
uchar inv_data=0,i;
for(i=8;i>0;i--)
{
inv_data=((org_data&0x01)<<(i-1))|inv_data;
org_data>>=1;
}
return inv_data;
} */
uchar code Invert[]=
{
0x0,0x80,0x40,0xc0,0x20,0xa0,0x60,0xe0,0x10,0x90,0x50,0xd0,0x30,0xb0,0x70,0xf0,
0x8,0x88,0x48,0xc8,0x28,0xa8,0x68,0xe8,0x18,0x98,0x58,0xd8,0x38,0xb8,0x78,0xf8,
0x4,0x84,0x44,0xc4,0x24,0xa4,0x64,0xe4,0x14,0x94,0x54,0xd4,0x34,0xb4,0x74,0xf4,
0xc,0x8c,0x4c,0xcc,0x2c,0xac,0x6c,0xec,0x1c,0x9c,0x5c,0xdc,0x3c,0xbc,0x7c,0xfc,
0x2,0x82,0x42,0xc2,0x22,0xa2,0x62,0xe2,0x12,0x92,0x52,0xd2,0x32,0xb2,0x72,0xf2,
0xa,0x8a,0x4a,0xca,0x2a,0xaa,0x6a,0xea,0x1a,0x9a,0x5a,0xda,0x3a,0xba,0x7a,0xfa,
0x6,0x86,0x46,0xc6,0x26,0xa6,0x66,0xe6,0x16,0x96,0x56,0xd6,0x36,0xb6,0x76,0xf6,
0xe,0x8e,0x4e,0xce,0x2e,0xae,0x6e,0xee,0x1e,0x9e,0x5e,0xde,0x3e,0xbe,0x7e,0xfe,
0x1,0x81,0x41,0xc1,0x21,0xa1,0x61,0xe1,0x11,0x91,0x51,0xd1,0x31,0xb1,0x71,0xf1,
0x9,0x89,0x49,0xc9,0x29,0xa9,0x69,0xe9,0x19,0x99,0x59,0xd9,0x39,0xb9,0x79,0xf9,
0x5,0x85,0x45,0xc5,0x25,0xa5,0x65,0xe5,0x15,0x95,0x55,0xd5,0x35,0xb5,0x75,0xf5,
0xd,0x8d,0x4d,0xcd,0x2d,0xad,0x6d,0xed,0x1d,0x9d,0x5d,0xdd,0x3d,0xbd,0x7d,0xfd,
0x3,0x83,0x43,0xc3,0x23,0xa3,0x63,0xe3,0x13,0x93,0x53,0xd3,0x33,0xb3,0x73,0xf3,
0xb,0x8b,0x4b,0xcb,0x2b,0xab,0x6b,0xeb,0x1b,0x9b,0x5b,0xdb,0x3b,0xbb,0x7b,0xfb,
0x7,0x87,0x47,0xc7,0x27,0xa7,0x67,0xe7,0x17,0x97,0x57,0xd7,0x37,0xb7,0x77,0xf7,
0xf,0x8f,0x4f,0xcf,0x2f,0xaf,0x6f,0xef,0x1f,0x9f,0x5f,0xdf,0x3f,0xbf,0x7f,0xff,
};

/******************************************************************** 
* 名称: LCM_WRcmd
* 功能:发送控制命令到CS1或CS2
* 调用:无
* 输入: uchar Wcmd,bit CS1CS2
* 返回值: 无
***********************************************************************/
void LCM_WRcmd(uchar Wcmd,bit CS1CS2)
{
if(CS1CS2==SelCS1)																		 
	{
	RS = 0;RW = 0;
	CS1 = 1;E = 1;
	LCM_Data = Invert[Wcmd];
	E = 0;CS1 = 0;
	}
else
	{
	RS = 0;RW = 0;
	CS2 = 1;E = 1;
	LCM_Data = Invert[Wcmd];
	E = 0;CS2 = 0;
	}
}
/******************************************************************** 
* 名称: LCM_WRdata
* 功能:发送数据到CS1或CS2
* 调用:无
* 输入: uchar Wdata,bit CS1CS2
* 返回值: 无
***********************************************************************/
void LCM_WRdata(uchar Wdata,bit CS1CS2)
{
if(CS1CS2==SelCS1)
	{
	RS = 1;RW = 0;
	CS1 = 1;E = 1;
	LCM_Data = Invert[Wdata];
	E = 0;CS1 = 0;
	}
else
	{
	RS = 1;RW = 0;
	CS2 = 1;E = 1;
	LCM_Data = Invert[Wdata];
	E = 0;CS2 = 0;
	}
}
/******************************************************************** 
* 名称:LCM_RDdata
* 功能:接收CS1或CS2的数据
* 调用:无
* 输入:uchar *p,bit CS1CS2
* 返回值: 无
***********************************************************************
void LCM_RDdata(uchar *p,bit CS1CS2)
{
if(CS1CS2==SelCS1)
	{
	RS = 1;RW = 1;
	LCM_Data = Invert(0xff);
	CS1 = 1;E = 1;
	*p = Invert(LCM_Data);
	E = 0;CS1 = 0;
	}
else
	{
	RS = 1;RW = 1;
	LCM_Data = Invert(0xff);
	CS2 = 1;E = 1;
	*p = Invert(LCM_Data);
	E = 0;CS2 = 0;
	}
}
/******************************************************************** 
* 名称:LCM_RDstatus
* 功能:读取CS1或CS2的状态
* 调用:无
* 输入:uchar *p,bit CS1CS2
* 返回值: 无
***********************************************************************
void LCM_RDstatus(uchar *p,bit CS1CS2)
{
if(CS1CS2==SelCS1)
	{
	RS = 0; RW = 1;
	LCM_Data = Invert(0xff);
	CS1 = 1;E = 1;
	*p = Invert(LCM_Data);
	E = 0;CS1 = 0;
	}
else
	{
	RS = 0; RW = 1;
	LCM_Data = Invert(0xff);
	CS2 = 1;E = 1;
	*p = Invert(LCM_Data);
	E = 0;CS2 = 0;
	}
}
/******************************************************************** 
* 名称:LCM_ClearRAM
* 功能:LCM清显示缓存
* 调用:LCM_WRcmd,LCM_WRdata
* 输入:无
* 返回值: 无
***********************************************************************/
void LCM_ClearRAM(void)
{
uchar i,j;
	for(i=8;i>0;--i)
	{
		LCM_WRcmd(Page0|i,SelCS1);
		LCM_WRcmd(Page0|i,SelCS2);
	    LCM_WRcmd(StartSeg,SelCS1);
		LCM_WRcmd(StartSeg,SelCS2);
		    for(j=64;j>0;--j)
			{
			LCM_WRdata(0x0,SelCS1);
			LCM_WRdata(0x0,SelCS2);
			}
	}
}
/******************************************************************** 
* 名称:LCM_Init
* 功能:LCM初始化
* 调用:	LCM_ClearRAM,LCM_WRcmd
* 输入:	无
* 返回值: 无
***********************************************************************/
void LCM_Init(void)     
{                       
//RSTB = 0;              
//_nop_();                  
//RSTB = 1;                
//_nop_();                 
//CS1 = 0;                 
//CS2 = 0;                
//LCM_ClearRAM();
LCM_WRcmd(StartRow,SelCS1);
LCM_WRcmd(StartRow,SelCS2); 
LCM_WRcmd(DisplayOn,SelCS1);
LCM_WRcmd(DisplayOn,SelCS2);
}
/******************************************************************** 
* 名称:LCM_Dischinese
* 功能:LCM显示一个16*16字符到指定的位置
* 调用:LCM_WRcmd;LCM_WRdata
* 输入:uchar *Char,uchar Row(1-4),uchar Col(1-8)
* 返回值: 无
***********************************************************************
void LCM_Dischinese(uchar *Char,uchar Row,uchar Col)
{
uchar DisSeg;
bit i=0,Sel;
Row = 5-Row;
Col = 9-Col;
Char = Char+31;
do{
    for(DisSeg=(Col-1)*16;DisSeg<Col*16;DisSeg++)
	{
		if(DisSeg/64==1)
			Sel = SelCS2;
		else
			Sel = SelCS1;
		LCM_WRcmd(Page0|(Row*2-2)|i,Sel);
		LCM_WRcmd(StartSeg|DisSeg%64,Sel);
		LCM_WRdata(*(Char--),Sel);
	}
	i=~i;
  }while(i);
}
/******************************************************************** 
* 名称:LCM_Disenglish
* 功能:LCM显示一个6*16字符到指定的位置
* 调用:LCM_WRcmd;LCM_WRdata
* 输入:uchar *Char,uchar Row(1-4),uchar Col(1-21)
* 返回值: 无
***********************************************************************
void LCM_Disenglish(uchar *Char,uchar Row,uchar Col)
{
uchar DisSeg;
bit i=0,Sel;
Row = 5-Row;
Col = 22-Col;
Char = Char+11;
do{
    for(DisSeg=(Col-1)*6;DisSeg<Col*6;DisSeg++)
	{
		if(DisSeg/64==1)
			Sel = SelCS2;
		else
			Sel = SelCS1;
		LCM_WRcmd(Page0|(Row*2-2)|i,Sel);
		LCM_WRcmd(StartSeg|DisSeg%64,Sel);
		LCM_WRdata(*(Char--),Sel);
	}
	i=~i;
  }while(i);
}
/******************************************************************** 
* 名称:LCM_Dischar
* 功能:LCM显示一个5*8字符到指定的位置
* 调用:LCM_WRcmd;LCM_WRdata
* 输入:uchar *Char,uchar Row(1-8),uchar Col(1-25)
* 返回值: 无
***********************************************************************/
void LCM_Dischar(uchar code *Char,uchar Row,uchar Col)
{
uchar DisSeg;
bit Sel;
Row = 9-Row;
Col = 26-Col;
Char = Char+4;
for(DisSeg=(Col-1)*5;DisSeg<Col*5;DisSeg++)
{
	if(DisSeg/64==1)
		Sel = SelCS2;
	else
		Sel = SelCS1;
	LCM_WRcmd(Page0|(Row-1),Sel);
	LCM_WRcmd(StartSeg|DisSeg%64,Sel);
	LCM_WRdata(*(Char--),Sel);
}
}
/******************************************************************** 
* 名称:LCM_Disline
* 功能:LCM显示25个5*8字符到指定的一行位置
* 调用:LCM_WRcmd;LCM_WRdata
* 输入:uchar *Char,uchar Row(1-8)
* 返回值: 无
***********************************************************************/
void LCM_Disline(uchar code *String,uchar Row)
{
uchar DisSeg,DisNum,*Char;
bit Sel;
Row = 9-Row;
String = String+24;
for(DisNum=1;DisNum<26;DisNum++)
{
	Char=Space+(*(String--)-0x20)*5+4;
	if(Char==Space+('*'-0x20)*5+4)
	continue;
	for(DisSeg=(DisNum-1)*5;DisSeg<DisNum*5;DisSeg++)
	{
		if(DisSeg/64==1)
			Sel = SelCS2;
		else
			Sel = SelCS1;
		LCM_WRcmd(Page0|(Row-1),Sel);
		LCM_WRcmd(StartSeg|DisSeg%64,Sel);
		LCM_WRdata(*(Char--),Sel);
	}
}
}
/******************************************************************** 
* 名称:LCM_Ivtchar
* 功能:LCM反显一个5*8字符到指定的位置
* 调用:LCM_WRcmd;LCM_WRdata
* 输入:uchar *Char,uchar Row(1-8),uchar Col(1-25)
* 返回值: 无
***********************************************************************/
void LCM_Ivtchar(uchar code *Char,uchar Row,uchar Col)
{
uchar DisSeg;
bit Sel;
Row = 9-Row;
Col = 26-Col;
Char = Char+4;
for(DisSeg=(Col-1)*5;DisSeg<Col*5;DisSeg++)
{
	if(DisSeg/64==1)
		Sel = SelCS2;
	else
		Sel = SelCS1;
	LCM_WRcmd(Page0|(Row-1),Sel);
	LCM_WRcmd(StartSeg|DisSeg%64,Sel);
	LCM_WRdata(~*(Char--),Sel);
}
}
/******************************************************************** 
* 名称:LCM_EEDischar
* 功能:LCM从EEPROM读16*16字模并显示一个字符到指定的位置
* 调用:LCM_WRcmd;LCM_WRdata
* 输入:uint Char,uchar Row(1-4),uchar Col(1-8)
* 返回值: 无
***********************************************************************
void LCM_EEDischar(uint Char,uchar Row,uchar Col)
{
uchar DisSeg,EEdata;
bit i=0,Sel;
Row = 5-Row;
Col = 9-Col;
Char = Char+31;
do{
    for(DisSeg=(Col-1)*16;DisSeg<Col*16;DisSeg++)
	{
		if(DisSeg/64==1)
			Sel = SelCS2;
		else
			Sel = SelCS1;
		LCM_WRcmd(Page0|(Row*2-2)|i,Sel);
		LCM_WRcmd(StartSeg|DisSeg%64,Sel);
		RandomRead(Char--,&EEdata);
		LCM_WRdata(EEdata,Sel);
	}
	i=~i;
  }while(i);
}
/******************************************************************** 
* 名称:LCM_Disdot
* 功能:在LCM指定的位置显示一个点
* 调用:LCM_WRcmd;LCM_WRdata;LCM_RDdata
* 输入:uchar Row(0-63),uchar col(0-127)
* 返回值: 无
***********************************************************************
void LCM_Disdot(uchar Row,uchar col)
{
uchar Lcm_data;
bit Sel;
Row = 63-Row;
col = 127-col;
if(col/64==1)
	Sel = SelCS2;
else
	Sel = SelCS1;
LCM_WRcmd(Page0|(Row/8),Sel);
LCM_WRcmd(StartSeg|(col%64),Sel);
LCM_RDdata(&Lcm_data,Sel);		//Dummy read
LCM_RDdata(&Lcm_data,Sel);
LCM_WRcmd(StartSeg|(col%64),Sel);
LCM_WRdata(Lcm_data|(0x01<<(Row%8)),Sel);
}
/******************************************************************** 
* 名称:LCM_Clrdot
* 功能:在LCM指定的位置消去一个点
* 调用:LCM_WRcmd;LCM_WRdata;LCM_RDdata
* 输入:uchar Row(0-63),uchar col(0-127)
* 返回值: 无
***********************************************************************
void LCM_Clrdot(uchar Row,uchar col)
{
uchar Lcm_data;
bit Sel;
Row = 63-Row;
col = 127-col;
if(col/64==1)
	Sel = SelCS2;
else
	Sel = SelCS1;
LCM_WRcmd(Page0|(Row/8),Sel);
LCM_WRcmd(StartSeg|(col%64),Sel);
LCM_RDdata(&Lcm_data,Sel);	   //Dummy read
LCM_RDdata(&Lcm_data,Sel);
LCM_WRcmd(StartSeg|(col%64),Sel);
LCM_WRdata(Lcm_data&~(0x01<<(Row%8)),Sel);
}*/

⌨️ 快捷键说明

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