📄 display.c
字号:
} }}//DrawCircle()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 填充圆形.// 描述: 在屏幕指定区域填充一个圆形.//// [参数表]// x, y: 圆心坐标.// radius: 半径.// color1: 边框颜色.// color2: 填充颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void FillCircle(WORD x,WORD y,WORD radius,WORD color1,WORD color2){ int i; Circle(x, y, radius, color1); // 画边框 for( i=radius-1; i>=0; i-- ) // 填充 Circle(x,y,i,color2); }//FillCircle()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 画矩形.// 描述: 在屏幕指定区域画矩形.//// [参数表]// x1, y1: 左上角坐标.// x2, y2: 右下角坐标.// color: 边框颜色.// cType: 边框线型.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void Rectangle(WORD x1,WORD y1,WORD x2,WORD y2,WORD color,BYTE cType){ Line(x1,y1,x2,y1,color,cType); Line(x2,y1,x2,y2,color,cType); Line(x1,y2,x2,y2,color,cType); Line(x1,y1,x1,y2,color,cType);}//Rectangle()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 区域反白.// 描述: 将指定矩形区域反白显示.//// [参数表]// x1, y1: 左上角坐标.// x2, y2: 右下角坐标.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ReverseBlock(WORD x1,WORD y1,WORD x2,WORD y2){ int i,j; for(i=x1;i<=x2;i++) for(j=y1;j<=y2;j++) ReversePutPixel(i,j);}//ReverseBlock()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 恢复区域显示.// 描述: 从内存中读出储存的屏幕数据, 恢复指定区域的显示.//// [参数表]// x, y: 需要恢复区域的左上角坐标.// width: 区域宽度.// height: 区域高度.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void RestoreArea(WORD x,WORD y,WORD width,WORD height){ WORD i; int addr; if(x==0 && width==SCREEN_WIDTH) { addr = GetAddress(x,y); // 显存偏移地址; memcpy_four((int *)addr,(int *)(SDRAM_ADDR_LCDBACK+(y)*SCREEN_WIDTH*2+(x)*2),width*height*2); return; } width *= 2; // 每个pos要写一个WORD width = width + 2*(x%2); x = 2*(x/2); for(i=0; i<height; i++) { addr = GetAddress(x,i+y); // 显存偏移地址; memcpy_four((int *)addr,(int *)(SDRAM_ADDR_LCDBACK+(y+i)*SCREEN_WIDTH*2+(x)*2),width); }}//RestoreArea()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 恢复键盘显示之前状态.//// [参数表]// x, y: 需要恢复区域的左上角坐标.// width: 区域宽度.// height: 区域高度.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~//恢复键盘显示之前状态void ReKeyBoradBefor(WORD x,WORD y,WORD width,WORD height){ WORD i; int addr; width *= 2; // 每个pos要写一个WORD width = width + 2*(x%2); x = 2*(x/2); for(i=0;i<height;i++) { addr = GetAddress(x,i+y); // 显存偏移地址; memcpy_four((int *)addr,(int *)(SAVE_CURR_SCREEN+(y+i)*SCREEN_WIDTH*2+(x)*2),width); }}//ReKeyBoradBefor()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 反色显示所按的按键.//// [参数表]// cx1, cy1: 按键的左上角坐标.// cx2, cy2: 按键的右下角坐标.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowTouched(WORD cx1,WORD cy1,WORD cx2,WORD cy2){ ReverseBlock(cx1,cy1,cx2,cy2); udelay(100000); ReverseBlock(cx1,cy1,cx2,cy2);}//ShowTouched()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示数字.// 描述: 定长显示数字, 长度不够则补空格.//// [参数表]// data: 需要显示的数值.// dot: 小数点位.// cDigital: 指定位数.// xx, yy: 左上角坐标.// fColor: 前景颜色.// bColor: 背景颜色.// fontSize: 字体大小.//// 注: 如果data位数超出指定的cDigital,显示为#.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void NumberDisplay (int data,BYTE dot,BYTE cDigital,WORD xx,WORD yy,WORD fColor,int bColor,BYTE fontSize){ int i,j=1; char buf[SCREEN_WIDTH/8 + 2],format[SCREEN_WIDTH/8 + 2]; int x=abs(data); WORD cCharSize,VSize ; VSize = 16; GetCharSize(fontSize,(WORD *)&cCharSize,(WORD *)&VSize); if( dot == 0 ) sprintf(buf," %10d",data); // 如果出现乱码,调整显示宽度 else { //带小数点的显示,分成整数与小数来显示 j = 1; for(i=0;i<dot;i++) j *= 10; if( data<0 ) sprintf(format," -%%d.%%0%dd",dot); else sprintf(format," %%d.%%0%dd",dot); sprintf(buf,format,x/j,x%j); } //判断实际数据是否超过设定的最大长度。如果超出则显示#### i = strlen(buf)- cDigital; for(j=0;j<i;j++) { if(( buf[j] != ' ') && (buf[j] != '0')) { for(j=0; j<strlen(buf);j++) buf[j] = '#'; break; } } RestoreArea(xx,yy,cDigital*cCharSize,VSize); ShowString(buf+i,xx,yy,fColor,NO_BACK_COLOR,fontSize);}//NumberDisplay()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示浮点数.// 描述: 在指定位置,按指定小数位数显示一个浮点数.//// [参数表]// data: 需要显示的数值.// dot: 小数点位.// cDigital: 指定位数.// xx, yy: 左上角坐标.// fColor: 前景颜色.// bColor: 背景颜色.// direct: 对齐方式. 0-靠左对齐; 1-靠右对齐.// cfont: 字号.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void DispFloat(int data, WORD dot,WORD digital, WORD x, WORD y, WORD fColor, WORD bColor,BYTE direct,BYTE cfont){ int i, j,sym; char format[SCREEN_WIDTH/8 + 2],buf[SCREEN_WIDTH/8 + 2]; if(data == 0) sym = 1; else sym = abs(data)/data;//符号位 if(dot==0) //整数直接显示 sprintf(buf,"%d",data); else //浮点数按要求的小数位数显示 { j = 1; for(i=0;i<dot;i++) j*=10; if(sym > 0) sprintf(format,"%%d.%%0%dd",dot); else sprintf(format,"-%%d.%%0%dd",dot); sprintf(buf,format,abs(data/j),abs(data%j)); } if( direct == 0 )//靠左显示 ShowString(buf,x,y,fColor,bColor,cfont); else //靠右显示 ShowString_back(buf,x,y,fColor,bColor,cfont);}//DispFloat()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 保存屏幕.// 描述: 保存当前全屏屏幕数据.//// [参数表]// SaveAddr: 存储屏幕数据的存储区起始地址.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void SaveCurrScreen (DWORD SaveAddr){ memcpy_four((int *)SaveAddr,(int *)(SCREEN_ADDR + 0x100000 -NotUseViewmem),SCREEN_WIDTH*SCREEN_HEIGHT*2);}//SaveCurrScreen()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 恢复屏幕.// 描述: 从存储区读出全屏数据, 恢复屏幕.//// [参数表]// SaveAddr: 存储屏幕数据的存储区起始地址.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void RestoreScreen(DWORD SaveAddr){ memcpy_four((int *)(SCREEN_ADDR + 0x100000 -NotUseViewmem),(int *)SaveAddr,SCREEN_WIDTH*SCREEN_HEIGHT*2);}//RestoreScreen()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 靠右显示字符串.// 描述: 靠右对齐显示字符串(含中文和英文).//// [参数表]// s: 字符串首地址.// x, y: 显示区右上角的坐标.// fcolor: 前景(字体)颜色.// bcolor: 背景颜色.// cfont: 字号.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowString_back(char *s,WORD x,WORD y,WORD fColor,WORD bColor,BYTE cfont){ WORD j; j = strlen(s); x = x-j*12; ShowString(s,x,y,fColor,bColor,cfont);}//ShowString_back()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示字符串外加方框.//// [参数表]// msg: 字符串起始地址.// x, y: 显示框左上角坐标.// cleft: 字符串左、右边距.// cTop: 字符串上、下边距.// cfontSize: 字号大小.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowStringAndBox(char *msg,WORD x,WORD y,int fcolor,int bcolor,BYTE cLeft,BYTE cTop,BYTE cfontSize){ BYTE bLen,cCharSize,cCharHeight; WORD wTotalLens; switch( cfontSize ) // 根据字号选择字符尺寸 { case 0: // 8*16 case 1: // 16*16 cCharSize = 8; cCharHeight = 16; break; case 2: // 16*24 cCharSize = 8; cCharHeight = 24; break; case 3: // 16*32 cCharSize = 8; cCharHeight = 32; break; case 4: // 24*24 cCharSize = 12; cCharHeight = 24; break; case 5: // 32*32 cCharSize = 16; cCharHeight = 32; break; case 6: // 48*48 cCharSize = 24; cCharHeight = 48; break; default: cCharSize = 8; break; } bLen = strlen(msg); // 字符串长度 wTotalLens = x + bLen*cCharSize + 2*cLeft; // 显示方框结束点 Rectangle(x,y,wTotalLens,y + cCharHeight + 2*cTop,fcolor,cLine); // 边框 ShowString(msg,x + cLeft,y + cTop,fcolor,bcolor,cfontSize); // 显示字符串}//ShowStringAndBox()//!!!!! 以下函数都是没用的 !!!!!/*void ShowString48(char *s,WORD x,WORD y,WORD fcolor,WORD bcolor){ int i=0,j; j = strlen(s); while(i<j) { if(x + 48 > SCREEN_WIDTH) //达到屏幕右边界 { //显示移动到下一行 x = 0;//tmpX; y += LineHeight;//下一行+2个点 if (y + 48 > SCREEN_HEIGHT) break; } //ShowChineseChar48(s+i,x,y,fcolor,bcolor); //ShowChineseChar(s+i,x,y,fcolor,bcolor);//ShowChinese3232(s+i,x,y,fcolor,bcolor); x += 48;//48; //汉字为16*16 i += 2; }}//ShowString48*//*// 显示16*16汉字 ******************************void ShowChinese1616(char *hz,WORD x,WORD y,WORD color,WORD bkcolor){ int i,j,hzaddr; int pos; BYTE value; //45120*288/32 //计算出汉字在字库中的位置 //16*16(32个字节时 = 33088 + ((hz[0] - 176) * 94 + (hz[1] - 161)) * 32 //RestoreArea(x,y,16,16); pos = (33088 + ((hz[0] - 176) * 94 + (hz[1] - 161)) * 32); //加入显示全角字符处理 if( pos < 0 ) pos =12032+ pos; hzaddr = dwChFontAddr + pos ; for(i=0;i<32;i++)//一个24*24汉字72个字节 { value = *(BYTE *)(hzaddr+i); for(j=0;j<8;j++) { if( value&0x80 ) PutPixel(x+(i%2)*8+j,y+(i/2),color);// else// PutPixel(x+(i%2)*8+j,y+(i/2),bkcolor); value <<= 1; } }}*//*void RestoreDisArea(char *s,WORD x,WORD y){ WORD wTotalLens; wTotalLens = strlen(s); wTotalLens *= 24; wTotalLens += (2*(x%2)); x = 2*(x/2); RestoreArea(x,y,wTotalLens/2,24);}*//*//数据格式:前64个字节为头信息//图像数据是16位色,照片都是24位色,要先转换为16位色才能正常显示void ShowBMP(short *bmp,short x,short y){ short i,j,width,height; char info[100]; short *dst; width = *bmp; height = *(bmp+1); printf("ShowBMP -- Width:%d,Height:%d\n",width,height); if( width < 1 || width+x > 1024 || height < 1 || height+y>768 ) { sprintf(info, "Data Error. Width=%d Height=%d\n",width,height); //video_drawstring (0, 0, info); return; } bmp += 32; //指针移动到图像数据 dst = (short *)CONFIG_SM501_MEM_BASE; //显存地址 for(i=0;i<height;i++) for(j=0;j<width;j++) { *(dst+i*SCREEN_WIDTH+j) = *bmp++;// *(dst+i*SCREEN_WIDTH*2+j*2+1) = *bmp++; }} // ShowBMP*//*void ShowErrData(BYTE cCmdNo){ WORD k; for( k=0;k<mapProperty.wTotalElements;k++ ) { //判断该数据项对应的命令序号是否等于当前命令串号 if( mapProperty.MapProperty.cCommandIndex[k] == cCmdNo ) { ShowString("XXXX",GeneralButton[k].wLeft,GeneralButton[k].wTop,COLOR_BLACK,COLOR_WHITE,GeneralButton[k].cReceType/10); }//if (mapProperty.MapProperty.cCommandIndex[k] == i) }//for}*//************************出现5次以上通信不成功显示通信故障Delayms************************//*void CommErr(void){ BYTE i; for(i = 0;i<COMMANDNUMS;i++) { if( cCommErr[i] >= 5 ) //10次通讯失败显示"通讯故障" { ShowErrData(i+1); cCommErr[i] = 0; ClearSystemStatus(COMMAND0_DATA); } } }//CommErr*/
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -