📄 lcd.c
字号:
#ifdef HY_12864B
#include "..\h\globle.h"
#include "..\h\lcd.h"
extern void RESET(void);
extern void INITIAL(void);
extern void CLEARPAGE(byte);
extern void ROLL(byte);
extern void CHAR_PR(byte,byte,byte);
byte PROMPT_X; //当前光标横坐标
byte PROMPT_Y; //当前光标纵坐标(0-7)
byte V_PROMPT_Y; //虚拟当前光标纵坐标(0--0xff)
//word V_PROMPT_Y; //虚拟当前光标纵坐标(0--0xffff)
byte BACKSPACECODE;
byte CHAR_WIDTH=16; //输出字符的宽度
byte CHAR_HEIGHTH=16; //输出字符的高度
/*
void LcdReset(void)
{
RESET();
}
*/
void LcdInit(void)
{
INITIAL();
PROMPT_X=0;
PROMPT_Y=0;
V_PROMPT_Y=0;
}
void LcdClearLine(byte line)
{
CLEARPAGE(line);
}
void LcdClearAll(void)
{
byte i;
for(i=0;i<8;i++)
CLEARPAGE(i);
}
void LcdRoll(byte pixels) //每次卷动pixels像素
{
ROLL(PROMPT_Y*8+pixels);
}
byte LcdPutOne(byte x,byte y,byte code0) //输出一个字符,(x,y)为坐标,y是行号
{
CHAR_PR(x,y,code0);
return(code0);
}
void NextLine(void)
{
byte i,line;
line=CHAR_HEIGHTH/8;
PROMPT_X=0;
V_PROMPT_Y+=line;
PROMPT_Y+=line;
if(PROMPT_Y>=TOTAL_PAGES) PROMPT_Y-=8;
if(V_PROMPT_Y>=TOTAL_PAGES)
{
LcdRoll(CHAR_HEIGHTH); //如果超出范围则自动卷动屏幕
for(i=0;i<line;i++)
LcdClearLine(PROMPT_Y+i); //并将不应该出现的行清楚
}
}
void BackSpace(void)
{
PROMPT_X-=CHAR_WIDTH;
if(PROMPT_X>=0x80) PROMPT_X=0; //只能在本行有效
LcdPutOne(PROMPT_X,PROMPT_Y,BACKSPACECODE);
}
/*
void SuperBackSpace(void)
{
byte k;
PROMPT_X-=CHAR_WIDTH;
if(PROMPT_X>=0x80)
{
k=V_PROMPT_Y; //此段代替上一行代码,可以清除上一行显示,不建议使用
V_PROMPT_Y-=CHAR_HEIGHTH/8;
if(k<V_PROMPT_Y) V_PROMPT_Y=k;
PROMPT_Y=V_PROMPT_Y%8;
}
LcdPutOne(PROMPT_X,PROMPT_Y,BACKSPACECODE);
}
*/
byte LcdPutChar(byte charcode)
{
if(charcode==LR ) NextLine(); //遇到回车符则换行
else
{
if(charcode<0x40) {CHAR_WIDTH=8;CHAR_HEIGHTH=16;BACKSPACECODE=BACKSPACECODE8_16;}
else if(charcode<0x80) {CHAR_WIDTH=6;CHAR_HEIGHTH=8;BACKSPACECODE=BACKSPACECODE8_8;} //CHAR_WIDTH=8;
else if(charcode<0xd0) {CHAR_WIDTH=16;CHAR_HEIGHTH=16;BACKSPACECODE=BACKSPACECODE16_16;}
else if(charcode<0xe0) {CHAR_WIDTH=24;CHAR_HEIGHTH=24;BACKSPACECODE=0xdf;}
else if(charcode<0xf0) {CHAR_WIDTH=32;CHAR_HEIGHTH=32;BACKSPACECODE=0xef;}
else if(charcode<0xfd) {CHAR_WIDTH=12;CHAR_HEIGHTH=16;BACKSPACECODE=BACKSPACECODE12_16;}
//else
if(charcode==BACKSPACE) BackSpace(); //退一格
else
{
if((PROMPT_X+CHAR_WIDTH)>TOTAL_X_PIXELS) NextLine(); //如果右边超出显示范围则从下一行显示,或卷页
LcdPutOne(PROMPT_X,PROMPT_Y,charcode);
PROMPT_X+=CHAR_WIDTH;
}//else BACKSPACE
}//else LR
return(charcode);
}
void Display(byte *string) //从当前坐标处开始输出字符串,具有自动换行、退格功能,能够自动卷动屏幕
{
byte i=0;
byte charcode;
while((charcode=*(string+i))!=STRING_END)
{
LcdPutChar(charcode);
i++;
} //while
}
void DisplayNumber(word number) //number为要显示的数字
{
byte NumDisplay[5];
byte i,*string;
bit rtn=0;
NumDisplay[0]=number/10000; //最高位
number-=NumDisplay[0]*10000;
NumDisplay[1]=number/1000;
number-=NumDisplay[1]*1000;
NumDisplay[2]=number/100;
number-=NumDisplay[2]*100;
NumDisplay[3]=number/10;
number-=NumDisplay[3]*10;
NumDisplay[4]=number;
string=NumDisplay;
for(i=0;(i<5)&&(rtn==0);i++) //寻找第一个不为0的数字位置//保证至少输出一个数字
{
if(*(string+i)!=0) rtn=1;
}
for(i-=1;i<5;i++)
{
LcdPutChar(*(string+i));
}
}
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -