📄 12864driver.h
字号:
#define LCD P0
#define uchar unsigned char
#define uint unsigned int
sbit E =P2^0; //使能
sbit RW =P2^1; //读写选择
sbit DI =P2^2; //相当于RS 数据指令选择
sbit CS2=P2^3; //右 0有效
sbit CS1=P2^4; //左
sbit RST=P2^5; //复位信号 低电平有效
//延时函数
void Delay_ms(int t)
{
int i,j;
for(i=0;i<t;i++)
{
for(j= 0; j<120; j++); //for循环120次为1ms
}
}
//状态查询函数
void Check_Busy()
{
uchar busy;
do
{
RW=1; //读出指令状态
DI=0;
LCD=0xFF; //当RW=1 E=1 DI=0(指令数据)
E=1; //指令状态分别输出到数据总线DB7 DB0 的相应位,即可从P1将指令读回
busy=LCD; //从P1读回指令状态数据
E=0; //E下降沿指令写入IR
RW=1;
DI=0;
LCD=0xFF;
E=1;
busy=LCD;
E=0;
busy=busy&0x80; //判断D7是否为0
}while(busy!=0x00);
}
//LCD命令写入函数
void W_Cmd(uchar cmd)
{
Check_Busy();
RW=0; //写入
DI=0; //DI=0写指令
LCD=cmd;
E=1; //E下降沿将指令写入IR
E=0;
}
//开显示
void LCD_On()
{
W_Cmd(0x3F); //开显示条件 RW=0 DI=0 P1=0x3F
}
//关显示
void LCD_Off()
{
W_Cmd(0x3E);
}
//初始化 显示起始行
void Set_Line(uchar line) //设定DR的数据从哪一行开始显示在屏幕的第一行
{
W_Cmd(line+0xC0); //0xC0为Z地址计数器起始地址
}
//初始化 页
void Set_Page(uchar page)
{
W_Cmd(page+0xB8); //0xB8为页的起始地址
}
//初始化 列
void Set_Column(uchar column)
{
W_Cmd(column+0x40); //0x40为列的起始地址
}
//数据写入LCD
void W_Dat(uchar dat)
{
Check_Busy();
RW=0;
DI=1; //显示数据
LCD=dat;
E=1;
E=0; //E下降沿 数据写入DR
}
//选择屏幕
void Set_Screen(unsigned char NO)
{
switch (NO)
{
case 0: CS1=0; //全选中
CS2=0;
break;
case 1: CS1=0; //左屏
CS2=1;
break;
case 2: CS1=1; //右屏
CS2=0;
break;
default: break;
}
}
//初始化函数
void LCD_Initial()
{
RST=0; //复位
Delay_ms(10);
RST=1;
Set_Screen(0);
LCD_Off();
LCD_On();
}
//清屏函数
void LCD_Clear()
{
uchar page,i;
Set_Screen(0);
for(page=0;page<8;page++) //8页
{
Set_Page(page); //初始化页
Set_Column(0); //初始化列
Set_Line(0);
for(i=0;i<64;i++) //在对DDRAM进行读写操作后 Y地址指针自动加1
{
W_Dat(0);
}
}
}
/***********汉字显示函数****************/
/* n显示的汉字个数
screen起始显示的屏
page起始显示的页数
column起始显示的列数 0~63
character字符数组
flag=1反白显示
*/
void Chinese_Disp(uchar n,uchar screen,uchar page,uchar column,uchar code *character,bit flag)
{
uint i,j,k,a=0,b=0;
if(n<=8)
{
for(i=0;i<n;i++)//显示几个字符
{
for(j=0;j<16;j++) //显示方式 上下列依次显示
{
Set_Screen(screen);
if(((i*16+column+j)>63)&&(screen==1)) //若字符将超出左屏
Set_Screen(screen+1);
/*****显示字的上半部分****/
Set_Page(page);
Set_Column((column+i*16+j)%64);
Set_Page(page);
if(flag==0)
W_Dat(character[i*32+j]);
else
W_Dat(~character[i*32+j]);
/*****显示字的下半部分****/
Set_Page(page+1);
Set_Column((column+i*16+j)%64);
if(flag==0)
W_Dat(character[i*32+16+j]);
else
W_Dat(~character[i*32+16+j]);
}
}
}
/************若字数超过8个滚动显示*****************/
if(n>8) //此处用whlie循环会导致中断不起作用 ?????
{
for(k=0;k<=(n-8)*16;k++) //左移
{
//设定一个参数a 记录每次循环显示的初始地址 循环一次后加1 若满足条件+16
for(i=0;i<8;i++)//滚动显示8个字符
{
if(i<4) Set_Screen(1);
else Set_Screen(2);
for(j=0;j<16;j++) //显示方式 上下列依次显示
{
/*****显示字的上半部分*****/
Set_Page(page);
Set_Column((i*16+j)%64);
b=a+j+i*32;
if(flag==0)
{
if(b/16%2==1) W_Dat(character[b+16]);
else W_Dat(character[b]);
}
else
{
if(b/16%2==1) W_Dat(~character[b+16]);
else W_Dat(~character[b]);
}
/*****显示字的下半部分*****/
Set_Page(page+1);
Set_Column((i*16+j)%64);
if(flag==0)
{
if(b/16%2==1) W_Dat(character[b+32]);
else W_Dat(character[b+16]);
}
else
{
if(b/16%2==1) W_Dat(~character[b+32]);
else W_Dat(~character[b+16]);
}
}
}
if(k==0) Delay_ms(1000);
//Delay_ms(1000); //画面持续时间
a++;
if(a%16==0) a+=16;
}
a--;
for(k=0;k<=(n-8)*16;k++) //右移
{
//设定一个参数a 记录每次循环显示的初始地址 循环一次后加1 若满足条件+16
for(i=0;i<8;i++)//滚动显示8个字符
{
if(i<4) Set_Screen(1);
else Set_Screen(2);
for(j=0;j<16;j++) //显示方式 上下列依次显示
{
/*****显示字的上半部分*****/
Set_Page(page);
Set_Column((i*16+j)%64);
b=a+j+i*32;
if(flag==0)
{
if(b/16%2==1) W_Dat(character[b+16]);
else W_Dat(character[b]);
}
else
{
if(b/16%2==1) W_Dat(~character[b+16]);
else W_Dat(~character[b]);
}
/*****显示字的下半部分*****/
Set_Page(page+1);
Set_Column((i*16+j)%64);
if(flag==0)
{
if(b/16%2==1) W_Dat(character[b+32]);
else W_Dat(character[b+16]);
}
else
{
if(b/16%2==1) W_Dat(~character[b+32]);
else W_Dat(~character[b+16]);
}
}
}
if(k==0) Delay_ms(1000);
//Delay_ms(1000); //画面持续时间
if(a%16==0) a-=16;
a--;
}
a=0;
}
}
/*************空白显示16行×8列**************/
void Blank_Disp(uchar n,uchar screen,uchar page,uchar column,bit flag)
{
uint i,j;
Set_Screen(screen);
for(i=0;i<n;i++) //n<8
{
Set_Page(page);
Set_Column(column+i*8);
for(j=0;j<8;j++)
{ if(flag==0)
W_Dat(0x00);
else
W_Dat(0xFF);
}
Set_Page(page+1);
Set_Column(column+i*8);
for(j=0;j<8;j++)
{
if(flag==0)
W_Dat(0x00);
else
W_Dat(0xFF);
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -