📄 lcd_12864.h
字号:
#ifndef LCD_12864p_H
#define LCD_12864p_H
#include<reg52.h>
#include"redefine.h"
#include"delay.h"
#define DB P0
sbit RS=P2^7; //并行的指令、数据选择信号
sbit RW=P2^6; //并行的读、写选择信号
sbit EN=P2^5; //并行的使能信号
sbit PSB=P2^4; //并行、串行方式的选择
sbit RST=P2^2; //复位端口
uchar code position_TABLE[]={ //坐标编码
0x80,0x81,0x82,0x83,0x84,0x85,0x86,0x87,
0x90,0x91,0x92,0x93,0x94,0x95,0x96,0x97,
0x88,0x89,0x8a,0x8b,0x8c,0x8d,0x8e,0x8f,
0x98,0x99,0x9a,0x9b,0x9c,0x9d,0x9e,0x9f,};
/****************************************************************
检查忙状态
******************************************************************/
void check_busy(void)
{
DB=0xff;
EN=0;
RS=0;
RW=1;
while(1)
{
delay10us(1);
EN=1;
delay10us(3);
if((0x80&DB==0)) break;
delay10us(1);
EN=0;
}
EN=0;
}
/******************************************************************
写一个字节的指令
*******************************************************************/
void write_command(uchar command)
{
check_busy();
EN=0;
RS=0;
RW=0;
DB=command;
delay10us(2);
EN=1;
delay10us(3);
EN=0;
}
/*************************************************************
写一个字节的数据
**************************************************************/
void write_data(uchar dat)
{
check_busy();
EN=0;
RS=1;
RW=0;
DB=dat;
delay10us(2);
EN=1;
delay10us(3);
EN=0;
}
/******************************************************************
lcd初始化函数
*******************************************************************/
void init(void)
{
RST=1;
PSB=0; //串行接法
delay10us(5);
delay10us(5);
write_command(0x30); //基本指令集动作
delay10us(5);
write_command(0x0c); //设置显示状态:整体显示
delay10us(10);
write_command(0x01); //将DDRAM的内容填满'20H',即显示“空白”
delay10us(10);
write_command(0x06); //设定游标移动方向
delay10us(10);
write_command(0x80);
}
/**************************************************************
设定光标函数
***************************************************************/
void Location_XY(uchar x,uchar y)
{
switch(x)
{
case 0: x=0x80; break;
case 1: x=0x90; break;
case 2: x=0x88; break;
case 3: x=0x98; break;
default:x=0x80;
}
y=y&0x07;
write_command(0x30);
write_command(y+x); //设定DDRAM的地址计数器AC
write_command(y+x);
}
/***********************************************************************************
清除文本
************************************************************************************/
void Clear_text()
{
uchar i;
write_command(0x30);
write_command(0x80);
for(i=0;i<64;i++) //汉字是两个字节的编码
write_data(0x20);
Location_XY(0,0);
}
/**************************************************************************************
清除图片
*****************************************************************************************/
void Clear_picture()
{
uchar i,j;
write_command(0x34); //扩充指令集动作
write_command(0x36); //打开绘图显示
for(i=0;i<32;i++) //由于在画图时,Y方向是以一个bit为单位的
{
write_command(0x80|i); //定行
write_command(0x80); //定列
for(j=0;j<32;j++) //列的32行,由12864的制造结构所决定
write_data(0);
}
}
/****************************************************************************************
显示字符串
*****************************************************************************************/
void write_Str(uchar datacode[])
{
uchar i;
while(datacode[i]!='\0')
{
write_data(datacode[i]);
i++;
if(i==0xff)break;
}
}
/****************************************************************************************
在x行y列处显示字符串
*****************************************************************************************/
void Put_Str(uchar row,uchar col,uchar string[])
{
write_command(0x30);
Location_XY(row,col);
write_Str(string);
}
/**************************************************************************
显示全屏图片
***************************************************************************/
void Put_picture(uchar *puts)
{
uint x=0,y=0;
uchar i,j; //循环变量
write_command(0x34); //扩充指令集
write_command(0x36); //开绘图显示
for(i=0;i<32;i++)
{
write_command(0x80|i); //此行用来定义“行”
write_command(0x80); //此行用来定义“列”
for(j=0;j<16;j++) //液晶的上半部分画图
{
write_data(puts[x]);
x++;
}
y=x-16;
for(j=0;j<16;j++) //液晶的下半部分画图
{
write_data(puts[y+512]);
y++;
}
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -