📄 display.c
字号:
#define __DISPLAY#include "display.h"#undef __DISPLAY//********************** Global Variable **********************ushort cLanguage = 0; //语言选择WORD SHOW_CHINESE; int NotUseViewmem; //当前未使用显存SetDataInfoDef SetDataInfo[MAXITEMS]; //一页最多只有27个设置项//*************************************************************//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 求平方根.// 描述: 求一个数的平方根.//// [参数表]// x: 待求数.//// 返回: x的平方根(取整).//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~int Sqrt (DWORD x){ float x0=1.0;float x2=1.0; float x1 ; int reValue; while((((x1-x2)>=0.0001)||((x1-x2)<=-0.0001))) { x1=(x0+x/x0)*0.5; x2=x0; x0=x1; } reValue = (int)x1; return reValue;}//Sqrt()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 绘像素.// 描述: 为指定像素点着色.//// [参数表]// x, y: 像素点坐标.// color: 颜色.//// 返回: //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void PutPixel (WORD x, WORD y,WORD color){ DWORD addr; addr = GetAddress(x,y); // 显存偏移地址 *(WORD *)addr = color; // 像素着色}//PutPixel()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 取指定像素点颜色.//// [参数表]// x, y: 像素点坐标.//// 返回: 颜色值.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~WORD GetPixelColor (WORD x, WORD y){ DWORD addr; WORD value; if(x >= SCREEN_WIDTH || y >= SCREEN_HEIGHT) return 0; addr = GetAddress(x,y); //内存偏移地址 value = *(WORD *)addr; return value;}//PutPixel()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 反相色像素着色.// 描述: 用指定像素点当前颜色的反相色对该像素点进行着色.//// [参数表]// x, y: 像素点坐标.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ReversePutPixel (WORD x, WORD y){ WORD recolor; recolor = GetPixelColor(x, y); // 读出当前像素点的颜色 recolor ^= 0xffff; // 求反相色 PutPixel(x,y,recolor); // 像素像素着色}//ReversePutPixel()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 屏幕刷色.// 描述: 把整个屏幕设成同一种颜色, 可用于清屏.//// [参数表]// wColor: 颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ClearScreen (WORD wColor){ int i; WORD *addr; addr = (WORD *)CONFIG_SM501_MEM_BASE; for(i=0;i<SCREEN_HEIGHT*SCREEN_WIDTH;i++) *addr++ = wColor;}//ClearScreen()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 边界处理.// 描述: 检查输入坐标是否溢出边界.//// [参数表]// x1, y1: 像素点1坐标.// x2, y2: 像素点2坐标.//// 返回: 0-溢出边界; 1-无溢出.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~BYTE BorderDeal (WORD *x1, WORD *y1, WORD *x2, WORD *y2){ if((*x1 > SCREEN_WIDTH) ||(*x2 > SCREEN_WIDTH) ||(*y1 > SCREEN_HEIGHT)||(*y2 > SCREEN_HEIGHT)) return 0; return 1; }//BorderDeal()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 画直线.// 描述: 在屏幕指定起始坐标之间画一条直线.//// [参数表]// x1, y1: 起始坐标.// x2, y2: 末端坐标.// color: 颜色.// cType: 线型. 0-实线; 1-虚线; 2-反相色直线; 3-反相色虚线//// 注: 当采用反相色画线时, color无效.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void Line(WORD x1,WORD y1,WORD x2,WORD y2,WORD color,BYTE cType){ int dx, dy, steps, k; float xInc, yInc, x, y; short flag=-1; // 虚线控制标记 //---------- 边界处理 ---------- if(BorderDeal((WORD *)&x1,(WORD *)&y1,(WORD *)&x2,(WORD *)&y2) == 0) return; //---------- 参数计算 ---------- dx = x2 - x1; // 水平跨度 dy = y2 - y1; // 垂直跨度 x = x1; // 画线横坐标赋初值 y = y1; // 画线纵坐标赋初值 if( abs(dx)>abs(dy) ) // 选择步进跨度 steps = abs(dx); else steps = abs(dy); if (steps == 0) // 若始末端坐标重合, 则不画线. return; xInc = dx/(float)steps; // 水平步进值 yInc = dy/(float)steps; // 垂直步进值 //---------- 画线 ---------- PutPixel(x1,y1,color); // 绘起点 for( k=0; k<steps; k++ ) // 逐点绘线 { x += xInc; // 横坐标步进 y += yInc; // 纵坐标步进 switch(cType) // 根据线型绘像素 { case 0: // 实线 PutPixel(x,y,color); break; case 1: // 虚线 if (k%BROKEN_LEN == 0) flag =- flag; if (flag == 1) PutPixel(x,y,color); break; case 2: //反相色实线 ReversePutPixel(x,y); break; case 3: //反相色虚线 if (k%BROKEN_LEN == 0) flag = -flag; if (flag == 1) ReversePutPixel(x,y); break; default: break; }//switch }//for}//Line()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 画直线(快速).// 描述: 在屏幕指定起始坐标之间画一条直线.//// [参数表]// x1, y1: 起始坐标.// x2, y2: 末端坐标.// color: 颜色.// cType: 线型. 0-实线; 1-虚线; 2-反相色直线; 3-反相色虚线//// 注: 与Line函数相比, DrawLine不进行边界溢出判断, 而且直接对显存写入, 所以速度快.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void DrawLine (WORD x1,WORD y1,WORD x2,WORD y2,WORD color){ DWORD addr; WORD i; addr = GetAddress(x1,y1); //显存偏移地址 for(i = y1;i < y2;i++) { *(WORD *)addr= color; addr += 2*SCREEN_WIDTH; } }//DrawLine()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 取字符尺寸.// 描述: 取要显示字符的宽度和高度.//// [参数表]// cfontSize: 字号大小.// cCharSize: 字符宽度. 用于返回.// *VSize: 字符高度, 用于返回.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void GetCharSize (BYTE cfontSize,WORD *cCharSize,WORD *VSize){ switch(cfontSize) { case 0://8*16 *cCharSize = 8; break; case 1://16*16 *cCharSize = 10; break; case 2://16*24 *cCharSize = 12; *VSize = 24; break; case 3://24*24 *cCharSize = 12; *VSize = 24; break; case 4://24*32 *cCharSize = 14; *VSize = 32; case 5://32*32 *cCharSize = 16; *VSize = 32; break; case 6://32*48 *cCharSize = 28; *VSize = 48; break; case 7://32*64 *cCharSize = 32; *VSize = 64; break; case 8://48*80 *cCharSize = 48; *VSize = 80; break; default: *cCharSize = 14; break; }//switch}//GetCharSize()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示8*16字符.// 描述: 从字库提取点阵, 显示一个8*16字符.//// [参数表]// addr: 字符点阵地址.// x, y: 显示坐标.// fcolor: 前景颜色.// bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar816 (int addr,WORD x,WORD y,WORD fcolor,int bcolor){ BYTE i,m,value; //RestoreArea(x,y,8,16); for(i=0;i<16;i++)//一个英文字符16个字节 { value = *(BYTE *)(addr+i); for(m=0;m<8;m++) { if( value&0x80 ) PutPixel(x+m,y+i,fcolor); else if(bcolor != NO_BACK_COLOR)//有背景色 PutPixel(x+m,y+i,bcolor); value <<= 1; } } }//ShowChar816()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示英文字符.// 描述: 显示一个英文字符.//// [参数表]// ch: 需要显示的字符.// x, y: 字符显示位置的屏幕坐标.// fcolor: 前景颜色.// bcolor: 背景颜色.// cfont: 字号大小.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowEnglishChar (char ch,WORD x,WORD y,WORD fcolor,int bcolor,BYTE cfont){ int addr; switch(cfont) // 根据字号选择字库, 显示字符 { case 0: //8*16 addr = (dwEnFontAddr+ch*16); // 字符点阵地址 ShowChar816(addr,x,y,fcolor,bcolor); break; case 1: //16*16 addr = (dwEnFont1616+ch*32); //字符点阵地址 ShowChar1616(addr,x,y,fcolor,bcolor); break; case 2: //16*24 addr = (dwEnFont1624+ch*48); //字符点阵地址 ShowChar1624(addr,x,y,fcolor,bcolor); break; case 3: //24*24 addr = (dwEnFont2424+ch*72); //字符点阵地址 ShowChar2424(addr,x,y,fcolor,bcolor); break; case 4: //24*32 addr = (dwEnFont2432+ch*96); //字符点阵地址 ShowChar2432(addr,x,y,fcolor,bcolor); break; case 5: //32*32 addr = (dwEnFont3232+ch*128); //字符点阵地址 ShowChar3232(addr,x,y,fcolor,bcolor); break; case 6: //32*48 //大数字点阵的特殊处理 if(ch == 32) ch = 58; if(ch < 48) ch += 16; addr = (dwEnFont3248+(ch-48)*192);//字符点阵地址 ShowChar3248(addr,x,y,fcolor,bcolor); break; case 7: //32*64 //大数字点阵的特殊处理 if(ch == 32) ch = 58; if(ch < 48) ch += 16; addr = (dwEnFont3264+(ch-48)*256);//字符点阵地址 ShowChar3264(addr,x,y,fcolor,bcolor); break; case 8: //48*80 //大数字点阵的特殊处理 if(ch == 32) ch = 58; if(ch < 48) ch += 16; addr = (dwEnFont4880+(ch-48)*480);//字符点阵地址 ShowChar4880(addr,x,y,fcolor,bcolor); break; default: break; }}// ShowEnglishChar//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示24*24点阵汉字.// 描述: 用24*24点阵显示一个汉字.//// [参数表]// hz: 汉字的基址.// x, y: 汉字显示位置的屏幕坐标.// color: 字体颜色.// bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChineseChar24(char *hz,int x,int y,int color,int bcolor){ int i,j,hzaddr; int pos; BYTE value; //45120*288/32 //计算出汉字在字库中的位置 //16*16(32个字节时 = 33088 + ((hz[0] - 176) * 94 + (hz[1] - 161)) * 32 pos = 72 * (33088 + ((hz[0] - 176) * 94 + (hz[1] - 161)) * 32) / 32; // 显示全角字符处理 if( pos < 0 ) pos = 9 * 12032/ 4 + pos; hzaddr = dwChFontAddr + pos ; // 汉字点阵地址 for(i=0;i<72;i++) //一个24*24汉字72字节 { value = *(BYTE *)(hzaddr+i); for(j=0;j<8;j++) // 取8-bit点阵 { 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; } }}//ShowChineseChar34()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 根据汉字码(hzASC)输出一个汉字.// 描述: 根据给出的汉字码, 在屏幕指定位置输出一个汉字.//// [参数表]// hzASC: 汉字ASC码, 2字节.// x, y: 汉字显示位置的屏幕坐标.// color: 字体颜色.// bcolor: 背景颜色.// // 返回: //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChineseFromASC(WORD hzASC,WORD x,WORD y,WORD color,int bcolor){ hzASC = ((hzASC & 0xFF) << 8) + (hzASC >> 8); // 汉字asc码高低字节互换 ShowChineseChar24((char *)&hzASC,x,y,color,bcolor); // 显示汉字}//ShowChineseFromASC()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函数: 显示16*16字符.// 描述: 从字库提取点阵, 显示一个16*16字符.//// [参数表]// addr: 字符点阵地址.// x, y: 显示坐标.// fcolor: 前景颜色.// bcolor: 背景颜色.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChar1616(int addr,WORD x,WORD y,WORD color,int bcolor){ short i,j; BYTE value; for( i=0; i<32; i++ ) // 16*16点阵共占32字节 { 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); // 前景像素
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -