📄 lcd12864.c
字号:
#include"reg52.h"
#include"IOCfg.c"
#include"Config.h"
#include"LCD12864.h"
#include"delay.h"
/*********************************************************************************
管脚号 管脚名称 电平 管脚功能描述
1 VSS 0V 电源地
2 VCC +5V 电源正
3 V0 - 对比度(亮度)调整
4 RS(CS) H/L RS="H",表示DB7--DB0为显示数据
4 RS(CS) H/L RS="L",表示DB7--DB0为显示指令数据
5 R/W(SID) H/L R/W="H",E="H",数据被读到DB7--DB0
5 R/W(SID) H/L R/W="L",E="H→L", DB7--DB0的数据被写到IR或DR
6 E(SCLK) H/L 使能信号
7 DB0 H/L 三态数据线
8 DB1 H/L 三态数据线
9 DB2 H/L 三态数据线
10 DB3 H/L 三态数据线
11 DB4 H/L 三态数据线
12 DB5 H/L 三态数据线
13 DB6 H/L 三态数据线
14 DB7 H/L 三态数据线
15 PSB H/L H:8位或4位并口方式,L:串口方式(见注释1)
16 NC - 空脚
17 /RESET H/L 复位端,低电平有效(见注释2)
18 VOUT - LCD驱动电压输出端
19 A VDD 背光源正端,要加限流电阻(+5V)(见注释3)
20 K VSS 背光源负端(见注释3)
------------------------------------------------------------------------------
点阵和字符重合显示的时候不会覆盖,要先清除
字符和点阵重合显示的时候,要分别清除掉
1.上电时先复位端口
2.设置屏内部
3.显示点阵时设置点阵模式,显示字符时设置字符模式,图像有重合时要清掉先前送的不同类显示数据
4.最少要零点几秒就刷新整屏数据,以免有干扰出现数据乱码显示
5.屏幕的刷新频率不能太高,10HZ时屏幕没出现干扰线或噪点
6.12864屏在读数据的时候要空读一次才能正确读出数据
7.想用8*16的点阵显示,程序还不太复杂,单独操作每个点就以后再弄,先弄到能正常显示参数和菜单
************************************************************************************/
//----------------------------------------------------------------------
//定义MCU与LCD的接口
//----------------------------------------------------------------------
/******************************************************************
// 函数名:lcd_delayms
// 功 能:精确延时1mS
// 参 数:输入延时毫秒数(0-65535)
// 返回值:无
晶振频率:22.1184MHz ,循环次数是229 ;
******************************************************************/
void lcd_delayms(unsigned int i) //使用22.1184M时的延时循环次数
{
unsigned int j;
for(;i!=0;i--)
{
for(j = 0; j < 229; j++);
}
}
/************************************************************************************
查忙函数
//RS=0;RW=1;wait=0闲;wait!=0忙
************************************************************************************/
void busy(void)
{
uchar wait;
RS = 0;
RW = 1;
E = 1;
for(;;)
{
wait = DB;
wait &= 0x80;
if(wait == 0)break;
}
E = 0;
DB = 0XFF;
}
/************************************************************************************
写指令函数
//RS=0;RW=0;E下降沿
************************************************************************************/
void w_code(uchar c)
{
busy();
RS=0;
RW=0;
DB=c;
E=1;
E=0;
DB=0xff;
}
/************************************************************************************
写数据函数
//RS=1;RW=0;E下降沿
************************************************************************************/
void w_data(uchar d)
{
busy();
RS = 1;
RW = 0;
DB = d;
E = 1;
E = 0;
DB = 0xff;
}
/************************************************************************************
指定地址写数据函数
x:
y:
i: 数据
************************************************************************************/
void w_data_addr(uchar x,uchar y,uchar i)
{
w_code(y);
w_code(x);
w_data(i);
}
/************************************************************************************
读数据函数
12864屏在读数据的时候要空读一次才能正确读出数据
************************************************************************************/
uchar r_data(void)//RS=1;RW=1;E下降沿
{
uchar rd_lcd;
busy();
RS=1;
RW=1;
E=1;
E=0;
busy();
RS=1;
RW=1;
E=1;
rd_lcd=DB;
E=0;
return rd_lcd;
}
/************************************************************************************
读指定地址的数据函数
x: x轴地址
y: y轴地址
************************************************************************************/
uchar r_data_addr(uchar x,uchar y)
{
uchar i;
w_code(y);
w_code(x);
i = r_data();
return i;
}
/************************************************************************************
初始化液晶屏
上电复位液晶屏
************************************************************************************/
void lcd_rst(void)
{
/*********上电复位,大于40毫秒***********************/
LCD_RST = 0;
lcd_delayms(50);
LCD_RST = 1;
w_code(0x30);// 功能设置---8BIT控制界面,绘图显示ON
lcd_delayms(1);
w_code(0x01);// 清屏
lcd_delayms(1);
w_code(0x0c);// 功能设置---8BIT控制界面,扩充指令集
lcd_delayms(15);
w_code(0x32);//32
w_code(0x36);//36
}
/************************************************************************************
---------------------------写8*16阵数据
************************************************************************************/
void write_lcd_0816(uchar x1,uchar y1,uchar * zz,bit fanbai)
{
uchar a,y,x,z,i = 0;
if((x1 % 2) == 0)
{
x1 = x1 / 2;
for(a = 0;a < 16;a++)
{
y = y1;
x = x1;
/**/
if(y < 16)
{
x = x + 0x80;
y = y + 0x80;
}
if((y >= 16) && (y < 32))
{
x = x + 0x90;
y = y + 0x80;
}
if((y >= 32) && (y < 48))
{
x = x + 0x88;
y = (y - 32) + 0x80;
}
if((y >= 48) && (y < 64))
{
x = x + 0x98;
y = (y - 32) + 0x80;
}
w_code(y);
y1++;
w_code(x);
if(fanbai == 0)
{
w_data(zz[i]);
}
else
{
w_data(~zz[i]);
}
i++;
}
}
else
{
x1 = x1 / 2;
for(a = 0;a < 16;a++)
{
y = y1;
x = x1;
/**/
if(y < 16)
{
x = x + 0x80;
y = y + 0x80;
}
if((y >= 16) && (y < 32))
{
x = x + 0x90;
y = y + 0x80;
}
if((y >= 32) && (y < 48))
{
x = x + 0x88;
y = (y - 32) + 0x80;
}
if((y >= 48) && (y < 64))
{
x = x + 0x98;
y = (y - 32) + 0x80;
}
w_code(y);
w_code(x);
z = r_data();
w_code(y);
w_code(x);
w_data(z);
if(fanbai == 0)
{
w_data(zz[i]);
}
else
{
w_data(~zz[i]);
}
y1++;
i++;
}
}
}
/************************************************************************************
/************************************************************************************
---------------------------写16*16阵数据
************************************************************************************/
void write_lcd_1616(uchar x1,uchar y1,uchar code * zz,bit fanbai)
{
data uchar a,y,x,i = 0;
for(a = 0;a < 16;a++)
{
y = y1;
x = x1;
/**/
if(y < 16)
{
x = x + 0x80;
y = y + 0x80;
}
if((y >= 16) && (y < 32))
{
x = x + 0x90;
y = y + 0x80;
}
if((y >= 32) && (y < 48))
{
x = x + 0x88;
y = (y - 32) + 0x80;
}
if((y >= 48) && (y < 64))
{
x = x + 0x98;
y = (y - 32) + 0x80;
}
w_code(y);
y1++;
w_code(x);
if(fanbai == 0)
{
w_data(zz[i]);
i++;
w_data(zz[i]);
i++;
}
else
{
w_data(~zz[i]);
i++;
w_data(~zz[i]);
i++;
}
}
}
/************************************************************************************
---------------------------清0 16*16阵数据
************************************************************************************/
void write_lcd_1616_clr(uchar x1,uchar y1)
{
data uchar a,y,x,i = 0;
for(a = 0;a < 16;a++)
{
y = y1;
x = x1;
if(y < 16)
{
x = x + 0x80;
y = y + 0x80;
}
if((y >= 16) && (y < 32))
{
x = x + 0x90;
y = y + 0x80;
}
if((y >= 32) && (y < 48))
{
x = x + 0x88;
y = (y - 32) + 0x80;
}
if((y >= 48) && (y < 64))
{
x = x + 0x98;
y = (y - 32) + 0x80;
}
w_code(y);
y1++;
w_code(x);
w_data(0);
i++;
w_data(0);
i++;
}
}
/************************************************************************************
写整屏点阵数据
************************************************************************************/
void write_lcd_full(uchar * img )
{
uint x2 = 0;
idata uchar i,j,a;
j = 0x80;
for(a = 0;a < 32;a++)
{
w_code(j);
j++;
w_code(0x80);
for(i = 0;i < 16;i ++)
{
w_data(img[x2]);
x2++;
}
}
j = 0x80;
for(a = 0;a < 32;a++)
{
w_code(j);
j++;
w_code(0x88);
for(i = 0;i < 16;i ++)
{
w_data(img[x2]);
x2++;
}
}
}
/************************************************************************************
---------------------------清屏函数
---------------------------把所有的点都写0
************************************************************************************/
void lcd_clr()
{
idata uchar i,j,a;
j = 0x80;
for(a = 0;a < 32;a++)
{
w_code(j);
j++;
w_code(0x80);
for(i = 0;i < 16;i ++)
{
w_data(0x00);
}
}
j = 0x80;
for(a = 0;a < 32;a++)
{
w_code(j);
j++;
w_code(0x88);
for(i = 0;i < 16;i ++)
{
w_data(0x00);
}
}
}
/************************************************************************************
设置绘图模式
************************************************************************************/
void set_huitu(void)
{
w_code(0x32);//32
w_code(0x36);//36
}
/************************************************************************************
设置字符模式
************************************************************************************/
void set_zifu(void)
{
w_code(0x30);//30
}
/************************************************************************************
//向LCM发送一个字符串,长度64字符之内。
************************************************************************************/
void lcm_w_word(uchar x,uchar y,uchar *str)
{
x = x+y;
w_code(x);
while(*str != '\0')
{
w_data(*str++);
}
*str = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -