?? display.c
字號:
#define __DISPLAY#include "display.h"#undef __DISPLAY//********************** Global Variable **********************ushort cLanguage = 0; //語言選擇WORD SHOW_CHINESE; int NotUseViewmem; //當(dāng)前未使用顯存SetDataInfoDef SetDataInfo[MAXITEMS]; //一頁最多只有27個設(shè)置項//*************************************************************//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 求平方根.// 描述: 求一個數(shù)的平方根.//// [參數(shù)表]// x: 待求數(shù).//// 返回: 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()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 繪像素.// 描述: 為指定像素點著色.//// [參數(shù)表]// x, y: 像素點坐標(biāo).// color: 顏色.//// 返回: //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void PutPixel (WORD x, WORD y,WORD color){ DWORD addr; addr = GetAddress(x,y); // 顯存偏移地址 *(WORD *)addr = color; // 像素著色}//PutPixel()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 取指定像素點顏色.//// [參數(shù)表]// x, y: 像素點坐標(biāo).//// 返回: 顏色值.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~WORD GetPixelColor (WORD x, WORD y){ DWORD addr; WORD value; if(x >= SCREEN_WIDTH || y >= SCREEN_HEIGHT) return 0; addr = GetAddress(x,y); //內(nèi)存偏移地址 value = *(WORD *)addr; return value;}//PutPixel()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 反相色像素著色.// 描述: 用指定像素點當(dāng)前顏色的反相色對該像素點進行著色.//// [參數(shù)表]// x, y: 像素點坐標(biāo).//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ReversePutPixel (WORD x, WORD y){ WORD recolor; recolor = GetPixelColor(x, y); // 讀出當(dāng)前像素點的顏色 recolor ^= 0xffff; // 求反相色 PutPixel(x,y,recolor); // 像素像素著色}//ReversePutPixel()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 屏幕刷色.// 描述: 把整個屏幕設(shè)成同一種顏色, 可用于清屏.//// [參數(shù)表]// 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()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 邊界處理.// 描述: 檢查輸入坐標(biāo)是否溢出邊界.//// [參數(shù)表]// x1, y1: 像素點1坐標(biāo).// x2, y2: 像素點2坐標(biāo).//// 返回: 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()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 畫直線.// 描述: 在屏幕指定起始坐標(biāo)之間畫一條直線.//// [參數(shù)表]// x1, y1: 起始坐標(biāo).// x2, y2: 末端坐標(biāo).// color: 顏色.// cType: 線型. 0-實線; 1-虛線; 2-反相色直線; 3-反相色虛線//// 注: 當(dāng)采用反相色畫線時, 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; // 虛線控制標(biāo)記 //---------- 邊界處理 ---------- if(BorderDeal((WORD *)&x1,(WORD *)&y1,(WORD *)&x2,(WORD *)&y2) == 0) return; //---------- 參數(shù)計算 ---------- dx = x2 - x1; // 水平跨度 dy = y2 - y1; // 垂直跨度 x = x1; // 畫線橫坐標(biāo)賦初值 y = y1; // 畫線縱坐標(biāo)賦初值 if( abs(dx)>abs(dy) ) // 選擇步進跨度 steps = abs(dx); else steps = abs(dy); if (steps == 0) // 若始末端坐標(biāo)重合, 則不畫線. return; xInc = dx/(float)steps; // 水平步進值 yInc = dy/(float)steps; // 垂直步進值 //---------- 畫線 ---------- PutPixel(x1,y1,color); // 繪起點 for( k=0; k<steps; k++ ) // 逐點繪線 { x += xInc; // 橫坐標(biāo)步進 y += yInc; // 縱坐標(biāo)步進 switch(cType) // 根據(jù)線型繪像素 { 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()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 畫直線(快速).// 描述: 在屏幕指定起始坐標(biāo)之間畫一條直線.//// [參數(shù)表]// x1, y1: 起始坐標(biāo).// x2, y2: 末端坐標(biāo).// color: 顏色.// cType: 線型. 0-實線; 1-虛線; 2-反相色直線; 3-反相色虛線//// 注: 與Line函數(shù)相比, 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()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 取字符尺寸.// 描述: 取要顯示字符的寬度和高度.//// [參數(shù)表]// 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()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 顯示8*16字符.// 描述: 從字庫提取點陣, 顯示一個8*16字符.//// [參數(shù)表]// addr: 字符點陣地址.// x, y: 顯示坐標(biāo).// 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個字節(jié) { 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()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 顯示英文字符.// 描述: 顯示一個英文字符.//// [參數(shù)表]// ch: 需要顯示的字符.// x, y: 字符顯示位置的屏幕坐標(biāo).// fcolor: 前景顏色.// bcolor: 背景顏色.// cfont: 字號大小.//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowEnglishChar (char ch,WORD x,WORD y,WORD fcolor,int bcolor,BYTE cfont){ int addr; switch(cfont) // 根據(jù)字號選擇字庫, 顯示字符 { 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 //大數(shù)字點陣的特殊處理 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 //大數(shù)字點陣的特殊處理 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 //大數(shù)字點陣的特殊處理 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//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 顯示24*24點陣漢字.// 描述: 用24*24點陣顯示一個漢字.//// [參數(shù)表]// hz: 漢字的基址.// x, y: 漢字顯示位置的屏幕坐標(biāo).// 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個字節(jié)時 = 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字節(jié) { 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()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 根據(jù)漢字碼(hzASC)輸出一個漢字.// 描述: 根據(jù)給出的漢字碼, 在屏幕指定位置輸出一個漢字.//// [參數(shù)表]// hzASC: 漢字ASC碼, 2字節(jié).// x, y: 漢字顯示位置的屏幕坐標(biāo).// color: 字體顏色.// bcolor: 背景顏色.// // 返回: //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~void ShowChineseFromASC(WORD hzASC,WORD x,WORD y,WORD color,int bcolor){ hzASC = ((hzASC & 0xFF) << 8) + (hzASC >> 8); // 漢字asc碼高低字節(jié)互換 ShowChineseChar24((char *)&hzASC,x,y,color,bcolor); // 顯示漢字}//ShowChineseFromASC()//~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~// 函數(shù): 顯示16*16字符.// 描述: 從字庫提取點陣, 顯示一個16*16字符.//// [參數(shù)表]// addr: 字符點陣地址.// x, y: 顯示坐標(biāo).// 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字節(jié) { 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); // 前景像素
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -