📄 lcd.c
字号:
Wrdata(*(a++));
col++;
}
col=bakerx;
row=bakery+5;
for(i=0;i<32;i++)
{
Wrdata(*(a++));
col++;
}
col=bakerx;
row=bakery+6;
for(i=0;i<32;i++)
{
Wrdata(*(a++));
col++;
}
col=bakerx;
row=bakery+7;
for(i=0;i<32;i++)
{
Wrdata(*(a++));
col++;
}
row=bakery;
}
/************************第一屏32*32************************/
void Screen(unsigned char *a)
{
unsigned char i,bakerx,bakery;
bakerx=col; //暂存x,y坐标,已备下半个字符使用
bakery=row;
for(i=0;i<32;i++)
{
Wrdata(*(a++)); //写输出一字节
col++;
}
col=bakerx; //列对齐
row=bakery+1;
for(i=0;i<32;i++)
{
Wrdata(*(a++));
col++;
}
col=bakerx;
row=bakery+2;
for(i=0;i<32;i++)
{
Wrdata(*(a++));
col++;
}
col=bakerx;
row=bakery+3;
for(i=0;i<32;i++)
{
Wrdata(*(a++));
col++;
}
row=bakery;
}
/**************全角字符点阵码数据输出**************************/
void Putcdot(unsigned char *a)
{
unsigned char i,bakerx,bakery;
bakerx=col; //暂存x,y坐标,已备下半个字符使用
bakery=row;
for(i=0;i<16;i++)
{
Wrdata(*(a++)); //写输出一字节
col++;
if(col==LCMLIMIT)
{
col=0;
row++;
row++; //下一列,如果列越界换行
}
if(row>6)row=0; //如果行越界,返回首行
}
col=bakerx; //列对齐
row=bakery+1; //指向下半个字符行
for(i=0;i<16;i++)
{
Wrdata(*(a++)); //写输出一字节
col++;
if(col==LCMLIMIT)
{
col=0;
row++;
row++; //下一列,如果列越界换行
}
if(row>7)row=1; //如果行越界,返回首行
}
row=bakery; //下半个字符输出结束
}
/**********************屏幕滚动定位****************************/
void Rollscreen(unsigned char x)
{
cbyte = DISPFIRST|x;
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
}
/********************清屏(全屏幕)****************************/
void Lcmcls(void)
{
for(row=0;row<8;row++)
for(col=0;col<LCMLIMIT;col++)
Wrdata(0x00);
}
/******************从液晶片上读数据,保留在全局变量中**********/
void Rddata(void)
{
Locatexy(); //坐标定位,返回时保留分区状态不变
Datalcm=0xff;
RS=1;
RW=1;
Elcm=1;
_nop_();
cbyte=Datalcm; //虚读一次
Elcm=0;
Locatexy();
Datalcm=0xff;
_nop_();
RS=1;
RW=1;
Elcm=1;
_nop_();
cbyte=Datalcm; //真读
Elcm=0;
}
/********************数据写输出********************************/
void Wrdata(unsigned char X)
{
Locatexy();
Wtcom();
RS=1;
RW=0;
Datalcm=X; //数据输出到数据口
Elcm=1; //读入到LCM
_nop_();
Elcm=0;
}
/************************命令输出到左区控制口******************/
void WrcmdL(unsigned char X)
{
LcdbusyL();
RS=0;
RW=0;
Datalcm=X;
Elcm=1;
_nop_();
Elcm=0;
}
/************************命令输出到中区控制口******************/
void WrcmdM(unsigned char X)
{
LcdbusyM();
RS=0;
RW=0;
Datalcm=X;
Elcm=1;
_nop_();
Elcm=0;
}
/************************命令输出到右区控制口******************/
void WrcmdR(unsigned char X)
{
LcdbusyR();
RS=0;
RW=0;
Datalcm=X;
Elcm=1;
_nop_();
Elcm=0;
}
/*****************分区操作允许等待,返回时保留分区选择状态*****/
void LcdbusyL(void)
{
CSB=0;
CSA=0;
Wtcom();
}
void LcdbusyM(void)
{
CSB=1;
CSA=0;
Wtcom();
}
void LcdbusyR(void)
{
CSB=0;
CSA=1;
Wtcom();
}
void Wtcom(void)
{
RS=0;
RW=1;
Datalcm=0xff;
Elcm=1;
_nop_();
while(Datalcm&LCDBUSY);
Elcm=0;
}
/****************************液晶屏初始化**********************/
void Lcminit(void)
{
cbyte=DISPOFF;
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte=DISPON;
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
cbyte=DISPFIRST;
WrcmdL(cbyte);
WrcmdM(cbyte);
WrcmdR(cbyte);
Lcmcls(); //全屏幕清屏
col=0;
row=0;
Locatexy();
}
/***************************延时(12分频)*********************/
void Delay(unsigned char ms)
{
unsigned char a,b;
while(ms!=0)
{
b=4;
while(b!=0)
{
a=0xf0;
while(a!=0)
{
a--;
};
b--;
}
ms--;
}
}
/**********根据设定的坐标数据,定位LCM上的下一个操作单元*******/
void Locatexy(void)
{
unsigned char x,y;
switch(col&0xc0)
{
case 0:
{
LcdbusyL();
break;
}
case 0x40:
{
LcdbusyM();
break;
}
case 0x80:
{
LcdbusyR();
break;
}
}
x=col&0x3f|SETX;
y=row&0x07|SETY;
Wtcom();
RS=0;
RW=0;
Datalcm=y;
Elcm=1;
_nop_();
Elcm=0;
Wtcom();
RS=0;
RW=0;
Datalcm=x;
Elcm=1;
_nop_();
Elcm=0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -