lcd_12864.h
来自「LCD12864的串行和并行的驱动程序!」· C头文件 代码 · 共 205 行
H
205 行
#ifndef LCD_12864_H
#define LCD_12864_H
#include<reg52.h>
#include"redefine.h"
sbit CS=P1^0; //串行的片选信号
sbit SID=P1^1; //串行的数据口
sbit SCLK=P1^2; //串行的同步时钟
sbit PSB=P1^3; //并串接口选择
sbit RST=P1^5; //复位端口
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 send_byte(uchar Dbyte)
{
uchar i;
for(i=0;i<8;i++)
{
SCLK=0;
Dbyte=Dbyte<<1;
SID=CY;
SCLK=1;
SCLK=0;
}
}
/**********************************************************
接收一个字节
***********************************************************/
uchar receive_byte(void)
{
uchar i,temp1,temp2;
temp1=temp2=0;
for(i=0;i<8;i++)
{
temp1=temp1<<1;
SCLK=0;
SCLK=1;
SCLK=0;
if(SID) //当SID为0时,temp1移位,低位补0,相当于记录了SID=0;
temp1++; //当SID为1,temp1移位后加一,相当于低位赋1,即记录了SID=1
}
for(i=0;i<8;i++)
{
temp2=temp2<<1;
SCLK=0;
SCLK=1;
SCLK=0;
if(SID)
temp2++;
}
return((temp1&0xf0)+(temp2&0x0f)); //读完一个字节的数据
}
/****************************************************************
检查忙状态
******************************************************************/
void check_busy(void)
{
do send_byte(0xfc); //11111,RW(1),RS(0),0
while(0x80&receive_byte());
}
/******************************************************************
写一个字节的指令
*******************************************************************/
void write_command(uchar command)
{
CS=1;
check_busy();
send_byte(0xf8); //11111,RW(0),RS(0),0
send_byte(0xf0&command);
send_byte(0xf0&command<<4);
CS=0;
}
/*************************************************************
写一个字节的数据
**************************************************************/
void write_data(uchar dat)
{
CS=1;
check_busy();
send_byte(0xfa); //11111,RW(0),RS(1),0
send_byte(0xf0&dat);
send_byte(0xf0&dat<<4);
CS=0;
}
/******************************************************************
lcd初始化函数
*******************************************************************/
void init(void)
{
RST=1;
PSB=0; //串行接法
write_command(0x30); //基本指令集动作
write_command(0x0c); //设置显示状态:整体显示
write_command(0x01); //将DDRAM的内容填满'20H',即显示“空白”
write_command(0x06); //设定游标移动方向
}
/**************************************************************
设定光标函数
***************************************************************/
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);
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 Put_Str(uchar row,uchar col,uchar *puts)
{
write_command(0x30);
write_command(position_TABLE[8*row+col]);
while(*puts!='\0')
{
if(col==8)
{
col=0;
row++;
}
if(row==4)
row=0;
write_command(position_TABLE[8*row+col]);
write_data(*puts); //此行写汉字编码的两个字节中的第一个字节
puts++; //此行使AC指向汉字编码的两个字节中的第二个字节
if(*puts!='\0')
{
write_data(*puts);
col++;
puts++;
}
}
}
/**************************************************************************
显示全屏图片
***************************************************************************/
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 + =
减小字号Ctrl + -
显示快捷键?