📄 lcd.c
字号:
TL++;
}
break;
case 0x85: Y=Y%8; //12点阵
Z=Y*128+X;
ZL=Z+128;
T=CHAR*24;
TL=T+12;
for(i=0;i<12;i++)
{
LcdBuf[Z]=~ (HZ_12[T]|0x01);
LcdBuf[ZL]=~ HZ_12[TL];
Z++;
T++;
ZL++;
TL++;
}
break;
default: break;
}
}
/*
void InitLcd(void)
{
LcdCmd(0x3e); //关显示器
delay(40);
LcdCmd(0x3f); //开显示器
delay(40); // Y
LcdCmd(0x3f); //开显示器
delay(40); // Y
LcdCmd(0xc0); //定义显示起始行为0 ^
delay(40); // |
LcdCmd(0xb8); //设定Y地址为0(0—8) |
delay(40); // |
LcdCmd(0x40); //设定X地址为0 ( 0—63) -------------> X
delay(40);
LcdClr();
}
*/
void OutString(unsigned int *STRING, unsigned int tt,const unsigned char *Adr,unsigned int TYPE)/*字符串输出*/
{
unsigned char XX,YY,Len,i;
Len=*Adr; Adr=Adr+1;
STRING=STRING+tt;
for(i=0;i<Len;i++)
{
XX=*Adr; Adr=Adr+1;
YY=*Adr; Adr=Adr+1;
LcdPutc(XX,YY,*STRING,TYPE);STRING=STRING+1;
}
}
void OutStringCur(unsigned int *STRING, unsigned int dt,const unsigned char *Adr,unsigned int at,unsigned int tt,unsigned int TYPE)/*字符串输出*/
{
unsigned char XX,YY,Len,i;
Len=tt; Adr=Adr+1+at;
STRING=STRING+dt;
for(i=0;i<Len;i++)
{
XX=*Adr; Adr=Adr+1;
YY=*Adr; Adr=Adr+1;
LcdPutc(XX,YY,*STRING,TYPE);STRING=STRING+1;
}
}
void OutStringCurxy(UINT *STRING, UINT dt,const unsigned char *Adr,UINT at,UINT dy,UINT tt,UINT TYPE)/*字符串输出*/
{
unsigned char XX,YY,Len,i;
Len=tt; Adr=Adr+1+at;
STRING=STRING+dt;
for(i=0;i<Len;i++)
{
XX=*Adr; Adr=Adr+1;
YY=*Adr; Adr=Adr+1;
LcdPutc(XX,YY-dy,*STRING,TYPE);STRING=STRING+1;
}
}
void MAP(UINT X1,UINT Y1,UINT X2,UINT Y2,const unsigned char *Table)
{
unsigned int n,i,j,m;
for(j=Y1;j<=Y2;j++)
{
n=(X2-X1+1)*(j-Y1);
m=j*128+X1;
for(i=X1;i<=X2;i++)
{
LcdBuf[m+i-X1]=Table[n+i-X1];
};
};
}
void DspMenu(unsigned int num,unsigned int tt,unsigned int AdrNum,unsigned int Type)/*显示菜单*/
{//num-菜单序号 tt-菜单字符串起始位置 AdrNum-菜单字符串输出地址
OutString((unsigned int *)Menu[num],tt,MenuAdr[AdrNum],Type);/* Type=2=HZK16 ,Type=1=ASC8 */
}
void DspMenuCur(unsigned int num,unsigned int dt,unsigned int AdrNum,unsigned int at,unsigned int tt,unsigned int Type)/*显示菜单*/
{//num-菜单序号 dt-菜单字符串起始位置 AdrNum-菜单字符串输出地址
//at-菜单字符串输出地址起始位置
//tt-菜单字符串输出长度
OutStringCur((unsigned int *)Menu[num],dt,MenuAdr[AdrNum],at,tt,Type);/* Type=2=HZK16 ,Type=1=ASC8 */
}
void DspMenuCurxy(UINT num,UINT dt,UINT AdrNum,UINT at,UINT dy,UINT tt,UINT Type)/*显示菜单*/
{ //num-菜单序号 dt-菜单字符串起始位置 AdrNum-菜单字符串输出地址
//at--菜单字符串输出地址起始位置
//tt--菜单字符串输出长度
//dy--菜单字符串输出Y地址偏移量
OutStringCurxy((UINT *)Menu[num],dt,MenuAdr[AdrNum],at,dy,tt,Type);/* Type=2=HZK16 ,Type=1=ASC8 */
}
/*
void atoihex(unsigned int Q,struct Asc_st FARDATA *Temptr)
{
Temptr->b[0]=Q%16;Q=Q/16;
Temptr->b[1]=Q%16;Q=Q/16;
Temptr->b[2]=Q%16;Q=Q/16;
Temptr->b[3]=Q%16;Q=Q/16;
}
void atochex(unsigned char Q,struct Asc_st FARDATA *Temptr)
{
Temptr->b[0]=Q%16;Q=Q/16;
Temptr->b[1]=Q%16;Q=Q/16;
}
*/
struct SYSTIME LoadTime(void)
{
struct SYSTIME Systime;
register unsigned long portid;
register unsigned char value;
unsigned int ii[10],i;
unsigned int ch[2];
ii[0]=Sys_Second;
ii[1]=Sys_Minute;
ii[2]=Sys_Hour;
ii[3]=Sys_Day;
ii[4]=Sys_Month;
ii[5]=Sys_Year;
ii[6]=Sys_Century;
for(i=0;i<7;i++)
{
ch[0]=ii[i]%10; ii[i]=ii[i]/10;
ch[1]=ii[i]%10;
switch(i)
{
case 0x00:Systime.second=Sys_Second;
Systime.TBUF[13]=ch[0];
Systime.TBUF[12]=ch[1];
break;
case 0x01:Systime.minute=Sys_Minute;
Systime.TBUF[11]=ch[0];
Systime.TBUF[10]=ch[1];
break;
case 0x02:Systime.hour=Sys_Hour;
Systime.TBUF[9]=ch[0];
Systime.TBUF[8]=ch[1];
break;
case 0x03:Systime.date=Sys_Day;
Systime.TBUF[7]=ch[0];
Systime.TBUF[6]=ch[1];
break;
case 0x04:Systime.month=Sys_Month;
Systime.TBUF[5]=ch[0];
Systime.TBUF[4]=ch[1];
break;
case 0x05:Systime.year=Sys_Year;
Systime.TBUF[3]=ch[0];
Systime.TBUF[2]=ch[1];
break;
case 0x06:Systime.century=20;
Systime.TBUF[1]=0;
Systime.TBUF[0]=2;
break;
default: break;
}
}
return (Systime);
}
void CursorGotoXy(UINT *STRING, const unsigned char *Adr,UINT TYPE)
{
unsigned char XX,YY,Len,i;
unsigned char *addr;
unsigned int *CharPtr;
CharPtr=(unsigned int *)STRING;
Len=*Adr; Adr=Adr+1;addr=(unsigned char *)Adr;
if(pVar->OldCursorOffset>=Len) pVar->OldCursorOffset=0;
if(pVar->NewCursorOffset>=Len) pVar->NewCursorOffset=0;
addr=addr+(pVar->OldCursorOffset)*2;
XX=*(addr);
YY=*(addr+1);
CharPtr=CharPtr+pVar->OldCursorOffset;
LcdPutc(XX,YY,*CharPtr,TYPE);
addr=(unsigned char *)Adr; CharPtr=(unsigned int *)STRING;
addr=addr+pVar->NewCursorOffset*2;
XX=*(addr);
YY=*(addr+1);
CharPtr=CharPtr+pVar->NewCursorOffset;
TYPE=TYPE+128;
LcdPutc(XX,YY,*CharPtr,TYPE);
pVar->OldCursorOffset=pVar->NewCursorOffset;
}
void SetSysTimer(struct SYSTIME * SysTimePtr)
{
disable();
outportb(DS_REGA, 0x26); /*Clock initialize*/
outportb(DS_REGB, 0x8E); /*Clock initialize*/
outportb(DS_SECOND, SysTimePtr->second);
outportb(DS_MINUTE, SysTimePtr->minute);
outportb(DS_HOUR, SysTimePtr->hour);
outportb(DS_DATE, SysTimePtr->date);
outportb(DS_MONTH, SysTimePtr->month);
outportb(DS_YEAR, SysTimePtr->year);
outportb(DS_CENTURY, SysTimePtr->century);
outportb(DS_REGB, 0x1E); /*Clock initialize*/
inportb(DS_REGC);
inportb(DS_REGD);
enable();
}
void Line(UINT x1,UINT y1,UINT x2,UINT y2,UINT color)
{
unsigned int m,n,j,i,x,dx,dy,y,k;
unsigned char ch;
if(x1>127) x1=127;
if(x2>127) x2=127;
if(y1>63) y1=63;
if(y2>63) y2=63;
if(color==1)
{//color==1
if(x2<x1)
{
x=x2;
x2=x1;
x1=x;
}else
{
if(x2==x1)
{
for(i=y1;i<=y2;i++)
{
k=i%8;
n=(i/8)*128+x1;
if((k==0)&&((i+7)<=y2))
{
LcdBuf[n]=0xff;
i=i+7;
}else
{
ch=LcdBuf[n];
switch(k)
{
case 0x00:ch=ch | 0x01;
break;
case 0x01:ch=ch | 0x02;
break;
case 0x02:ch=ch | 0x04;
break;
case 0x03:ch=ch | 0x08;
break;
case 0x04:ch=ch | 0x10;
break;
case 0x05:ch=ch | 0x20;
break;
case 0x06:ch=ch | 0x40;
break;
case 0x07:ch=ch | 0x80;
break;
default: break;
}
LcdBuf[n]=ch;
}
}//for
return;
}
}
if(y2<y1)
{
y=y2;
y2=y1;
y1=y;
}else
{
if(y2==y1)
{
for(i=x1;i<=x2;i++)
{
k=y1%8;
n=(y1/8)*128+i;
ch=LcdBuf[n];
switch(k)
{
case 0x00:ch=ch | 0x01;
break;
case 0x01:ch=ch | 0x02;
break;
case 0x02:ch=ch | 0x04;
break;
case 0x03:ch=ch | 0x08;
break;
case 0x04:ch=ch | 0x10;
break;
case 0x05:ch=ch | 0x20;
break;
case 0x06:ch=ch | 0x40;
break;
case 0x07:ch=ch | 0x80;
break;
default: break;
}
LcdBuf[n]=ch;
}//for
return;
}
}
m=(y2-y1+1);
n=x2-x1+1;
if(m<=n)
{
dy=(m*128)/n;
y=y1*128;
for(i=x1;i<=x2;i++)
{
k=(y/128)%8;
n=(y/1024)*128+i;
ch=LcdBuf[n];
switch(k)
{
case 0x00:ch=ch | 0x01;
break;
case 0x01:ch=ch | 0x02;
break;
case 0x02:ch=ch | 0x04;
break;
case 0x03:ch=ch | 0x08;
break;
case 0x04:ch=ch | 0x10;
break;
case 0x05:ch=ch | 0x20;
break;
case 0x06:ch=ch | 0x40;
break;
case 0x07:ch=ch | 0x80;
break;
default: break;
}
LcdBuf[n]=ch;
y=y+dy;
}
}else
{
dx=(n*128)/m;
x=x1*128;
for(i=y1;i<=y2;i++)
{
k=i%8;
n=(i/8)*128+x/128;
ch=LcdBuf[n];
switch(k)
{
case 0x00:ch=ch | 0x01;
break;
case 0x01:ch=ch | 0x02;
break;
case 0x02:ch=ch | 0x04;
break;
case 0x03:ch=ch | 0x08;
break;
case 0x04:ch=ch | 0x10;
break;
case 0x05:ch=ch | 0x20;
break;
case 0x06:ch=ch | 0x40;
break;
case 0x07:ch=ch | 0x80;
break;
default: break;
}
LcdBuf[n]=ch;
x=x+dx;
}
}
}else
{//color==0
if(x2<x1)
{
x=x2;
x2=x1;
x1=x;
}else
{
if(x2==x1)
{
for(i=y1;i<=y2;i++)
{
k=i%8;
n=(i/8)*128+x1;
if((k==0)&&((i+7)<=y2))
{
LcdBuf[n]=0xff;
i=i+7;
}else
{
ch=LcdBuf[n];
switch(k)
{
case 0x00:ch=ch & 0xfe;
break;
case 0x01:ch=ch & 0xfd;
break;
case 0x02:ch=ch & 0xfb;
break;
case 0x03:ch=ch & 0xf7;
break;
case 0x04:ch=ch & 0xef;
break;
case 0x05:ch=ch & 0xdf;
break;
case 0x06:ch=ch & 0xbf;
break;
case 0x07:ch=ch & 0x7f;
break;
default: break;
}
LcdBuf[n]=ch;
}
}//for
return;
}
}
if(y2<y1)
{
y=y2;
y2=y1;
y1=y;
}else
{
if(y2==y1)
{
for(i=x1;i<=x2;i++)
{
k=y1%8;
n=(y1/8)*128+i;
ch=LcdBuf[n];
switch(k)
{
case 0x00:ch=ch & 0xfe;
break;
case 0x01:ch=ch & 0xfd;
break;
case 0x02:ch=ch & 0xfb;
break;
case 0x03:ch=ch & 0xf7;
break;
case 0x04:ch=ch & 0xef;
break;
case 0x05:ch=ch & 0xdf;
break;
case 0x06:ch=ch & 0xbf;
break;
case 0x07:ch=ch & 0x7f;
break;
default: break;
}
LcdBuf[n]=ch;
}//for
return;
}
}
m=(y2-y1+1);
n=x2-x1+1;
if(m<=n)
{
dy=(m*128)/n;
y=y1*128;
for(i=x1;i<=x2;i++)
{
k=(y/128)%8;
n=(y/1024)*128+i;
ch=LcdBuf[n];
switch(k)
{
case 0x00:ch=ch & 0xfe;
break;
case 0x01:ch=ch & 0xfd;
break;
case 0x02:ch=ch & 0xfb;
break;
case 0x03:ch=ch & 0xf7;
break;
case 0x04:ch=ch & 0xef;
break;
case 0x05:ch=ch & 0xdf;
break;
case 0x06:ch=ch & 0xbf;
break;
case 0x07:ch=ch & 0x7f;
break;
default: break;
}
LcdBuf[n]=ch;
y=y+dy;
}
}else
{
dx=(n*128)/m;
x=x1*128;
for(i=y1;i<=y2;i++)
{
k=i%8;
n=(i/8)*128+x/128;
ch=LcdBuf[n];
switch(k)
{
case 0x00:ch=ch & 0xfe;
break;
case 0x01:ch=ch & 0xfd;
break;
case 0x02:ch=ch & 0xfb;
break;
case 0x03:ch=ch & 0xf7;
break;
case 0x04:ch=ch & 0xef;
break;
case 0x05:ch=ch & 0xdf;
break;
case 0x06:ch=ch & 0xbf;
break;
case 0x07:ch=ch & 0x7f;
break;
default: break;
}
LcdBuf[n]=ch;
x=x+dx;
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -