📄 12864j.c.bak
字号:
/********************************************************
* 12864J液晶显示器
*12864J:1.图形点阵液晶显示器,分辨率为128X64。可显示图形
* 和8×4个(16×16点阵)汉字。
* 2.采用8位数据总线并行输入输出和8条控制线。
* 3.指令简单,7种指令
********************************************************/
//xdata unsigned char WR_COM_AD_L _at_ 0xF004; //写左半屏指令地址
//xdata unsigned char WR_COM_AD_R _at_ 0xF000; //写右半屏指令地址
//xdata unsigned char WR_DATA_AD_L _at_ 0xF006; //写左半屏数据地址
//xdata unsigned char WR_DATA_AD_R _at_ 0xF002; //写右半屏数据地址
//xdata unsigned char RD_BUSY_AD _at_ 0xF001; //查忙地址
//xdata unsigned char RD_DATA_AD _at_ 0xF003; //读数据地址
#define DI P1.0
#define WR P1.1
#define E P1.2
#define CS1 P1.3
#define CS2 P1.4
#define RST P1.5
#define data P0
#define X 0xB8 //起始显示行基址
#define Y 0x40 //起始显示列基址
#define FirstLine 0xC0 //起始显示行
//***************************************
//基本控制
//***************************************
//写左半屏控制指令
void WRComL(unsigned char _data)
{
CS1=1;
CS2=1;
DI=0;
WR=0;
data = _data;
CS1=0;
delay();
CS1=1;
//while (RD_BUSY_AD & 0x80) //检查液晶显示是否处于忙状态
//{;}
}
//写右半屏控制指令
void WRComR(unsigned char _data)
{
//WR_COM_AD_R = _data;
//while (RD_BUSY_AD & 0x80) //检查液晶显示是否处于忙状态
//{;}
CS1=1;
CS2=1;
DI=0;
WR=0;
data = _data;
delay();
CS2=0;
CS2=1;
}
//写左半屏数据
void WRDataL(unsigned char _data)
{
CS1=1;
CS2=1;
DI=1;
WR=0;
data = _data;
CS1=0;
delay();
CS1=1;
}
//写右半屏数据
void WRDataR(unsigned char _data)
{
WR_DATA_AD_R = _data;
while (RD_BUSY_AD & 0x80) //检查液晶显示是否处于忙状态
{;};
}
//显示左半屏数据,count-显示数据个数
void DisplayL(unsigned char *pt, char count)
{
while (count--)
{
WRDataL(*pt++); //写左半屏数据
}
}
//显示右半屏数据,count-显示数据个数
void DisplayR(unsigned char * pt, char count)
{
while (count--)
{
WRDataR(*pt++); //写右半屏数据
}
}
//设置左半屏起始显示行列地址,x-X起始行序数(0-7),y-Y起始列序数(0-63)
void SETXYL(unsigned char x, unsigned char y)
{
WRComL(x+X); //行地址=行序数+行基址
WRComL(y+Y); //列地址=列序数+列基址
}
//设置右半屏起始显示行列地址,x:X起始行序数(0-7),y:Y起始列序数(0-63)
void SETXYR(unsigned char x, unsigned char y)
{
WRComR(x+X); //行地址=行序数+行基址
WRComR(y+Y); //列地址=列序数+列基址
}
//***************************************
//显示图形
//***************************************
//显示左半屏一行图形,A-X起始行序数(0-7),B-Y起始列地址序数(0-63)
void LineDisL(unsigned char x, unsigned char y, unsigned char * pt)
{
SETXYL(x,y); //设置起始显示行列
DisplayL(pt, 64); //显示数据
}
//显示右半屏一行图形,A-X起始行地址序数(0-7),B-Y起始列地址序数(0-63)
void LineDisR(unsigned char x, unsigned char y, unsigned char * pt)
{
SETXYR(x,y); //设置起始显示行列
DisplayR(pt, 64); //显示数据
}
//***************************************
//显示字体,显示一个数据要占用X行两行位置
//***************************************
//右半屏显示一个字节/字:x-起始显示行序数X(0-7);y-起始显示列序数Y(0-63);pt-显示字数据首地址
void ByteDisR(unsigned char x, unsigned char y,unsigned char * pt)
{
SETXYR(x,y); //设置起始显示行列地址
DisplayR(pt, 8); //显示上半行数据
SETXYR(x+1,y); //设置起始显示行列地址
DisplayR(pt+8, 8); //显示下半行数据
}
void WordDisR(unsigned char x, unsigned char y,unsigned char * pt)
{
SETXYR(x,y); //设置起始显示行列地址
DisplayR(pt, 16); //显示上半行数据
SETXYR(x+1,y); //设置起始显示行列地址
DisplayR(pt+16, 16); //显示下半行数据
}
//左半屏显示一个字节/字:x-起始显示行序数X(0-7);y-起始显示列序数Y(0-63);pt-显示字数据首地址
void ByteDisL(unsigned char x, unsigned char y,unsigned char * pt)
{
SETXYL(x,y); //设置起始显示行列地址
DisplayL(pt, 8); //显示上半行数据
SETXYL(x+1,y); //设置起始显示行列地址
DisplayL(pt+8, 8); //显示下半行数据
}
void WordDisL(unsigned char x, unsigned char y,unsigned char * pt)
{
SETXYL(x,y); //设置起始显示行列地址
DisplayL(pt, 16); //显示上半行数据
SETXYL(x+1,y); //设置起始显示行列地址
DisplayL(pt+16, 16); //显示下半行数据
}
//清屏
void LCDClear()
{
//清左半屏
unsigned char x,y;
char j;
x = 0; //起始行,第0行
y = 0; //起始列,第0列
for (x = 0; x < 8; x++) //共8行
{
SETXYL(x,y); //设置起始显示行列地址
j = 64;
while (j--)
WRDataL(0);
}
//清右半屏
x = 0; //起始行,第0行
y = 0; //起始列,第0列
for (x = 0; x < 8; x++) //共8行
{
SETXYR(x,y); //设置起始显示行列地址
j = 64;
while (j--)
WRDataR(0);
}
}
//液晶初始化
void LCD_INIT()
{
WRComL(0x3e); //初始化左半屏,关显示
WRComL(FirstLine); //设置起始显示行,第0行
WRComR(0x3e); //初始化右半屏,关显示
WRComR(FirstLine); //设置起始显示行,第0行
LCDClear(); //清屏
WRComL(0x3f); //开显示
WRComR(0x3f); //开显示
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -