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

📄 lcd.c

📁 128X64点阵LCD驱动电路及源程序。可完成点、线、圆、英文字符、汉字显示。液晶驱动芯片为12864B,开发环境为KEIL C uVersion2。
💻 C
📖 第 1 页 / 共 5 页
字号:
		tcs1 = 0;
		tcs2 = 1;
		tcolumn = Px-64;
	}
  	tpage = Py>>3;
    WI2CToLCD(tcs1, tcs2, tpage, tcolumn, ValByte);
}
/*
**********************************************************************
函数名: B_DrawLine
参数: 起始点(Sx,Sy)与终点坐标(Ex,Ey),范围(X=0-MaxHdots,Y=0-MaxVdots)
     颜色值Color(点亮=1;熄灭=0)
返回值: 无
作用: 用于在屏幕指定两点间画一条直线(采用DDA)算法
**********************************************************************
*/
extern void B_DrawLine(uchar Sx, uchar Sy, uchar Ex, uchar Ey, bit Color)
{
    uchar Dx;  //当前作图点的X坐标
    uchar Dy;  //当前作图点的Y坐标
    uchar i;
    uchar LoopLen;
    //DDA
    float DDA_X;
    float DDA_Y;
    float DelX;
    float DelY;
    float DDA_xInc;
    float DDA_yInc;
    bit  Dstyle;
    uchar Midch;

    if( Sx==Ex )//X座标重叠则画坚直线
    {
    	Dx=Sx; Dy=Sy;
    	LoopLen=B_DelVal(Sy,Ey);
    	for(i=0;i<=LoopLen;i++)
    	{
    		draw_pixel(Dx,Dy,Color);//在当前位置画点
    		if( Dy<Ey )
    		  Dy++;
    		else
    		  Dy--;
    	}
    }
    else if(Sy==Ey)//Y座标重叠则画水平线
    {
    	Dx=Sx; Dy=Sy;
    	LoopLen=B_DelVal(Sx,Ex);
    	for(i=0;i<=LoopLen;i++)
    	{
    		draw_pixel(Dx,Dy,Color);//在当前位置画点
    		if( Dx<Ex )
    		  Dx++;
    		else
    		  Dx--;
    	}
    }
    else //DDA直线插值算法
    {
    	//由于C51中浮点数(正负数)处理能力有限,将起点与终点进行规格化
    	//要保证Sx<Ex且Sy<Ey
    	Dstyle=0;//Dstyle=0不镜像
    	if(Sx>Ex && Sy>Ey)//交换
    	{
    		     Midch=Sx; Sx=Ex; Ex=Midch;
                 Midch=Sy; Sy=Ey; Ey=Midch;
                 Dstyle=0;
        }
    	else if(Sx<Ex && Sy>Ey)//Dstyle=1
    	{
    		Ey=Sy+B_DelVal(Ey,Sy);//镜像
    		Dstyle=1;
    	}
    	else if(Sx>Ex && Sy<Ey)//交换Dstyle=1
    	{
                 Midch=Sx; Sx=Ex; Ex=Midch;
                 Midch=Sy; Sy=Ey; Ey=Midch;
                 Ey=Sy+B_DelVal(Ey,Sy);//镜像
                 Dstyle=1;
    	}
    	DDA_X=Sx; DDA_Y=Sy;
    	DelX = B_DelVal(Ex,Sx);
    	DelY = B_DelVal(Ey,Sy);
        if(DelX > DelY)
           LoopLen = DelX;
        else
           LoopLen = DelY;

        DDA_xInc = DelX / LoopLen;
        DDA_yInc = DelY / LoopLen;
        Dx=B_DDARound(DDA_X) % 256;
        Dy=B_DDARound(DDA_Y) % 256;
        if(Dstyle)
         	Dy=Sy-B_DelVal(Dy,Sy);

        draw_pixel(Dx % MaxHdots, Dy % MaxVdots, Color);

        for(i = 0;i<=LoopLen - 1;i++)
        {
           DDA_X+=DDA_xInc;
           DDA_Y+=DDA_yInc;
           Dx=B_DDARound(DDA_X) % 256;
           Dy=B_DDARound(DDA_Y) % 256;
           if(Dstyle)
         	Dy=Sy-B_DelVal(Dy,Sy);

           draw_pixel(Dx % MaxHdots, Dy % MaxVdots, Color);
        }
    }
}
/*
**********************************************************************
函数名: B_DrawRect
参数: 左上角起始点(Sx,Sy)
      右下角座标(Ex,Ey)
      填充形式(=0线框形式  ;=1填充形式)
      颜色值Color(点亮=1;熄灭=0)
返回值: 无
作用: 用于在屏幕指定矩形左上角顶点处画矩形
**********************************************************************
*/
extern void B_DrawRect(uchar Sx, uchar Sy, uchar Ex, uchar Ey, bit Style, bit Color)
{
    uchar Dx;  //当前作图点的X坐标
    uchar Dy;  //当前作图点的Y坐标
    uchar i,j;
    uchar LoopLen, LL2;

    if( Sx==Ex )//X座标重叠则画坚直线
    {
    	Dx=Sx; Dy=Sy;
    	LoopLen=B_DelVal(Sy,Ey);
    	for(i=0;i<=LoopLen;i++)
    	{
    	   draw_pixel(Dx,Dy,Color);//在当前位置画点
    	   if( Dy<Ey )
    		Dy++;
    	   else
    	        Dy--;
    	}
    }
    else if(Sy==Ey)//Y座标重叠则画水平线
    {
    	Dx=Sx; Dy=Sy;
    	LoopLen=B_DelVal(Sx,Ex);
    	for(i=0;i<=LoopLen;i++)
    	{
    	   draw_pixel(Dx,Dy,Color);//在当前位置画点
    	   if( Dx<Ex )
    		Dx++;
    	   else
    		Dx--;
    	}
    }
    else
    {
    	if(!Style) //线框形式
    	{
    	        //画竖直边
     	        Dx=Sx; Dy=Sy;
    	        LoopLen=B_DelVal(Sy,Ey);
    	        for(i=0;i<=LoopLen;i++)
    	        {
    	             draw_pixel(Dx,Dy,Color);//在当前位置画点
    		     if( Dy<Ey )
    		         Dy++;
    		     else
    		         Dy--;
    	        }
                Dx=Ex; Dy=Sy;
    	        LoopLen=B_DelVal(Sy,Ey);
    	        for(i=0;i<=LoopLen;i++)
    	        {
    	             draw_pixel(Dx,Dy,Color);//在当前位置画点
    		     if( Dy<Ey )
    		         Dy++;
    		     else
    		         Dy--;
    	        }
    		//画水平边
    	        Dx=Sx; Dy=Sy;
    	        LoopLen=B_DelVal(Sx,Ex);
    	        for(i=0;i<=LoopLen;i++)
    	        {
    	             draw_pixel(Dx,Dy,Color);//在当前位置画点
    		     if( Dx<Ex )
    		         Dx++;
    		     else
    		         Dx--;
    	        }
    	        Dx=Sx; Dy=Ey;
    	        LoopLen=B_DelVal(Sx,Ex);
    	        for(i=0;i<=LoopLen;i++)
    	        {
    	             draw_pixel(Dx,Dy,Color);//在当前位置画点
    		     if( Dx<Ex )
    		         Dx++;
    		     else
    		         Dx--;
    	        }
    	}
    	else//填充形式
    	{
    		Dx=Sx; Dy=Sy;
    		LoopLen=B_DelVal(Sx,Ex);
    		LL2=B_DelVal(Sy,Ey);
    		for(j=0;j<=LoopLen;j++)
    		{
    			Dy=Sy;
    			for(i=0;i<=LL2;i++)
    			{
    	                       draw_pixel(Dx,Dy,Color);//在当前位置画点
    		               if( Dy<Ey )
    		                  Dy++;
    		               else
    		                  Dy--;
    			}
    		        if( Dx<Ex )
    		           Dx++;
    		        else
    		           Dx--;
    		}
    	}
    }
}

/*
**********************************************************************
函数名: B_DrawCirc
参数: 圆心点座标(Cx,Cy)
      半径Radium
      填充形式Style(=0线框形式  ;=1填充形式)
      显示类型Color=1显示,=0取消显示
返回值: 成功返回true (1) ; 失败返回false (0)
作用: 用于在屏幕指中心点处以半径R画圆(Bresenham法)
**********************************************************************
*/
extern void B_DrawCirc(uchar Cx, uchar Cy, uchar Radium, bit Style, bit Color)
{
    uchar Dx;  //当前作图点的X坐标
    uchar Dy;  //当前作图点的Y坐标
    uchar TCx, TCy;
    uchar TemRadium;
    signed int TemF;
    signed int TemVal;
	TemVal=+1;
    TCx = Cx; TCy= Cy;
    TemRadium = Radium;

    if(TemRadium>1)
    {
   	 Dx = 0;
         Dy = TemRadium;
           //起点
           if(!Style)//线框模式
           {
                 draw_pixel(Cx%MaxHdots,(Cy-Dy)%MaxVdots,Color); //在当前位置画点(第1象限)
                 draw_pixel((Cx-Dy)%MaxHdots, Cy%MaxVdots,Color); //在当前位置画点(第2象限)
                 draw_pixel(Cx%MaxHdots,(Cy+Dy)%MaxVdots,Color); //在当前位置画点(第3象限)
                 draw_pixel((Cx+Dy)%MaxHdots, Cy%MaxVdots,Color); //在当前位置画点(第4象限)
           }
           else//填充模式
           {
                 B_DrawLine((Cx+Dx)%MaxHdots, (Cy-Dy)%MaxVdots,
                            (Cx+Dx)%MaxHdots, (Cy+Dy)%MaxVdots, Color);//竖直线1
                 B_DrawLine((Cx-Dy)%MaxHdots, (Cy-Dx)%MaxVdots,
                            (Cx+Dy)%MaxHdots, (Cy+Dx)%MaxVdots, Color);//水平线1

           }
         TemF = 1.25- TemVal*TemRadium ;
         do
         {
           if (TemF < 0)
           {
              Dx+=1;
              TemF =TemF+  TemVal* 2 * Dx + 1 ;
           }
           else
           {
              Dx+=1;
              Dy-=1;
              TemF =TemF+ TemVal* 2 * (Dx - Dy) + 1;
           }
           //画4象限圆
           if(!Style)//线框模式
           {
                 draw_pixel((Cx+Dx)%MaxHdots,(Cy-Dy)%MaxVdots,Color); //在当前位置画点(第1象限)
                 draw_pixel((Cx+Dy)%MaxHdots,(Cy-Dx)%MaxVdots,Color); //在当前位置画点(第1象限)
                 draw_pixel((Cx-Dx)%MaxHdots,(Cy-Dy)%MaxVdots,Color); //在当前位置画点(第2象限)
                 draw_pixel((Cx-Dy)%MaxHdots,(Cy-Dx)%MaxVdots,Color); //在当前位置画点(第2象限)
                 draw_pixel((Cx-Dx)%MaxHdots,(Cy+Dy)%MaxVdots,Color); //在当前位置画点(第3象限)
                 draw_pixel((Cx-Dy)%MaxHdots,(Cy+Dx)%MaxVdots,Color); //在当前位置画点(第3象限)
                 draw_pixel((Cx+Dx)%MaxHdots,(Cy+Dy)%MaxVdots,Color); //在当前位置画点(第4象限)
                 draw_pixel((Cx+Dy)%MaxHdots,(Cy+Dx)%MaxVdots,Color); //在当前位置画点(第4象限)
           }
           else//填充模式
           {
                 B_DrawLine((Cx+Dx)%MaxHdots, (Cy-Dy)%MaxVdots,
                            (Cx+Dx)%MaxHdots, (Cy+Dy)%MaxVdots, Color);//竖直线1
                 B_DrawLine((Cx-Dx)%MaxHdots, (Cy-Dy)%MaxVdots,
                            (Cx-Dx)%MaxHdots, (Cy+Dy)%MaxVdots ,Color);//竖直线2
                 B_DrawLine((Cx+Dy)%MaxHdots, (Cy-Dx)%MaxVdots,
                            (Cx-Dy)%MaxHdots, (Cy-Dx)%MaxVdots, Color);//水平线1
                 B_DrawLine((Cx+Dy)%MaxHdots, (Cy+Dx)%MaxVdots,
                            (Cx-Dy)%MaxHdots, (Cy+Dx)%MaxVdots, Color);//水平线2
           }
         }while (Dx < Dy);
   }
}

/*//内部静态函数
**********************************************************************
函数名: B_DelVal
参数: 无符号数A,B 范围(0-255)
返回值: 两数差值
作用: 返回两个无符号数间的差值
**********************************************************************
*/
static uchar B_DelVal(uchar A, uchar B)
{
     if( A>=B)
       return (A-B);
     else
       return (B-A);
}
/*
**********************************************************************
函数名: B_DDARound
参数: 浮点数Temval
返回值: int值
作用: 经DDA算法圆整的整数(有符号数)
**********************************************************************
*/
static int B_DDARound(float TemVal)
{
     return (TemVal+0.5);
}


/*字体SMALL, 5x8   470Byte  */
static code uchar SmallZiMo[94][5]={
{0x00,0x00,0xf2,0x00,0x00},/*"!",1*/
{0x00,0xe0,0x00,0xe0,0x00},/*""",2*/
{0x28,0x7c,0x28,0x7c,0x28},/*"#",3*/
{0x74,0x54,0xfe,0x54,0x74},/*"$",4*/
{0xc4,0xc8,0x10,0x26,0x46},/*"%",5*/
{0x6c,0x92,0xaa,0x44,0x0a},/*"&",6*/
{0xa0,0xc0,0x00,0x00,0x00},/*"'",7*/
{0x38,0x44,0x82,0x00,0x00},/*"(",8*/
{0x82,0x44,0x38,0x00,0x00},/*")",9*/
{0x28,0x10,0x7c,0x10,0x28},/*"*",10*/
{0x10,0x10,0x7c,0x10,0x10},/*"+",11*/
{0x07,0x06,0x06,0x00,0x00},/*",",12*/
{0x10,0x10,0x10,0x10,0x00},/*"-",13*/
{0x06,0x06,0x00,0x00,0x00},/*".",14*/
{0x04,0x08,0x10,0x20,0x40},/*"/",15*/
{0x7c,0x8a,0x92,0xa2,0x7c},/*"0",16*/
{0x00,0x42,0xfe,0x02,0x00},/*"1",17*/
{0x42,0x86,0x8a,0x92,0x62},/*"2",18*/
{0x84,0x82,0xa2,0xd2,0x8c},/*"3",19*/
{0x18,0x28,0x48,0xfe,0x08},/*"4",20*/
{0xe4,0xa2,0xa2,0xa2,0x9c},/*"5",21*/
{0x3c,0x52,0x92,0x92,0x0e},/*"6",22*///4-21MODIFY
{0x80,0x8e,0x90,0xa0,0xc0},/*"7",23*/
{0x6c,0x92,0x92,0x92,0x6c},/*"8",24*/
{0x60,0x92,0x92,0x94,0x78},/*"9",25*/
{0x00,0x6c,0x6c,0x00,0x00},/*":",26*/
{0x00,0x6a,0x6c,0x00,0x00},/*";",27*/
{0x10,0x28,0x44,0x82,0x00},/*"<",28*/
{0x28,0x28,0x28,0x28,0x28},/*"=",29*/
{0x82,0x44,0x28,0x10,0x00},/*">",30*/
{0x40,0x80,0x8a,0x90,0x60},/*"?",31*/
{0x4c,0x92,0x9e,0x82,0x7c},/*"@",32*/
{0x7e,0x88,0x88,0x88,0x7e},/*"A",33*/
{0xfe,0x92,0x92,0x92,0x6c},/*"B",34*/
{0x7e,0x82,0x82,0x82,0x44},/*"C",35*/
{0xfe,0x82,0x82,0x44,0x38},/*"D",36*/
{0xfe,0x92,0x92,0x92,0x82},/*"E",37*/
{0xfe,0x90,0x90,0x90,0x80},/*"F",38*/
{0x7c,0x82,0x92,0x92,0x5c},/*"G",39*/
{0xfe,0x10,0x10,0x10,0xfe},/*"H",40*/
{0x00,0x82,0xfe,0x82,0x00},/*"I",41*/
{0x04,0x02,0x82,0xfc,0x80},/*"J",42*/
{0xfe,0x10,0x28,0x44,0x82},/*"K",43*/
{0xfe,0x02,0x02,0x02,0x02},/*"L",44*/
{0xfe,0x40,0x30,0x40,0xfe},/*"M",45*/
{0xfe,0x20,0x10,0x08,0xfe},/*"N",46*/
{0x7c,0x82,0x82,0x82,0x7c},/*"O",47*/
{0xfe,0x90,0x90,0x90,0x60},/*"P",48*/
{0x7c,0x82,0x8a,0x84,0x7a},/*"Q",49*/
{0xfe,0x90,0x98,0x94,0x62},/*"R",50*/

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -