📄 12864a.h
字号:
#ifndef LCD_12864
#define LCD_12864
#include <intrins.h>
#include <string.h>
/*****************************I/O口定义****************************
1<------>GND 2<------>VCC
3<------>VO 4<------>D/I
5<------>R/W 6<------>E
7--14<------>D0--D7
15<----->CS2 16<----->CS1
17<----->RES 18<----->VEE
19<----->A 20<----->K
********************************************************************/
/*******************************************************************
CS1 CS2 GDM12864A
0 0 禁止使用
0 1 左区
1 0 右区
1 1 未选
********************************************************************/
#define COMMAND 0 //指令
#define DATA 1 //数据
sbit BUSY = ACC^7; //忙信号
#define LCD_data P3 //数据口
sbit RS = P1^0; //控制口,H:数据,L:指令
sbit RW = P1^1; //读写控制,H:读,L:写
sbit EN = P1^2; //使能,下降沿处理任务
sbit RST = P1^3;
sbit CS2 = P1^4; //左区
sbit CS1 = P1^5; //右区
void display_on(unsigned char);
/* L L H H H H H D *********/
#define D 0x01 //显示开,状态字ON/OFF为L
#define NO_D 0x00 //显示关,状态字ON/OFF为H
void home(unsigned char); //显示起始地址设置
/* H H L5 L4 L3 L2 L1 L0 ***/
void page(unsigned char); //页面地址设置
/* H L H H H P2 P1 P0 ******/
void address(unsigned char); //列地址设置
/* L H C5 C4 C3 C2 C1 C0 ***/
void display_picture(unsigned char,unsigned char,unsigned char *); //写显示数据
unsigned char wait(); //忙信号处理
//void read(); //读显示数据
void writelcd(unsigned char,unsigned char); //写指令或数据
void intital(); //液晶初始化函数
void delay1ms(unsigned char); //延时函数
void display_hanzi(unsigned char,unsigned char,unsigned char *);
/////////////////////////////////////具体函数如下////////////////////////////////////
/****************数据会跨区显示可能是下载线原因,把下载线拔掉就不会重叠显示了*******/
/*****************************延时函数********************************************/
void delay1ms(unsigned char count)
{
unsigned int i,j;
for(i=0;i<count;i++)
for(j=0;j<1000;j++); //不能用自加形式
}
/*****************************写函数**********************************************/
void writelcd(unsigned char style,unsigned char input)
{
// delay1ms(1); //延时不能太长,液晶处理是ns级
RS=style;
RW=0;
EN=0;
LCD_data=input; _nop_(); _nop_();
EN=1; _nop_();_nop_();
EN=0;
wait();
}
/*****************************忙处理函数*******************************************/
unsigned char wait()
{
RW=1;
RS=0; _nop_();
EN=1; _nop_();
do
{
ACC=LCD_data;
}
while(BUSY==1);
EN=0;
return ACC;
}
/******************************显示开启函数****************************************/
void display_on(unsigned char show)
{
CS1=1;CS2=1;
writelcd(COMMAND,0x3e | show);
}
/*******************************显示起始行设置函数*********************************/
void home(unsigned char back)
{
writelcd(COMMAND,0xc0 | back);
}
/*******************************页地址函数******************************************/
void page(unsigned char page)
{
writelcd(COMMAND,0xb8 | page);
}
/*******************************列地址函数*******************************************/
void address(unsigned char add)
{
writelcd(COMMAND,0x40 | add);
}
/*******************************清屏函数**********************************************/
void clearscreen()
{
unsigned char i,j;
CS1=1;CS2=1;
for(i=0;i<8;i++)
{
page(i);
address(0);
for(j=0;j<64;j++)
{
writelcd(DATA,0);
}
}
//CS1=0;CS2=0;
}
/********************************词组显示函数****************************************/
void display_hanzizu(unsigned char X ,unsigned char Y,unsigned char *tab)
{
unsigned char i=0,j=0;
unsigned char flat1,flat2,hang,lie;
flat1=tab[0]; //列宽
flat2=tab[1]/8;
if(tab[1]%8) flat2++; //行数
for(hang=X;hang<X+flat2;hang+=2) //写行
{
if(Y<=63) //列显示处理
{
CS1=1;CS2=0;
for(i=0;i<flat1;i++)
{
page(hang);
if((Y+i)>63)
{CS1=0;CS2=1;address(Y+i-64);}
else
address(Y+i);
writelcd(DATA,tab[i*2+2]);
page(hang+1);
if((Y+i)>63)
{CS1=0;CS2=1;address(Y+i-64);}
else
address(Y+i);
writelcd(DATA,tab[i*2+1+2]);
}
}
else
{
lie=Y-64;
CS1=0;CS2=1;
for(i=0;i<flat1;i++)
{
page(hang);
if((lie+i)>63)
{CS1=1;CS2=0;address(lie+i-64);}
else
address(lie+i);
writelcd(DATA,tab[i*2+2]);
page(hang+1);
if((lie+i)>63)
{CS1=1;CS2=0;address(lie+i-64);}
else
address(lie+i);
writelcd(DATA,tab[i*2+1+2]);
}
CS1=0;CS2=0;
}
}
}
/**********************************图形显示***********************************/
void display_picture(unsigned char X,unsigned char Y,unsigned char *tab)
{
unsigned char i,j;
unsigned char flat1,flat2,hang,lie;
flat1=tab[0]; //列宽
flat2=tab[1]/8;
if(tab[1]%8) flat2++; //行数
for(i=Y;i<Y+flat1;i++) //写列
{
if(i<=63) //行显示处理
{
lie=i;
CS1=1;CS2=0;
for(j=X;j<flat2+X;j++)
{
hang=j%8;
page(hang);
address(lie);
writelcd(DATA,tab[(i-Y)*flat2+j-X+2]);
}
}
else if(i>63&&i<=127)
{
lie=i-64;
CS1=0;CS2=1;
for(j=X;j<flat2+X;j++)
{
hang=j%8;
page(hang);
address(lie);
writelcd(DATA,tab[(i-Y)*flat2+j-X+2]);
}
}
else if(i>127)
{
lie=i-128;
CS1=1;CS2=0;
for(j=X;j<flat2+X;j++)
{
hang=j%8;
page(hang);
address(lie);
writelcd(DATA,tab[(i-Y)*flat2+j-X+2]);
}
}
}
CS1=0;CS2=0;
}
/*********************************汉字显示函数****************************************/
/*****************************屏幕的左右与正面对自己的左右相反************************/
/*****************************调试时程序下载完,要拔下载线,单片机复位,否则可能双屏或重叠显示*/
void display_hanzi(unsigned char X,unsigned char Y,unsigned char *tab)
{
unsigned char i;
if(Y<63)
{
CS1=1;CS2=0;
for(i=0;i<16;i++)
{
page(X);
address(Y+i);
writelcd(DATA,tab[i*2]);
page(X+1);
address(Y+i);
writelcd(DATA,tab[i*2+1]);
}
}
else
{
Y=Y-64;
CS1=0;CS2=1;
for(i=0;i<16;i++)
{
page(X);
address(Y+i);
writelcd(DATA,tab[i*2]);
page(X+1);
address(Y+i);
writelcd(DATA,tab[i*2+1]);
}
CS1=0;CS2=0;
}
}
/***********************************初始化函数*****************************************/
void intital()
{
RST=0;
delay1ms(1);
RST=1;
delay1ms(1);
display_on(D);
clearscreen();
CS1=0;CS2=0;
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -