⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 graphic.c

📁 avr单片机操控ks0108c图形点阵液晶屏代码
💻 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 + -