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

📄 lcm12864.c

📁 学习12864液晶显示测试
💻 C
字号:
/*      12864液晶驱动程序(串行版)            */
/*======型号:RT12864M=======================*/
/*======驱动芯片:ST7920=====================*/
/*======程序来源:SEL=======================*/
/*======创建日期:2004.11.26=================*/
/*======修改日期:2005.03.07=================*/
/*======Copyright (c) sel.LCM 2004===========*/
/*======All Rights Reserved==================*/
/*==========================================================
      ======注意事项=======
1.欲在某一个位置显示中文字符时,应先设定显示字符位置,即先设定显示地址,再写入中文字符编码。

2.显示ASCII字符过程与显示中文字符过程相同。不过在显示连续字符时,只须设定一次显示地址,由模块自动对地址加1指向下一个字符位置,否则,显示的字符中将会有一个空ASCII字符位置。

3.ASCII字符和中文最好不要一齐写入,应该分开写入,若要一齐输入,请确保连续的ASCII字符是偶数个

4.当字符编码为2字节时,应先写入高位字节,再写入低位字节。

      ======引脚说明=======
128X64HZ 引脚说明
引脚号	引脚名称	方向	功能说明

1	VSS		-	模块的电源地
2	VDD		-	模块的电源正端
3	V0		-	LCD驱动电压输入端;与VCC间接一个变阻器调节屏幕对比度
4	RS(CS)		H/L	并行的指令/数据选择信号;串行的片选信号
5	R/W(SID)	H/L	并行的读写选择信号;串行的数据口
6	E(CLK)		H/L	并行的使能信号;串行的同步时钟
7	DB0		H/L	数据0
8	DB1		H/L	数据1
9	DB2		H/L	数据2
10	DB3		H/L	数据3
11	DB4		H/L	数据4
12	DB5		H/L	数据5
13	DB6		H/L	数据6
14	DB7		H/L	数据7
15	PSB		H/L	并/串行接口选择:H-并行;L-串行
16	NC			空脚
17	/RET		H/L	复位 低电平有效
18	Vout			负压输出
19	LED_K		-	背光源负极(LED-OV)
20	LED_A		-	背光源正极(LED+5V)

============================================================*/


// 控制引脚定义,不同的连接必须修改的部分
sbit CS=P1^5;
sbit SID=P1^6;
sbit CLK=P1^7;
//声明外调用函数
void LcdInit(void);
void LcdCursor(bit mode);
void LcdXY(unsigned char y,unsigned char x);
void LcdExpandFunEnable(bit mode);//注:未通过测试
void LcdClr(void);
void LcdNegDis(unsigned char WhichLine);
void LcdPutStr_code(unsigned char y,unsigned char x,char code *ptr);
void LcdPutStr_data(unsigned char y,unsigned char x,char data *ptr);
void LcdWriteComData(unsigned char x,bit SelComOrData);
//声明内调用函数
void Delay40ms(void);
void Delay1ms(void);

/*==========================================================
初始化液晶模块
============================================================*/
void LcdInit(void)
{ 	Delay40ms();//延时40MS
	LcdWriteComData(0x30,0);//发送指令30H,设置使用8位控制界面
	LcdWriteComData(0x30,0);//发送指令30H,设置默认使用基本指令集
	LcdWriteComData(0x0c,0);//发送指令0CH,整体显示ON,并默认不显示光标
	LcdWriteComData(0x01,0);//发送指令01H,清屏
	Delay40ms();//延时40MS
	LcdWriteComData(0x06,0);//发送指令06H,设置显示光标自动右移
}

/*==========================================================
设置光标模式,mode=1时显示闪烁的光标,否则不显示
============================================================*/
void LcdCursor(bit mode)
{	if(mode)
	{ LcdWriteComData(0x0f,0);//显示光标
	}
	else
	{ LcdWriteComData(0x0c,0);//不显示光标
	}
}
/*==========================================================
显示光标定位,纵坐标y的取值为1~4,横坐标x的取值为1~8
其实每个坐标能够显示两个ASC字符,或一个汉字
============================================================*/
void LcdXY(unsigned char y,unsigned char x)
{	unsigned char addr;
	switch (y)
	{ case 1: addr=0x7f+x;break;
	  case 2: addr=0x8f+x;break;
	  case 3: addr=0x87+x;break;
	  case 4: addr=0x97+x;break;
	  default:addr=0x80;
	}//根据不同y值计算坐标数据
	LcdWriteComData(addr,0);//写入指令addr
}
/*==========================================================
设置扩展指令集模式,mode=1则进入,0则退出
============================================================*/
void LcdExpandFunEnable(bit mode)
{
	if(mode)
	{ LcdWriteComData(0x34,0);//发送指令34H
	}
	else 
	{ LcdWriteComData(0x30,0);//发送指令30H
	}
}

/*==========================================================
液晶屏清屏
============================================================*/
void LcdClr(void)
{
	LcdWriteComData(0x01,0);//发送指令01H
}

/*==========================================================
设置反显,WhichLine指定了哪一行为反白显示
注意必须先进入扩展指令集模式
============================================================*/
void LcdNegDis(unsigned char WhichLine)
{
	if(WhichLine>4) return;
	if(WhichLine==0) return;
	LcdWriteComData((WhichLine-1)|0x04,0);//发送指令
}
/*==========================================================
在指定坐标显示字符
============================================================*/
void LcdDispChar(unsigned char y,unsigned char x,char Ch)
{ LcdXY( y, x ); // 定位显示地址
  LcdWriteComData( Ch,1 ); // 写字符
}
/*==========================================================
在指定坐标显示代码段中的字符或字符串,
支持直接指定字符或字符串,如LcdPutStr_code(2,4,"ALL RIGHT!");
============================================================*/
void LcdPutStr_code(unsigned char y,unsigned char x,char code *ptr)
{	unsigned char i,l=0;
	LcdXY(y,x);
	while (ptr[l]!='\0'){ l++;}
	for (i=0;i<l;i++)
	{ LcdWriteComData(ptr[i],1);
	}
}

/*==========================================================
在指定坐标显示内存中的字符或字符串
============================================================*/
void LcdPutStr_data(unsigned char y,unsigned char x,char data *ptr)
{	unsigned char i,l=0;
	LcdXY(y,x);
	while (ptr[l]>31){ l++;}
	for (i=0;i<l;i++)
	{ LcdWriteComData(ptr[i],1);
	}
}
/*==========================================================
写指令或数据x到液晶模块,SelComOrData=0时为写指令,1时为写数据
============================================================*/
void LcdWriteComData(unsigned char x,bit SelComOrData)
{
	unsigned char i=0;
	
	
	CS=1;
	
	SID=1;
	for(i=0;i<5;i++)
	{	CLK=0;
		CLK=1;
	}	
	CLK=0;//先发送5个同步位信号
	
	SID=0;
	CLK=1;
	CLK=0;//设置数据从MCU到LCD

	SID=SelComOrData;
	CLK=1;
	CLK=0;//设置是写命令还是数据

	SID=0;
	CLK=1;
	CLK=0;//永远是0
		

	for(i=0;i<4;i++)
	{	x<<=1;		
		SID=CY;
		CLK=1;
		CLK=0;
	}//发送数据高4位
	
	SID=0;
	for(i=0;i<4;i++)
	{	CLK=1;
		CLK=0;		
	}//发送4个0	
	
	for(i=0;i<4;i++)
	{	x<<=1;		
		SID=CY;
		CLK=1;
		CLK=0;
	}//发送数据低4位	
	
	SID=0;
	for(i=0;i<4;i++)
	{	CLK=1;
		CLK=0;
	}//发送4个0	
	
	CS=0;

	Delay1ms();//延时1MS
}

/*==========================================================
延时40个MS
============================================================*/
void Delay40ms(void)
{	unsigned int i=8000;
	while(i--){ }
}

/*==========================================================
延时一个MS
============================================================*/
void Delay1ms(void)
{	unsigned int i=200;
	while(i--){ }
}

⌨️ 快捷键说明

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