📄 12864.h
字号:
#ifndef _12864_H__
#define _12864_H__
/****检查液晶是否忙碌***/
void chekbusy12864(void)
{
uchar dat;
RS=0; //指令模式
RW=1; //读数据
do{
P0=0x00;
E=1;
dat=P0&0x80;
E=0;
}while(dat!=0x00);
}
/****选屏****/
void choose12864(uchar i)//i是要写的屏.0是左屏,1是右屏,2是双屏
{
switch (i)
{
case 0: CS1=0;CS2=1;break;
case 1: CS1=1;CS2=0;break;
case 2: CS1=0;CS2=0;break;
default: break;
}
}
/******写命令*****/
void cmd_w12864(uchar cmd) //写命令
{
chekbusy12864();
RS=0; //指令模式
RW=0; //写模式
E=1;
P0=cmd;
E=0;
}
/****写数据******/
void dat_w12864(uchar dat)
{
chekbusy12864();
RS=1;
RW=0;
E=1;
P0=dat;
E=0;
}
/*****清屏*****/
void clear12864()
{
uchar page,row,i;
for(i=0;i<2;i++)
{
choose12864(i);
for(page=0xb8;page<0xc0;page++)
{
cmd_w12864(page); //x地址设置,x地址需指令加1
cmd_w12864(0x40); //y地址设置,y地址在写入数据后会加1
for(row=0;row<64;row++)
{
dat_w12864(0x00);
}
}
}
}
/*******选择性清屏或填充(一次清除/填充一列的8点)*******/
void chsfill(uchar ch,uchar row,uchar page,uchar ads) //row=0~64、page=0~7
{
choose12864(ch);
cmd_w12864(row+0x40);
cmd_w12864(page+0xb8);
dat_w12864(ads);
}
/***初始化****/
void init12864(void)
{
chekbusy12864();
cmd_w12864(0xc0); //设置起始行,此为0行开始。
cmd_w12864(0x3f); //显示器开,0x3e为关
}
/**8X8字符的显示*/
/******************
其中: ch:要写的屏.0是左屏,1是右屏,2是双屏
row:从哪一列开始显示,每一屏有0~7列
page:从哪一行开始显示,0~7
*adr:数据地址
*******************/
void play88(uchar ch,uchar row,uchar page,uchar *adr)
{
uchar i;
choose12864(ch);
row=row*8;//每个屏分成8个8位的列,每个字母数字占一列,每个汉字占两列
cmd_w12864(row+0x40);
cmd_w12864(page+0xb8);
for(i=0;i<8;i++)
{
dat_w12864(*(adr+i));
}
}
/**8X16字符的显示*/
/******************
其中: ch:要写的屏.0是左屏,1是右屏,2是双屏
row:从哪一列开始显示,每一屏有0~7列
page:从哪一行开始显示,0~3
*adr:数据地址
*******************/
void play816(uchar ch,uchar row,uchar page,uchar *adr,bit stype)
{
uchar i;
choose12864(ch);
page=page*2; //行地址(x地址)范围为0~7,每一个为8位,而字的竖向都占16位,所以page为0,2,4,6。
row=row*8;//每个屏分成8个8位的列,每个字母数字占一列,每个汉字占两列
if(stype==0)
{
cmd_w12864(row+0x40);
cmd_w12864(page+0xb8);
for(i=0;i<8;i++)
{
dat_w12864(*(adr+i));
}
cmd_w12864(row+0x40);
cmd_w12864(page+0xb9);
for(i=8;i<16;i++)
{
dat_w12864(*(adr+i));
}
}
else
{
cmd_w12864(row+0x40);
cmd_w12864(page+0xb8);
for(i=0;i<8;i++)
{
dat_w12864(~(*(adr+i)));
}
cmd_w12864(row+0x40);
cmd_w12864(page+0xb9);
for(i=8;i<16;i++)
{
dat_w12864(~(*(adr+i)));
}
}
}
/*************************
全屏显示图形(128*64)
*************************/
void disppc12864(uchar *adr)
{
uchar i,j;
for(j=0;j<8;j++)
{
choose12864(0);
cmd_w12864(0x40);
cmd_w12864(j+0xb8);
for(i=0;i<64;i++)
{
dat_w12864(*(adr+i+128*j));
}
choose12864(1);
cmd_w12864(0x40);
cmd_w12864(j+0xb8);
for(i=64;i<128;i++)
{
dat_w12864(*(adr+i+128*j));
}
}
}
/**16X16显示**/
/******************
其中: ch:要写的屏.0是左屏,1是右屏,2是双屏
row:从哪一列开始显示,每一屏有0~7列
page:从哪一行开始显示,0~3
*adr:数据地址,字模软件里设置:CADB,右旋90度
数据输入方式:先上8行从左到右一列列输入,后下8行从左到右一列列输入
*******************/
void play1616(uchar ch,uchar row,uchar page,uchar *adr)
{
uchar i;
choose12864(ch);
page=page*2;
row=row*8;
cmd_w12864(row+0x40);
cmd_w12864(page+0xb8);
for(i=0;i<16;i++)
{
dat_w12864(*(adr+i));
}
cmd_w12864(row+0x40);
cmd_w12864(page+0xb9);
for(i=16;i<32;i++)
{
dat_w12864(*(adr+i));
}
}
/**16X32显示**/
/******************
其中: ch:要写的屏.0是左屏,1是右屏,2是双屏
row:从哪一列开始显示,每一屏有0~7列
page:从哪一行开始显示,0~3
*adr:数据地址,字模软件里设置:CADB,右旋90度
数据输入方式:先上8行从左到右一列列输入,后下8行从左到右一列列输入
*******************/
void play1632(uchar ch,uchar row,uchar page,uchar *adr)
{
uchar i;
choose12864(ch);
page=page*2;
row=row*8;
cmd_w12864(row+0x40);
cmd_w12864(page+0xb8);
for(i=0;i<16;i++)
{
dat_w12864(*(adr+i));
}
cmd_w12864(row+0x40);
cmd_w12864(page+0xb9);
for(i=16;i<32;i++)
{
dat_w12864(*(adr+i));
}
cmd_w12864(row+0x40);
cmd_w12864(page+0xba);
for(i=32;i<48;i++)
{
dat_w12864(*(adr+i));
}
cmd_w12864(row+0x40);
cmd_w12864(page+0xbb);
for(i=48;i<64;i++)
{
dat_w12864(*(adr+i));
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -