📄 screendrv.c
字号:
for(i=0;i<FONTH;i++){
if((c&mask)!=0){
printPix(intx+i,inty+j,pVScreen->foreColor);
//PrintfUartDef("position(%x,%x) with mask 0x%x c 0x%x color %x\r\n",intx,inty,(int)(mask),(int)c,(int)(pVScreen->foreColor));
}else{
printPix(intx+i,inty+j,pVScreen->backgroundColor);
//PrintfUartDef("position(%d,%d) with mask 0x%x c 0x%x color %x\r\n",(int)(intx),(int)(inty),(int)(mask),(int)c,(int)(pVScreen->backgroundColor));
}
mask=mask>>1;
if(mask==0){
offset++;
c=charPix[offset];
//PrintfUartDef("[%d]c=0x%x\r\n",offset,(int)c);
mask=0x80;
}
}
}
return 1;
}
//打印一个字符在x,y的位置_以字符衡量,放大了四倍2×2
int VSPrint1(int inty ,int intx ,unsigned char *charPix ,VScreen_T *pVScreen){
int i=0,j=0;
unsigned short mask=0,c=0;
//判断是否超过了虚拟屏幕范围,超出则返回 0
if(intx>pVScreen->columns||inty>pVScreen->rows)
return 0;
//计算相对位置到intx,inty
intx--;
intx=intx*2*FONTH;
intx+=pVScreen->startx;
inty--;
inty=inty*2*FONTV;
inty+=pVScreen->starty;
for(i=0;i<FONTV;i++)
{
mask=0x80;
c=(unsigned short)charPix[i];
for(j=0;j<FONTH;j++){
if((c&mask)!=0){
printPix(intx,inty,pVScreen->foreColor);
#ifdef debuglcd
PrintfUartDef("position(%x,%x) with mask 0x%x c 0x%x color %x\r\n",pVScreen->startx,pVScreen->starty,(int)(mask),(int)(pVScreen->foreColor));
#endif
printPix(intx+1,inty,pVScreen->foreColor);
printPix(intx,inty+1,pVScreen->foreColor);
printPix(intx+1,inty+1,pVScreen->foreColor);
}
else {
printPix(intx,inty,pVScreen->backgroundColor);
#ifdef debuglcd
PrintfUartDef("position(%x,%x) with mask 0x%x c 0x%x color %x\r\n",intx,inty,(int)(mask),(int)(pVScreen->foreColor));
#endif
printPix(intx+1,inty,pVScreen->backgroundColor);
printPix(intx,inty+1,pVScreen->backgroundColor);
printPix(intx+1,inty+1,pVScreen->backgroundColor);
}
intx+=2; //调整横向的点位置
mask=mask>>1;
}
intx-=FONTV; //横坐标归位
inty+=2; //调整纵向的坐标
}
return 1;
}
//虚拟屏幕初始化
int InitVS(int intx,int inty,int width,int height,VScreen_T *pVScreen){
if(intx<0||inty<0||width<8||height<16||(intx+width)>640||(inty+height)>480){
return 0;
}
pVScreen->startx=intx;
pVScreen->starty=inty;
pVScreen->endx=intx+width;
pVScreen->endy=inty+height;
pVScreen->rows=height/16-1;
pVScreen->columns=width/8-1;
pVScreen->foreColor=RGB565_COLOR_WHITE;
//charBuf omitted
pVScreen->backgroundColor=RGB565_COLOR_BLUE;
pVScreen->cursorx=0;
pVScreen->cursory=0;
pVScreen->screenOut=0;
VSClear(pVScreen);
return 1;
}
//带有固定边框的虚拟屏幕初始化
int InitBorderVS(int intx,int inty,int width,int height,VScreen_T *pVScreen){
int i;
if(intx<0||inty<0||width<8||height<16||(intx+width)>640||(inty+height)>480){
return 0;
}
pVScreen->startx=intx;
pVScreen->starty=inty;
pVScreen->endx=intx+width;
pVScreen->endy=inty+height;
pVScreen->foreColor=RGB565_COLOR_WHITE;
//charBuf omitted
pVScreen->backgroundColor=RGB565_COLOR_BLUE;
pVScreen->cursorx=0;
pVScreen->cursory=0;
pVScreen->screenOut=0;
VSClear(pVScreen);
//画框----
i=intx;
for(i+=2;i<(pVScreen->endx-2);i++)
printPix(i,pVScreen->starty+2,pVScreen->foreColor);
i=intx;
for(i+=2;i<(pVScreen->endx-2);i++)
printPix(i,pVScreen->endy-3,pVScreen->foreColor);
i=inty;
for(i+=2;i<(pVScreen->endy-2);i++)
printPix(pVScreen->startx+2,i,pVScreen->foreColor);
i=inty;
for(i+=2;i<(pVScreen->endy-2);i++)
printPix(pVScreen->endx-3,i,pVScreen->foreColor);
pVScreen->startx+=5;
pVScreen->starty+=5;
pVScreen->endx-=5;
pVScreen->endy-=5;
pVScreen->rows=(pVScreen->endy-pVScreen->starty)/16-1;
pVScreen->columns=(pVScreen->endx-pVScreen->startx)/8-1;
return 1;
}
//彩色条纹1
void colorBar1(){
int i,j,x,y,flag,green,blue,red;
green=0;
red=0;
blue=0;
flag=0;
for(x=0;x<640;x+=20){
for(i=0;i<20;i++){
for(y=0;y<480;y+=16){
for(j=0;j<16;j++){
if(green=64){
flag=1;
}
if(flag=0) {green++;}
else {green--;}
printPix(x+i,y+j,(unsigned short)RGB565(red,green,blue));
}
blue++;
}
red++;
}
}
}
//三色调色板
void colorBar(void){
unsigned short color=0;
int i,j,r,g,b,max;
for (i=0; i< 640; i++)
for (j=0; j<480; j++)
{
max = Maximum(Maximum(i,j),(1120-i-j));
r = i * 31 /640;
g = j * 62 /480;
b = (1120-i-j) * 31 /1120;
color = (unsigned short)RGB565(r,g,b);
printPix(i,j,color);
}
}
//打印缓冲区内的字符
void PrintBuffer(VScreen_T *pVScreen, char *pBuf)
{
int i;
for(i = 0; pBuf[i]; i++)
{
//case of \t
if(pBuf[i]==0x9){
VSP(' ',pVScreen);
VSP(' ',pVScreen);
VSP(' ',pVScreen);
VSP(' ',pVScreen);
}else
if(pBuf[i]==0xd){
pVScreen->cursorx=0;
}else
if(pBuf[i]==0xa){
NextLine(pVScreen);
}else{
VSP(pBuf[i],pVScreen);
}
}
}
//缓冲区解析规范化
#include "stdarg.h"
void doPrintLcd(char * buffer, char * fmt, va_list ap)
{
void *p1, *p2, *p3, *p4, *p5, *p6, *p7, *p8, *p9, *p10, *p11, *p12;
p1 = va_arg(ap,void*);
p2 = va_arg(ap,void*);
p3 = va_arg(ap,void*);
p4 = va_arg(ap,void*);
p5 = va_arg(ap,void*);
p6 = va_arg(ap,void*);
p7 = va_arg(ap,void*);
p8 = va_arg(ap,void*);
p9 = va_arg(ap,void*);
p10 = va_arg(ap,void*);
p11 = va_arg(ap,void*);
p12 = va_arg(ap,void*);
sprintf(buffer,fmt,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,p12);
}
//实用函数:屏幕打印
void PrintfLcd(VScreen_T *pVScreen,char * fmt, ...)
{
char buffer[256];
va_list ap;
va_start(ap,fmt);
doPrintLcd(buffer,fmt,ap);
PrintBuffer(pVScreen,buffer);
}
//实用函数:在默认的全屏上面打印字符
void PrintfLcdDef(char * fmt, ...){
char buffer[256];
va_list ap;
va_start(ap,fmt);
doPrintLcd(buffer,fmt,ap);
PrintBuffer(&VSGLOBAL,buffer);
}
//光标移到某行某列
void gotoPos(int rows,int columns,VScreen_T *pVScreen){
pVScreen->cursorx=columns;
pVScreen->cursory=rows;
}
//获取当前行
unsigned int getColumns(VScreen_T *pVScreen){
return pVScreen->cursorx;
}
//获取当前列
unsigned int getRows(VScreen_T *pVScreen){
return pVScreen->cursory;
}
//在绝对位置打印字串
void PrintfLcdAbs(int rows,int columns,VScreen_T *pVScreen,char * fmt, ...){
int y,x;
char buffer[256];
va_list ap;
y=getRows(pVScreen);
x=getColumns(pVScreen);
gotoPos(rows,columns,pVScreen);
va_start(ap,fmt);
doPrintLcd(buffer,fmt,ap);
PrintBuffer(pVScreen,buffer);
gotoPos(y,x,pVScreen);
}
//默认屏幕绝对位置打印
void PrintfLcdAbsDef(int rows,int columns,char * fmt, ...){
int y,x;
char buffer[256];
va_list ap;
y=getRows(&VSGLOBAL);
x=getColumns(&VSGLOBAL);
gotoPos(rows,columns,&VSGLOBAL);
va_start(ap,fmt);
doPrintLcd(buffer,fmt,ap);
PrintBuffer(&VSGLOBAL,buffer);
gotoPos(y,x,&VSGLOBAL);
}
//换行--旧版
int lineUp(VScreen_T *pVScreen){
int i,j;
for(i=pVScreen->startx;i<pVScreen->endx;i++)
for(j=pVScreen->starty+FONTV;j<pVScreen->endy;j++){
pPixel[i+(j-FONTV)*640] = pPixel[i+j*640];
}
for(i=pVScreen->startx;i<pVScreen->endx;i++)
for(j=pVScreen->endy-FONTV;j<pVScreen->endy;j++){
pPixel[i+j*640]=pVScreen->backgroundColor;
}
}
//define the color of the screen
void setVSColor(unsigned short foreColor,unsigned short backgroundColor,VScreen_T *pVScreen){
pVScreen->foreColor=foreColor;
pVScreen->backgroundColor=backgroundColor;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -