📄 graphic.c
字号:
//===================================================================//
// Project Name : EGL
// Module Name : GRAPHIC.C
// Product Type : 嵌入式图形库
// OS/Dev Tool : AT89S52, Keil 7.02
// Original Author : 张驿风
// Organization : 郑州市黑马电子有限公司
// Original Date : 2003-08-27
// Addr : 郑州市中原西路
// TEL : 0371-7947944
// EMail : cbuilder@peoplemail.com.cn
// 作者: 张驿风
// Build Time: 2004-05-25
//===================================================================//
//embed graphic library
//在作嵌入式开发时经常要用到图形界面,我希望能够拥有一套属于自己的图形
//驱动库引擎,将这个图形库引擎独立出具体的嵌入式项目,而单独作为一个项
//目,已达到兼容,重复利用的效果。可以订制,可以重复利用,可以边使用边
//维护。
//使用的汉子库是UCDOS下的HZK16
//使用的ASCII码字库是UCDOS下的ASC16
//将这两个文件通过WinHex程序合为一个文件ZYF.bin可以直接烧入到EPROM
//HZK16的地址范围是:0x000000~0x041550
//ASC16的地址范围是:0x041560~0x042550
//开始箭头图标地址 :0x042560~0x0426E0 START_ARROW_GRA (20x20)
//AirCondition地址 :0x0426F0~0x045EC0 AIR_CONDITION_GRA (81x67)
//LinuxGra 地址 :0x045ED0~0x047403 LINUX_GRA (48x298)
//使用keil7.02 时应使用汉字显示补丁否则会造成汉字显示混乱的现象.
//Ver 1.00 20040526 支持汉字显示支持直线,正方形,正弦波画图函数.
#include"graphic.h"
#include"YD603.h"
#include"regx52.h"
#include<absacc.h>
#include<math.h>
uchar code GraphicVersion[]={GRAPHIC_VER1,GRAPHIC_VER2,GRAPHIC_VER3,'\r','\n'};
uchar code Pallet[] = {clBlack,clBlue,clGreen,clYellow,clWhite,clRed};
struct BRUSH Brush;
struct PEN Pen;
//================================================//
// clr() 清屏函数 //
// functing:清除全部的屏幕缓冲区背景模式() //
// 默认为黑色背景可以使用阿API接口函数改变默认设置 //
// IN:no //
// OUT:no //
//================================================//;
void clr()
{
FlashDisMem(Brush.Color);
}
//---------------------------------------------------------------------
void IntitGraphic(uchar Color){
if(Color!=0) {
Brush.Color = Color;
Pen.Color = clWhite;
}else{
Brush.Color = clBlack;
Pen.Color = clWhite;
}
}
#if SET_PEN_COLOR
//------------------------------------
//设置花笔颜色
//------------------------------------
void SetPenColor(uchar Color){
Pen.Color = Color;
}
#endif
//---------------------------------------------------------------------
//=================================================//
// FlashDisMem() //
// FUNCTION:test a hardware color range //
// IN: Color background color //
// OUT: //
// if draw successful return 0 else return -1//
//=================================================//
char FlashDisMem(uchar Color){
uint i,j;
long addr;
addr = DIS_MEM_START;
for(i=0;i<210;i++){
P1 = (addr>>16) | GERNERAL_MASK;
P1 = addr>>16;
for(j=0;j<320;j++){
XBYTE[addr] = Color;
addr += 1;
}
addr += 192 ;
}
return 0;
}
#if DRAW_SIN
//---------------------------------------------------------------------
void DrawSin(){
float i;
uint x,y;
long addr;
#define M_PI 3.14
for(i=0;i<9*M_PI;i+=0.01){
x=i*10 + 20;
y=155+30*sin(i);
addr = y;
addr *= 0x200;
addr += x;
P1 = (addr>>16) | GERNERAL_MASK; //(addr>>16)& 0x7f;
XBYTE[addr] = Pen.Color;
ClearWatchDog();
}
}
#endif
#if RECTANGLE
//=================================================//
// rectangle() //
// FUNCTION:draw a rectangle use spcial left,top,
// width,height.
// IN:
// left :the rectangle x'start.
// top :the rectangle y'start.
// width :the rectangle width
// height :the rectangle height
// OUT:
// if draw successful return 0 else return -1
//=================================================//
char rectangle(uint left,uint top,uint width,uint height){
uint i,j;
long addr;
if(Brush.Mode==0){ //不填充
MoveTo(left,top);
LineTo(left+width,top);
LineTo(left,top+height);
MoveTo(left+width,top);
LineTo(left+width,top+height);
MoveTo(left,top+height);
LineTo(left+width,top+height);
}
if(Brush.Mode==1){ //实心填充
j = left;
for(i=top;i<=top+height;i++){
ClearWatchDog();
addr = i;
addr *= 0x200;
addr += left;
P1 = (addr>>16) | GERNERAL_MASK;//)& 0x7f;
for(j=0;j<width;j++){
addr += 1;
XBYTE[addr] = Brush.Color;
}
}
}
return true;
}
#endif
//---------------------------------------------------
#if TESTPIXEL
//---------------------------------------------------------------------
//=================================================//
// Pixel() //
// FUNCTION:Place a color dot to specical //
// IN: x,y,color //
// OUT: //
// if draw successful return 0 else return -1//
// addr = (Y+0x0e)*4e+int(x/2)+3
//=================================================//
char Pixel(uchar x,uchar y){
uint addr;
addr=(y+0x0e)*0x4e+x/2+3;
//XBYTE[addr] = Pen.Color;
return 0;
}
//--------------------------------------------------
//
//
//--------------------------------------------------
void TestPixel(){
uint i,j,k;
for( k =0;k<8;k++){
for(i=0;i<DIS_HEIGHT_PIX_MAX;i++){
ClearWatchDog();
for(j=0;j<DIS_WIDTH_PIX_MAX;j+=2){
Pixel(j,i);
}
}
}
}
#endif
#if MOVE_TO
//------------------------------------------------
void MoveTo(uint x,uint y){
Pen.X = x;
Pen.Y = y;
}
#endif
#if LINE_TO
//------------------------------------------------
//画线函数
//Pen.x,Pen.y 起点坐标
//x,y终点坐标
//设计目的为简单实用,没有加入过多的控制所以要求
//使用该函数时要千万小心,有一个原则是x,y的值一定
//要大于Pen.x,Pen.y
//------------------------------------------------
uchar LineTo(uint x,uint y){
uint i;
long addr;
uint TempX,TempY,Temp;
ClearWatchDog();
if((x<Pen.X)||(y<Pen.Y))
return false;
TempX = x-Pen.X;
TempY = y-Pen.Y;
if(TempY == 0){ //如果是一条水平直线
addr = Pen.Y;
addr *= 0x200;
addr += Pen.X;
P1 = (addr>>16) | GERNERAL_MASK;
//P1 = addr>>16;
for(i=Pen.X;i<=x;i++){
XBYTE[addr++] = Pen.Color;
}
}
if(TempX==0){ //如果是一条垂直线
for(i=0;i<=TempY;i++){
addr = Pen.Y+i;
addr *= 0x200;
addr += Pen.X;
P1 = (addr>>16)| GERNERAL_MASK;
XBYTE[addr] = Pen.Color;
}
}
if((TempX!=0)&(TempY!=0)){ //是一条斜线,循环TempY次画完,每次 X 加 Temp
if(y>Pen.Y){
Temp = (x - Pen.X) / TempY;
TempX = Pen.X;
for(i=0;i<TempY;i++){
addr = Pen.Y + i;
addr *= 0x200;
addr += TempX;
TempX += Temp;
P1 = (addr>>16)| GERNERAL_MASK;
XBYTE[addr] = Pen.Color;
}
}else if(y<Pen.Y){
Temp = (x - Pen.X) / TempY;
TempX = Pen.X;
for(i=0;i<TempY;i++){
addr = Pen.Y - i;
addr *= 0x200;
addr += TempX;
TempX += Temp;
P1 = (addr>>16)| GERNERAL_MASK;
XBYTE[addr] = Pen.Color;
}
}
}
ClearWatchDog();
return true;
}
#endif
#if INITDISBUF
void InitDisBuf(){
uchar i,j;
for(i=0;i<12;i++){
for(j=0;j<6;j++){
//DisBuf[i][j] = Pen.Color;
}
}
}
#endif
//-----------------------------------------------
//从硬汉字库中提取出ASCII码的点阵数据
//
//-----------------------------------------------
void ReadAsciiData(uchar *Ascii,uchar *p){
long Addr;
uchar i;
uchar P1Temp;
Addr = ((*Ascii) * 16) + ASCII_ZK_OFFSET;
P1Temp = Addr>>16;
P1Temp = P1Temp | GERNERAL_MASK;
P1 = P1Temp;
for(i=0;i<16;i++){
*(p++) = XBYTE[Addr++];
}
}
//-----------------------------------------------
//显示ASCII码
//
//-----------------------------------------------
void DisAscii(uint x, uint y,char *p){
char i,k;
unsigned long addr;
char *Temp;
uchar P1Temp;
//P1 = 0;
for(i=0;i<16;i++){
addr = y+i;
addr *= 0x200;
addr += x;
P1Temp = addr>>16;
P1Temp = P1Temp | GERNERAL_MASK;
P1 = P1Temp;
Temp = p+i; //得到点阵地址
for(k=7;k>=0;k--){
if(((*Temp)>>k)&0x01)
XBYTE[addr] = Pen.Color;
addr += 1;
}
}
DIS_ON = 1;
}
#if ASCII_TEXT_OUT
void AsciOut(uint x,uint y,char Ascii){
uchar idata Temp[32];
ReadAsciiData(&Ascii,&Temp[0]);
DisAscii(x, y,&Temp[0]);
}
#endif
//-----------------------------------------------
//从硬汉字库中提取出汉字的点阵数据
//Hz:汉字的机内码
//*P:读出的点阵数据存放地址
//QM = 机内码-0xA0
//WM = 机内码-0xA0
//Add = ((QM-1)*94 + (WM-1))*32
//-----------------------------------------------
void ReadHzData(uchar *Hz,uchar *p){
uchar i;
uint QM,WM;
long Addr;
uchar P1Temp;
QM = *(Hz++) - 0xA0;
WM = *Hz - 0xA0;
Addr = (QM - 1)*94;
Addr += WM - 1 ;
Addr *= 32; //得到汉字在汉字库中的点阵地址
Addr += HZK_ADDR_START;
P1Temp = Addr>>16;
P1Temp = P1Temp | GERNERAL_MASK;
P1 = P1Temp;
for(i=0;i<32;i++){
*(p++) = XBYTE[Addr++];
}
}
#if DISHZ
//--------------------------------------------------
// DisHz 再指定的位置(
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -