📄 display.c
字号:
else if(bcolor != NO_BACK_COLOR) // 背景像素(若有背景色) PutPixel(x+(i%2)*8+j,y+(i/2),bcolor); value <<= 1; } }}//ShowChar1616()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示16*24字符.// 描述: 从字库提取点阵, 显示一个16*24字符.//// [参数表]// addr: 字符点阵地址.// x, y: 显示坐标.// fcolor: 前景颜色.// bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar1624(int addr,WORD x,WORD y,WORD color,int bcolor){ short i,j; BYTE value; j = 0; for( i=0; i<48; i++ ) // 16*24点阵共占48字节 { value = *(BYTE *)(addr+i); // 取8-bit点阵 for(j=0;j<8;j++) { if( value & 0x80 ) // 前景/背景判别 PutPixel(x+(i%2)*8+j,y+(i/2),color); // 前景像素 else if(bcolor != NO_BACK_COLOR) // 背景像素(若有背景色) PutPixel(x+(i%2)*8+j,y+(i/2),bcolor); value <<= 1; } }}//ShowChar1624()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示24*24字符.// 描述: 从字库提取点阵, 显示一个24*24字符.//// [参数表]// addr: 字符点阵地址.// x, y: 显示坐标.// fcolor: 前景颜色.// bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar2424(int addr,WORD x,WORD y,WORD color,int bcolor){ short i,j; BYTE value; j = 0; for( i=0; i<72; i++ ) // 24*24点阵共占72字节 { value = *(BYTE *)(addr+i); // 取8-bit点阵 for(j=0;j<8;j++) { if( value & 0x80 ) // 前景/背景判别 PutPixel(x+(i%3)*8+j,y+(i/3),color); // 前景像素 else if(bcolor != NO_BACK_COLOR) // 背景像素(若有背景色) PutPixel(x+(i%3)*8+j,y+(i/3),bcolor); value <<= 1; } }}//ShowChar2424()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示24*32字符.// 描述: 从字库提取点阵, 显示一个24*32字符.//// [参数表]// addr: 字符点阵地址.// x, y: 显示坐标.// fcolor: 前景颜色.// bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar2432(int addr,WORD x,WORD y,WORD color,int bcolor){ short i,j; BYTE value; j = 0; for( i=0; i<96; i++ ) // 24*32点阵共占96字节 { value = *(BYTE *)(addr+i); // 取8-bit点阵 for(j=0; j<8; j++) { if( value & 0x80 ) // 前景/背景判别 PutPixel(x+(i%3)*8+j,y+(i/3),color); // 前景像素 else if(bcolor != NO_BACK_COLOR) // 背景像素(若有背景色) PutPixel(x+(i%3)*8+j,y+(i/3),bcolor); value <<= 1; } }}//ShowChar2432()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示32*32字符.// 描述: 从字库提取点阵, 显示一个32*32字符.//// [参数表]// addr: 字符点阵地址.// x, y: 显示坐标.// fcolor: 前景颜色.// bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar3232(int addr,WORD x,WORD y,WORD color,int bcolor){ short i,j; BYTE value; j = 0; for( i=0; i<128; i++ ) // 32*32点阵共占128字节 { value = *(BYTE *)(addr+i); // 取8-bit点阵 for(j=0;j<8;j++) { if( value & 0x80 ) // 前景/背景判别 PutPixel(x+(i%4)*8+j,y+(i/4),color); // 前景像素 else if(bcolor != NO_BACK_COLOR) // 背景像素(若有背景色) PutPixel(x+(i%4)*8+j,y+(i/4),bcolor); value <<= 1; } }}//ShowChar3232()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示32*48字符.// 描述: 从字库提取点阵, 显示一个32*48字符.//// [参数表]// addr: 字符点阵地址.// x, y: 显示坐标.// fcolor: 前景颜色.// bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar3248(int addr,WORD x,WORD y,WORD color,int bcolor){ short i,j; BYTE value; j = 0; for( i=0; i<192; i++ ) // 32*48点阵共占192字节 { value = *(BYTE *)(addr+i); // 取8-bit点阵 for(j=0;j<8;j++) { if( value & 0x80 ) // 前景/背景判别 PutPixel(x+(i%4)*8+j,y+(i/4),color); // 前景像素 else if(bcolor != NO_BACK_COLOR) // 背景像素(若有背景色) PutPixel(x+(i%4)*8+j,y+(i/4),bcolor); value <<= 1; } }}//ShowChar3248()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示32*64字符.// 描述: 从字库提取点阵, 显示一个32*64字符.//// [参数表]// addr: 字符点阵地址.// x, y: 显示坐标.// fcolor: 前景颜色.// bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar3264(int addr,WORD x,WORD y,WORD color,int bcolor){ short i,j; BYTE value; j = 0; for( i=0; i<256; i++ ) // 32*64点阵共占256字节 { value = *(BYTE *)(addr+i); // 取8-bit点阵 for(j=0;j<8;j++) { if( value & 0x80 ) // 前景/背景判别 PutPixel(x+(i%4)*8+j,y+(i/4),color); // 前景像素 else if(bcolor != NO_BACK_COLOR) // 背景像素(若有背景色) PutPixel(x+(i%4)*8+j,y+(i/4),bcolor); value <<= 1; } }}//ShowChar3264()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示48*80字符.// 描述: 从字库提取点阵, 显示一个48*80字符.//// [参数表]// addr: 字符点阵地址.// x, y: 显示坐标.// fcolor: 前景颜色.// bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar4880(int addr,WORD x,WORD y,WORD color,int bcolor){ short i,j; BYTE value; j = 0; for( i=0;i<480;i++ ) // 48*80点阵共占480字节 { value = *(BYTE *)(addr+i); // 取8-bit点阵 for(j=0;j<8;j++) { if( value & 0x80 ) // 前景/背景判别 PutPixel(x+(i%6)*8+j,y+(i/6),color); // 前景像素 else if(bcolor != NO_BACK_COLOR) // 背景像素(若有背景色) PutPixel(x+(i%6)*8+j,y+(i/6),bcolor); value <<= 1; } }}//ShowChar4880()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示字符串.// 描述: 在屏幕特定区域显示字符串(包括英文和中文).//// [参数表]// s: 字符串首地址.// x, y: 显示区左上角的坐标.// fcolor: 前景(字体)颜色.// bcolor: 背景颜色.// cfont: 字体大小.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowString(char *s,WORD x,WORD y,WORD fcolor,int bcolor,BYTE cfont){ int i=0,j; WORD cCharSize,VSize; VSize = 16; GetCharSize(cfont,(WORD *)&cCharSize,(WORD *)&VSize); j = strlen(s); // 字符串长度 while(i<j) { if( s[i]==255 ) s[i] = 46;//浮点数的小数点 if( (s[i]<128) && (s[i] > 0)) { if(x + cCharSize > SCREEN_WIDTH) //达到屏幕右边界 { //显示移动到下一行 x = 0; y += LineHeight; //下一行+2个点 if (y + VSize > SCREEN_HEIGHT) break; } ShowEnglishChar(s[i++],x,y,fcolor,bcolor,cfont); if(s[i - 1] == 46) x += cCharSize/2 + 1; else x += cCharSize; // 英文都是8*16或8*12 } else { if(x + 24 > SCREEN_WIDTH) //达到屏幕右边界 { //显示移动到下一行 x = 0; y += LineHeight;//下一行+2个点 if (y + 24 > SCREEN_HEIGHT) break; } ShowChineseChar24(s+i,x,y,fcolor,bcolor); x += 24; //汉字为24*24 i += 2; } }}//ShowString()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示信息.// 描述: 显示信息,延时若干ms后返回.//// [参数表]// cmsg: 中文信息字符串始地址.// emsg: 英文信息字符串始地址.// wait: 延时的毫秒数//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowMsg(char *cmsg, char *emsg, DWORD wait){ int i; // 计算字符串所占长度(左右留空共14个点) if(cLanguage == SHOW_CHINESE) // 语言选择 i = (strlen(cmsg) * 12 + 14); else i = (strlen(emsg) * 12 + 14); i /= 2; SaveCurrScreen(TEMP_LZMA_ADDR); // 保存当前屏幕 // 填充一个矩形块作为背景 FilledRectangle(SCREEN_WIDTH/2-i,SCREEN_HEIGHT/2-18,SCREEN_WIDTH/2+i-1,SCREEN_HEIGHT/2+18,COLOR_BLACK,COLOR_BLACK); // 画边框 Rectangle(SCREEN_WIDTH/2-i+4,SCREEN_HEIGHT/2-15,SCREEN_WIDTH/2+i-4,SCREEN_HEIGHT/2+15,COLOR_WHITE,cLine); if( cLanguage == SHOW_CHINESE ) // 根据语言选择显示字符串 ShowString(cmsg,SCREEN_WIDTH/2-i+6,SCREEN_HEIGHT/2-12,COLOR_WHITE,COLOR_BLACK,3); else ShowString(emsg,SCREEN_WIDTH/2-i+6,SCREEN_HEIGHT/2-12,COLOR_WHITE,COLOR_BLACK,3); while(wait-->0) // 延时 udelay(1000); // delay 1 us RestoreScreen(TEMP_LZMA_ADDR); // 恢复屏幕}//ShowMsg()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 填充矩形.// 描述: 在屏幕指定区域填充一个矩形.//// [参数表]// x1, y1: 左上角坐标// x2, y2: 右下角坐标// color1: 边框颜色// color2: 填充颜色//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void FilledRectangle(WORD x1,WORD y1,WORD x2,WORD y2,WORD color1,WORD color2){ int i,j; WORD *addr; Rectangle(x1, y1, x2, y2, color1, cLine); // 画边框 for (i=y1+1; i<y2;i++) // 填充 { addr = (WORD *)(CONFIG_SM501_MEM_BASE+i*SCREEN_WIDTH*2+(x1+1)*2); for (j=x1+1; j<x2; j++) *addr++=color2; }}//FilledRectangle()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 画圆.// 描述: 在屏幕指定位置画圆.//// [参数表]// x, y: 圆心坐标.// radius: 半径.// color: 颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void Circle(WORD x, WORD y, WORD radius, WORD color){ int start,end,tmp,y1,y2; start = x - radius; // 起始横坐标 if( start < 0 ) // 超出左边,则以左边为起始 start = 0; end = x + radius; // 结束横坐标 if( end >= SCREEN_WIDTH ) // 超出右边,则以右边为结束 end = SCREEN_WIDTH - 1; y1 = y; y2 = y; while( start <= end ) // 从左右两边同时画圆 { tmp = Sqrt(radius*radius-(start-x)*(start-x)); if( y+tmp < SCREEN_HEIGHT ) { if( y1 != y+tmp ) Line(start,y1,start,y+tmp,color,cLine); else PutPixel(start,y1,color); y1 = y+tmp; } if( y-tmp >= 0 ) { if( y2 != y-tmp ) Line(start,y2,start,y-tmp,color,cLine); else PutPixel(start,y2,color); y2 = y-tmp; } start = start+1; } // while(start<=end)}//Circle()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 画圆.// 描述: 在屏幕指定位置画圆, 并可设定填充.//// [参数表]// x, y: 圆心坐标.// radius: 半径.// color: 颜色.// fill: 填充标记. 0-无填充; 1-填充.//// 注: 与FillCircle函数相比, 此函数的填充速度较快.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void DrawCircle(WORD x, WORD y, WORD radius,WORD color,BYTE fill){ int start,end,tmp,y1,y2; WORD i = 0,j = 0; WORD *dot; dot = (WORD *)BMP_TMPRAM_ADDR; i = 0; start = x - radius; // 起始横坐标 if( start<0 ) // 超出左边,则以左边为起始 start = 0; end = x;// + radius; if( end >= SCREEN_WIDTH ) //超出右边,以右边为结束 end = SCREEN_WIDTH - 1; y1 = y; y2 = y; while(start <= end) { tmp = Sqrt(radius*radius-(start-x)*(start-x)); if( y+tmp < SCREEN_HEIGHT ) { if(fill == 0) { if( y1 != y+tmp ) { Line(start,y1,start,y+tmp,color,cLine); Line(start+2*(radius-i),y1,start+ 2*(radius-i),y+tmp,color,cLine); } else { PutPixel(start,y1,color); PutPixel(start+ 2*(radius-i),y1,color); } } y1 = y+tmp; } if( y-tmp >= 0 ) { if(fill == 0) { if( y2 != y-tmp ) { Line(start,y2,start,y-tmp,color,cLine); Line(start+ 2*(radius-i),y2,start+ 2*(radius-i),y-tmp,color,cLine); } else { PutPixel(start,y2,color); PutPixel(start+ 2*(radius-i),y2,color); } } y2 = y-tmp; } if(fill == 1) // 填充参数计算 { dot[j++] = start; dot[j++] = y2; dot[j++] = start; dot[j++] = y1; dot[j++] = start+ 2*(radius-i); dot[j++] = y2; dot[j++] = start+ 2*(radius-i); dot[j++] = y1; } start = start+1; i++; }//while(start<=end) if(fill == 1) // 填充圆 { for(i = 0;i<j;) { DrawLine(dot[i],dot[i+1],dot[i+2],dot[i+3],color); DrawLine(dot[i+4],dot[i+5],dot[i+6],dot[i+7],color); i += 8;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -