📄 gdm12864ep.c
字号:
//输入条件为:字符串地址pc,写入的行y、列位置x、字数n
LCDPrintString(unsigned char code *pd,unsigned char PlaceY,unsigned char PlaceX){
unsigned char d;
LCDSelectPlace(PlaceY,PlaceX); //第y第X列开始写字符
while(*pd)
{ //所有字符串写入LCD
d=LCDWaitLeisure(); //等待LCD空闲
LCD_DATA_DIR=TO_LCD; //准备向LCD写数据
LCD_RS=1; //选择数据寄存器
LCD_RW=0; //
LCD_E=1; //写
LCD_DATA=*pd; //等待直到LCD有空闲
LCD_E=0;
pd++;
}
}
//====================显示器清屏======================================
LCDClearScreen(){
LCDWriteCommand(Base_Module);
LCDWriteCommand(On_Screen); //关闭光标及反白
LCDWriteCommand(Clear_Display); //清除显示器及RAM内容
DelayMs(2); //等待清除
LCDWriteCommand(Right_ACAdd); //显示器地址右移
}
//================================================
//液晶显示器的初始化
void LCDInitialize(){
LCDWriteCommand(Base_Module); //基本指令集动作
DelayUs(500);
LCDWriteCommand(Base_Module); //基本指令集动作
DelayUs(500);
LCDWriteCommand(On_Screen); //打开显示器
DelayUs(200);
LCDWriteCommand(Clear_Display); //清除显示器并DDRAM
DelayMs(2);
LCDWriteCommand(Right_ACAdd); //光标方向为右增量
LCDWriteCommand(Go_Origin); //返回到原点
}
//=========向LCD自定义CGRAM中写入4个自定义字符代码,=======================
//GDM12864E只能自定义4个中文字符(16x16格式),1个中文字符由32个字节代码组成
//ucPlace=0对应CGRAM 0x40地址,1对应0x50,2对应0x60,3对应0x70
LCDInputMyCharCode(unsigned char code *pd,unsigned char ucPlace)
{
unsigned char d=0x40;
ucPlace<<=4;
d+=ucPlace;
LCDWriteCommand(Expand_Module); //扩充指令集
LCDWriteCommand(0x02); //允许设置CGRAM地址
LCDWriteCommand(Base_Module); //基本指令集
LCDWriteCommand(d); //设置CGRAM的地址
LCDWriteNByte(pd,32); //将32个代码写入CGRAM
}
//=================LCD图形区域清屏============================================
//最小清除区域1行8点,因此PlaceY=0~63行,PlaceX=8~128列;
LCDClearPicture(unsigned char PlaceY,unsigned char PlaceX,
unsigned char WidthX,unsigned char WidthY)
{
unsigned char Ix,Iy;
unsigned char YChange,x,zero=0;
x=(PlaceX)/16; //X的横轴位置
if(PlaceY>=32){x+=8;PlaceY-=32;}
LCDWriteCommand(0x36); //扩充指令集
LCDWriteCommand(0x80+PlaceY); //设置DGRAM的Y=00地址
LCDWriteCommand(0x80+PlaceX); //设置DGRAM的X=00地址
LCDWriteCommand(0x32); //基本指令集
for(Iy=WidthY+1,YChange=0;Iy!=0;Iy--,YChange++)
{
for(Ix=WidthX/8;Ix!=0;Ix--) //32个编码字节写入LCD
{
LCDWriteNByte(&zero,1);
}
LCDWriteCommand(0x36); //扩充指令集
LCDWriteCommand(0x80+PlaceY+YChange); //设置DGRAM的Y=YAddress地址
LCDWriteCommand(0x80+x); //设置DGRAM的X=00地址
LCDWriteCommand(0x32); //基本指令集
}
LCDWriteCommand(0x36); //扩充指令集
}
//=========向LCD中GDRAM写入图形代码==============================================
//n 为本图形数据总字节数,width为本图形水平宽度(一般1-4字节),PlaceX,PlaceY为x,y轴座标
//如果format=0;则图象正常显示,否则图象取反白显示
LCDPrintPicture(unsigned char code *pd,unsigned char PlaceY,unsigned char PlaceX,
unsigned char WidthX,unsigned char WidthY,unsigned char format){
unsigned char Ix,Iy,d;
unsigned char YAddress;
if(PlaceY<=2){PlaceY-=1;PlaceY*=16;}
else if(PlaceY<=4){PlaceY=0;PlaceX+=8;}
LCDWriteCommand(0x36); //扩充指令集
LCDWriteCommand(0x80+PlaceY); //设置CGRAM的Y=00地址
LCDWriteCommand(0x80+PlaceX); //设置CGRAM的X=00地址
LCDWriteCommand(0x32); //基本指令集
for(Iy=WidthY,YAddress=0;Iy!=0;Iy--,YAddress++)
{
for(Ix=WidthX/8;Ix!=0;Ix--,pd++) //32个编码字节写入LCD
{
if(format) //图象负显示
{
d=LCDWaitLeisure(); //等待LCD空闲
LCD_DATA_DIR=TO_LCD; //准备向LCD写数据
LCD_RS=1; //选择数据寄存器
LCD_RW=0; //
LCD_E=1; //写
LCD_DATA=~(*pd); //等待直到LCD有空闲
LCD_E=0;
}
else //图象正显示
{
d=LCDWaitLeisure(); //等待LCD空闲
LCD_DATA_DIR=TO_LCD; //准备向LCD写数据
LCD_RS=1; //选择数据寄存器
LCD_RW=0; //
LCD_E=1; //写
LCD_DATA=~(*pd); //等待直到LCD有空闲
LCD_E=0;
}
}
LCDWriteCommand(0x36); //扩充指令集
LCDWriteCommand(0x80+PlaceY+YAddress); //设置CGRAM的Y=YAddress地址
LCDWriteCommand(0x80+PlaceX); //设置CGRAM的X=00地址
LCDWriteCommand(0x32); //基本指令集
}
LCDWriteCommand(0x36); //扩充指令集
}
//========在LCD屏幕的指定座标x,y上描点=================================
//PlaceX,PlaceY为x,y轴座标,DotStatus=1,打点,=0清除点
//PlaceX=0~127,PlaceY=0~63
//以左上角座标为(0,0)
LCDPrintDot(unsigned char PlaceX,unsigned char PlaceY,unsigned char DotStatus)
{
unsigned char code DOT_CODE[8]={0x80,0x40,0x20,0x10,0x08,0x04,0x02,0x01};
//
unsigned char x,m0,m1,d0[2],d1[2];
//
x=(PlaceX)/16; //上半屏,X的横轴位置
m0=PlaceX/8; //点位置计算
if(PlaceY>=32){x+=8;PlaceY-=32;}//下半屏,X的横轴位置
m1=PlaceX%8; //n上的偏移量
//打点或清除点的位置
if(m0&0x01){d0[0]=0;d0[1]=DOT_CODE[m1];}//奇数字节
else {d0[0]=DOT_CODE[m1];d0[1]=0; }//偶数字节
//连续读出2字节数据===================================================
LCDWriteCommand(0x36); //扩充指令集
LCDWriteCommand(0x80+PlaceY); //设置DGRAM的Y=00地址
LCDWriteCommand(0x80+x); //设置DGRAM的X=00地址
LCDWriteCommand(0x32); //基本指令集
LCDReadNByte(d1,2); //连续读出2字节
//================================================================
if(DotStatus) //描点
{
d0[0]|=d1[0];
d0[1]|=d1[1];
}
else //清除点
{
d0[0]=(~d0[0])&d1[0];
d0[1]=(~d0[0])&d1[1];
}
//连续写入2字节数据===============================================
LCDWriteCommand(0x36); //扩充指令集
LCDWriteCommand(0x80+PlaceY); //设置CGRAM的Y=00地址
LCDWriteCommand(0x80+x); //设置CGRAM的X=00地址
LCDWriteCommand(0x32); //基本指令集
LCDWriteNByte(d0,2); //连续向LCD写入2字节数据
LCDWriteCommand(0x36); //扩充指令集
}
//=================在指定区域显示16x32格式的数字=======================
//1.无效零消隐处理:0023.98处理为23.98
//2.x轴位置范围为0-7,y轴范围为1,2,一行最多显示8个数字
//3.*pd为要显示的数据,n为数据个数(包含小数点)
//4.DotNumber小数点个数,如果为整数,则DotNumber=0
LCDPrintLargeNumber(unsigned char *pd,unsigned char n,unsigned char DotNumber,
unsigned char PlaceY,unsigned char PlaceX){
unsigned char i,j,dot;
//-------------以下为无效零消隐处理:0023.98处理为23.98
for(i=0;i<n-1-DotNumber;i++){//0. 即小数点前为0时,不能消隐,必须扣除
if((*pd)==0)pd++;
else break;
}
//-------------将有效数据在指定位置全部显示出来
j=n-i; i=j; dot=i-DotNumber;//计算小数点位置;PCODE: $00000328
for(j=0;i!=0;i--,j++,pd++){
if(j==dot){ //显示小数点
LCDPrintPicture(PDot,PlaceY,PlaceX+j,16,32,0); //.
j++;
}
switch((*pd)){ //显示有效数字
case 0: LCDPrintPicture(PNumber0,PlaceY,PlaceX+j,16,32,0);break; //0
case 1: LCDPrintPicture(PNumber1,PlaceY,PlaceX+j,16,32,0);break; //1
case 2: LCDPrintPicture(PNumber2,PlaceY,PlaceX+j,16,32,0);break; //2
case 3: LCDPrintPicture(PNumber3,PlaceY,PlaceX+j,16,32,0);break; //3
case 4: LCDPrintPicture(PNumber4,PlaceY,PlaceX+j,16,32,0);break; //4
case 5: LCDPrintPicture(PNumber5,PlaceY,PlaceX+j,16,32,0);break; //5
case 6: LCDPrintPicture(PNumber6,PlaceY,PlaceX+j,16,32,0);break; //6
case 7: LCDPrintPicture(PNumber7,PlaceY,PlaceX+j,16,32,0);break; //7
case 8: LCDPrintPicture(PNumber8,PlaceY,PlaceX+j,16,32,0);break; //8
case 9: LCDPrintPicture(PNumber9,PlaceY,PlaceX+j,16,32,0);break; //9
default: break;
}
}
for(;j<=n-1;j++)LCDClearPicture(PlaceY,PlaceX+j*16,16,32);
}
//=================进度条的显示(在x轴方向显示)=============
//1.percent为百分比0~100整数
//2.Fill[16]:x轴方向当前填充位置(0~16),填充内容,每个填充内容为8bit,1字节
//3.y轴方向为16bit,第一与最后一个bit显示0,中间14bit 为Fill值
//4.PlaceY为在第几行显示0~63
LCDPrintProgress(unsigned char percent,unsigned char PlaceY,unsigned char ShowFlag){
unsigned char FillNumber;//被填充为1的字节数
unsigned char FillBit; //被填充为1的总位数
unsigned char FillRemain;//未被填满的最后一个字内容
unsigned char Fill[16]; //进度条总字节数
unsigned char Ix,Iy,i,j,PlaceX,RealPlaceY;
unsigned char d[2]={0xf0,0xf0};
unsigned int uiTemp;
uiTemp=(unsigned int)(percent)*127+50;
FillBit=(unsigned char)(uiTemp/100); //需要填满1的个数
FillNumber=(unsigned char)(FillBit/16); //填满0xff的字节数
FillRemain=(FillBit)%16; //未填满0xffff
for(i=0;i<=15;i++){
if((i<=FillNumber*2-1)&&(FillNumber!=0))Fill[i]=0xff;
else Fill[i]=0x00;
}
if(FillRemain){
if(FillNumber==7)uiTemp=~(0xffff>>(FillRemain+1));
else uiTemp=~(0xffff>>FillRemain);
Fill[FillNumber*2]=(unsigned char)(uiTemp>>8);
Fill[FillNumber*2+1]=(unsigned char)(uiTemp&0x00ff);
}
//------------------------------------------------------
if(PlaceY>=3) PlaceX=8; //确定X轴的确切位置
else PlaceX=0;
//---------计算实际Y轴的位置
if(PlaceY==1||PlaceY==3)RealPlaceY=0;//上半屏与下半屏的第一行
else RealPlaceY=16; //上半屏与下半屏的第二行
LCDWriteCommand(0x36); //扩充指令集
LCDWriteCommand(0x80+RealPlaceY); //设置DGRAM的Y轴值
LCDWriteCommand(0x80+PlaceX); //设置DGRAM的X轴值
LCDWriteCommand(0x32); //基本指令集
for(j=0,Iy=0;j<=7;j++)
{
for(Iy=0,Ix=0;Iy<=15;Iy++)
{
LCDWriteCommand(0x36); //扩充指令集
LCDWriteCommand(0x80+RealPlaceY+Iy);//设置DGRAM的Y轴位置
LCDWriteCommand(0x80+PlaceX+j); //设置DGRAM的X轴位置
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -