📄 lcm12864.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 + -