12864有左半屏和右半屏之分,它们是两个独立的6464屏幕组合到一起的;
按汉字结构来定义,1个汉字1616;,半个屏可以显示44个汉字;
按屏幕的物理结构来定义,半个屏幕分64行64列;
由于屏幕每次只能接收8bit的数据,又将屏幕划分8行8列;这里划分行也称为页(page 0-page 7),起始页地址为0xB8 ;这里划分的列,第一列地址为0x40;
输入汉字代码之前,需要定位;
page=page<<1;等号右边的page(按汉字来划分的) 取值0,1,2,3;当左移一位相对,等号左边的page(屏幕物理结构上)取值:0,2,4,6,这几个数正是你要选择输入汉字代码的行的起始位置;
row=row8 ,等号右边的row的 取值应该0,2,4,6;必须为8的整数倍,是屏幕的物理结构规定的。你可以尝试将row的值为8,系统会默认回到0列,进行定位;
定位完成后,再进行汉字代码的输入,它输入都是有规律。
具体你还是要看12864的datasheet。
我有51的程序,可供参考。
#include "lcd12864h"
#include "zikuh"
#include <stringh>
static void delay(uint j) //延时
{
uchar i;
for(; j!=0; j--)
for(i=0; i<100; i++);
}
void busy(void)
{
uchar i;
for(i=0;i<50;i++)
_nop_();
}
void wdata(uchar wdata)
{
busy(); //忙提示
LCD_RW=0;
LCD_DI=1;
P0=wdata;
LCD_EN=0;
LCD_EN=1;
LCD_EN=0;
}
void wcode(uchar wcode)
{
busy();
LCD_RW=0;
LCD_DI=0;
P0=wcode;
LCD_EN=0;
LCD_EN=1;
LCD_EN=0;
}
void subinit()
{
delay(10);
wcode(0xc0);//设置显示初始行
}
//设置显示位置
void setxy(uchar x,uchar y)
{
if ((y>=0)&(y<=63))
{
LCD_CSA=0;
LCD_CSB=1;
}
else //if (y<=127)
{
LCD_CSA=1;
LCD_CSB=0;
}
wcode(0x40|(y%64));
wcode(0xb8|x);
P0=0xff;
}
void wdram(uchar x,uchar y,uchar dd)
{
setxy(x,y);
wdata(dd);
P0=0xff;
LCD_CSA=1;
LCD_CSB=1;
}
//复位
void Lcd_RST(void)
{
//rst=0;
LCD_REST=0;
delay(50);
LCD_REST=1;
Lcd_Clear(0,7,0,128);
wcode(0x3f);//开显示
}
//LCD初始化
void Lcd_Init(void)
{
LCD_POR=0;
Lcd_RST();
LCD_CSA=0;
LCD_CSB=1;
wcode(0x3e);subinit();
LCD_CSA=1;
LCD_CSB=0;
wcode(0x3e);subinit();
Lcd_Clear(0,7,0,128);
LCD_CSA=0;
LCD_CSB=1;
wcode(0x3f);//开显示
LCD_CSA=1;
LCD_CSB=0;
wcode(0x3f);//开显示
}
void Lcd_On(void)
{
LCD_CSA=0;
LCD_CSB=1;
wcode(0x3f);//开显示
LCD_CSA=1;
LCD_CSB=0;
wcode(0x3f);//开显示
}
//LCD 清显示屏
void Lcd_Clear(uchar StartLine,uchar StopLine,uchar StartRow,uchar StopRow)
{
uchar x,y;
for(x=StartLine; x<StopLine+1; x++)
{
for(y=StartRow; y<StopRow; y++)
{
wdram(x,y,0);
}
}
}
//显示一个汉字
void Lcd_DispOneChar(uchar x,uchar y,uchar hz,uchar disp_mode,uchar Width)
{
uchar i;
for(i=0; i<Width; i++)
{
if(disp_mode==WHITE)
{
wdram(x,y+i,(hz+i));
wdram(x+1,y+i,(hz+Width+i));
}
else
{
wdram(x,y+i,0xff-(hz+i));
wdram(x+1,y+i,0xff-(hz+Width+i));
}
}
if(Width==12)
{
for(i=12; i<14; i++)
{
if(disp_mode==WHITE)
{
wdram(x,y+i,0);
wdram(x+1,y+i,0);
}
else
{
wdram(x,y+i,0xff);
wdram(x+1,y+i,0xff);
}
}
for(i=1; i<4; i++)
{
if(disp_mode==WHITE)
{
wdram(x,y-i,0);
wdram(x+1,y-i,0);
}
else
{
wdram(x,y-i,0xff);
wdram(x+1,y-i,0xff);
}
}
}
}
void Lcd_Disp_String(uchar x,uchar y,char pString,uchar disp_mode)
{
uchar i,j;
uchar LineDispCode[16];
//strlen(),为字符串长度测量。
memset(LineDispCode,0,16); //清零数组
strcpy(LineDispCode,pString); //字符串之间的相互复制。
for(i=0; i<strlen(pString); i++)
{
LineDispCode[i]=(pString+i);
}
i=0;
while(LineDispCode[i]!=0)
{
if(LineDispCode[i]>=0xA0)
{
//显示的是汉字
for(j=0; j<ZIMO_NUM; j++)
{
if(GB_12[j]Index[0]==LineDispCode[i] &&
GB_12[j]Index[1]==LineDispCode[i+1])
{
//显示的是汉字
Lcd_DispOneChar(x,y,GB_12[j]Msk,disp_mode,12);
y+=16;
break;
}
}
i+=2;
}
else
{
//显示的是ASCII编码
for(j=0; j<ASC_NUM; j++)
{
if(ASC_12[j]Index==LineDispCode[i])
{
//显示的是汉字
Lcd_DispOneChar(x,y,ASC_12[j]Msk,disp_mode,8);
y+=8;
break;
}
}
i++;
}
if(i>=16)
{
break;
}
}
}
//显示数字
void Lcd_Disp_OneNum(uchar x,uchar y,uchar num,uchar disp_mode)
{
switch(num)
{
case 0:{Lcd_Disp_String(x,y,"0",disp_mode);}break;
case 1:{Lcd_Disp_String(x,y,"1",disp_mode);}break;
case 2:{Lcd_Disp_String(x,y,"2",disp_mode);}break;
case 3:{Lcd_Disp_String(x,y,"3",disp_mode);}break;
case 4:{Lcd_Disp_String(x,y,"4",disp_mode);}break;
case 5:{Lcd_Disp_String(x,y,"5",disp_mode);}break;
case 6:{Lcd_Disp_String(x,y,"6",disp_mode);}break;
case 7:{Lcd_Disp_String(x,y,"7",disp_mode);}break;
case 8:{Lcd_Disp_String(x,y,"8",disp_mode);}break;
case 9:{Lcd_Disp_String(x,y,"9",disp_mode);}break;
default: break;
}
}
//显示二位数。
void Disp_2num(uchar x,uchar y,uchar num,uchar disp_mode)
{
uchar ch[2];
ch[0]=num%10;
ch[1]=num/10;
Lcd_Disp_OneNum(x,y,ch[1],disp_mode);
Lcd_Disp_OneNum(x,y+8,ch[0],disp_mode);
}
//
//显示三位数。
void Disp_3num(uchar x,uchar y,uint num,uchar disp_mode)
{
uchar ch[2];
ch[0]=num/100;
ch[1]=num%100;
if(ch[0])
Lcd_Disp_OneNum(x,y, ch[0],disp_mode);
else
Lcd_Disp_String(x,y," ",disp_mode);
Disp_2num(x,y+8, ch[1],disp_mode);
}
//
//显示四位数。
void Disp_4num(uchar x,uchar y,uint num,uchar disp_mode)
{
uchar ch[4],tmp;
tmp=num/100;
ch[0]=tmp/10;
ch[1]=tmp%10;
tmp=num%100;
ch[2]=tmp/10;
ch[3]=tmp%10;
Lcd_Disp_OneNum(x,y,ch[0],disp_mode);
Lcd_Disp_OneNum(x,y+8,ch[1],disp_mode);
Lcd_Disp_OneNum(x,y+16,ch[2],disp_mode);
Lcd_Disp_OneNum(x,y+24,ch[3],disp_mode);
}
void Lcd_DispIco2(uchar x,uchar y,uchar pIco)//显示老肯图标
{
uchar i,j;
for(i=0; i<4; i++)
{
for(j=0; j<32; j++)
{
wdram(x+i,y+j,pIco);
pIco++;
}
}
}
//
//显示多位数。 disp_mode&0x10==1时,进行即每位都显示,否则大于0的位置不显示。
void Disp_NumGB16(uchar x,uchar y,ulong Data,uchar num,uchar disp_mode)
{
uchar idata ch=0,i,tmp;
for(i=0;i<num;i++)
{
tmp=Data%10;
Data/=10;
if((disp_mode&0x10)||tmp>0||Data>0||num<=2)
Lcd_Disp_OneNum(x,y+(num-i-1)8,tmp,disp_mode%10);
else
Lcd_Disp_String(x,y+(num-i-1)8," ",disp_mode%10);
}
}
以上就是关于一个关于12864的显示问题,程序如下其中页左移1位和行*8是什么意思啊,看不懂,账号没什么悬赏分意思意思全部的内容,包括:一个关于12864的显示问题,程序如下其中页左移1位和行*8是什么意思啊,看不懂,账号没什么悬赏分意思意思、stm32并口驱动12864,求大神看看我的程序错在哪了编译通过但是屏幕上没显示~搞了两天了,头疼死我了、、等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)