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

📄 lcd_draw.c

📁 C8051F020的LCD的驱动程序
💻 C
字号:

/************************************************************************************
*  Copyright (c) 2004,西安铭朗电子科技有限责任公司
*            All rights reserved.
*
* 文件名称: Lcd_Draw.C
* 文件标识: none
* 适用器件: C8051F020
* 
* 摘 要: 本文件是LCD显示程序;使用外部22.1184MHz晶振.本程序是
*		  图形显示应用程序。需要使用Lcd_Driver.c液晶驱动程序。
* 
* 当前版本:1.1
* 作 者:刘大伟
* 完成日期:2007年3月7日
*
* 历史版本:1.0
* 作 者:卢 阳
* 完成日期:2004年11月14日
*
* 历史版本:0.9 
* 原作者 : 李林利
* 完成日期:2004年1月1日
*************************************************************************************/

/************************************************************************************/
// 引用外部头文件
#include "Main.H"
#include <math.h>

/************************************************************************************/
/*************************************************************************************
* 函数名称:LCD_Draw_dot;
*
* 函数功能描述:画点(x,y);
*              
* 输入参数:BYTE类型坐标x,y; bool类型标识flag;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void  LCD_Draw_dot(unsigned char x,y,flag)
{
	unsigned char data temp,bit_x;

	bit_x=7-y%8;

	y=7-y/8;
	
	temp = LCDC_RdData (x,y);
	if (flag)
		temp|=(1<<bit_x);
	else
		temp&=~(1<<bit_x);

	LCDC_WrData(x,y,temp);
}

/***********************************************************************************
* 函数名称:LCD_Draw_line;
*
* 函数功能描述:(x1,y1)--(x2,y2)处划线;
*              
* 输入参数:BYTE类型坐标x1,y1,x2,y2; bool类型标识flag;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
unsigned char LCD_Draw_line(unsigned char x1,y1,x2,y2,flag)
{
	unsigned char data i,temp;
	float data k,b;
	
	if ((x1>=MAX_BIT_X)||(x2>=MAX_BIT_X)||(y1>=MAX_BIT_Y)||(y2>=MAX_BIT_Y))
		return false;
	if (y1==y2)			
	{
		if (x1>x2)
		{
			temp=x1;
			x1=x2;
			x2=temp;
		}
		for (i=x1;i<x2+1; i++)
			LCD_Draw_dot(i,y1,flag);
	}
	else if (x1==x2)			
	{
		if (y1>y2)
		{
			temp=y1;
			y1=y2;
			y2=temp;
		}
		for (i=y1;i<y2+1; i++)
			LCD_Draw_dot(x1,i,flag);
	}
	else
	{
		if (abs(x2-x1)>=abs(y2-y1))
		{
			k=1.0*(y2-y1)/(x2-x1);
			b=y1-k*x1;
			if (x1>x2)
			{
				temp=x1;
				x1=x2;
				x2=temp;
			}
			for (i=x1;i<x2+1; i++)
			{
				temp=k*i+b;
				LCD_Draw_dot(i,temp,flag);
			}	
		}
		else
		{
			k=1.0*(x2-x1)/(y2-y1);
			b=x1-k*y1;
			if (y1>y2)
			{
				temp=y1;
				y1=y2;
				y2=temp;
			}
			for (i=y1;i<y2+1; i++)
			{
				temp=k*i+b;
				LCD_Draw_dot(temp,i,flag);
			}	
		}
	}
}

/***********************************************************************************
* 函数名称:LCD_Draw_circle;
*
* 函数功能描述:以(x,y)为圆心,r为半径画圆;
*              
* 输入参数:unsigned char类型坐标x,y, bool类型标识flag;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void  LCD_Draw_circle(unsigned char x,y,r,flag)
{
	unsigned char data r_2,i,x1,y1,temp_x;
	unsigned int data temp;

	r_2=0.707*r;
	temp=r*r;
	for (i=0; i<=r_2; i++)
	{
		if (flag)
		{
			if (!(i&0x01))
			{	
				x1=i;
				y1=sqrt(1.0*(temp-x1*x1))+0.5;
				LCD_Draw_dot(x1+x,y1+y,flag);
				LCD_Draw_dot(-x1+x,y1+y,flag);
				LCD_Draw_dot(x1+x,-y1+y,flag);
				LCD_Draw_dot(-x1+x,-y1+y,flag);
		
				temp_x=x1;
				x1=y1;
				y1=temp_x;
		
				LCD_Draw_dot(x1+x,y1+y,flag);
				LCD_Draw_dot(-x1+x,y1+y,flag);
				LCD_Draw_dot(x1+x,-y1+y,flag);
				LCD_Draw_dot(-x1+x,-y1+y,flag);
			}
		}
		else
		{
			x1=i;
			y1=sqrt(1.0*(temp-x1*x1))+0.5;
			LCD_Draw_dot(x1+x,y1+y,flag);
			LCD_Draw_dot(-x1+x,y1+y,flag);
			LCD_Draw_dot(x1+x,-y1+y,flag);
			LCD_Draw_dot(-x1+x,-y1+y,flag);
	
			temp_x=x1;
			x1=y1;
			y1=temp_x;
	
			LCD_Draw_dot(x1+x,y1+y,flag);
			LCD_Draw_dot(-x1+x,y1+y,flag);
			LCD_Draw_dot(x1+x,-y1+y,flag);
			LCD_Draw_dot(-x1+x,-y1+y,flag);
		}
	}
}

/***********************************************************************************
* 函数名称:LCD_Draw_Rectangle;
*
* 函数功能描述:以(x1,y1)和(x2,y2)为对角点画矩形;
*              
* 输入参数:BYTE类型坐标x1,y1,x2,y2; bool类型标识flag;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void  LCD_Draw_Rectangle(unsigned char x1,y1,x2,y2,flag)
{
	LCD_Draw_line(x1,y1,x2,y1,flag);
	LCD_Draw_line(x1,y1,x1,y2,flag);

	LCD_Draw_line(x2,y1,x2,y2,flag);
	LCD_Draw_line(x1,y2,x2,y2,flag);
}

/***********************************************************************************
* 函数名称:LCD_Draw_FillRectangle;
*
* 函数功能描述:以(x1,y1)和(x2,y2)为对角点画矩形实体;
*              
* 输入参数:BYTE类型坐标x1,y1,x2,y2; bool类型标识flag;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void  LCD_Draw_FillRectangle(unsigned char x1,y1,x2,y2,flag)
{
	unsigned char data i;

	for (i=x1; i<=x2; i++)
		LCD_Draw_line(i,y1,i,y2,flag);
}

/***********************************************************************************
* 函数名称:Draw_dot;
*
* 函数功能描述:画点序列;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Draw_dot(void)
{	
	unsigned char x;
	unsigned char y;

	LCDC_DisFull(Clr);
	x=0;
	y=0;
  	while(1)
	{
		Delay_ms(10);
		LCD_Draw_dot(x,y,1);
		x+=2;
		if(x>128)
		{	
			y++;
			x=0;
		}
		if(y>64)
		{	
			LCDC_DisFull(Clr);
			y=0;
		}
		key=GetKey();
		if((key!=0xff)&&(key!=0x0a))
			return;
	}
}

/***********************************************************************************
* 函数名称:Draw_line;
*
* 函数功能描述:画过圆点的直线;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Draw_line(void)
{	
	unsigned char x;
	unsigned char y;

	LCDC_DisFull(Clr);
	x=0;
	y=0;
  	while(1)
	{
		Delay_ms(200);
		LCDC_DisFull(Clr);
		LCD_Draw_line(0,0,x,y,1);
		y+=3;
		if(y<63)
		{	
			x=127;
		}
		if(y>63)
		{	
			y=63;
			x-=6;
			if(x<=5)
			{
				y=0;
				x=127;
				LCDC_DisFull(Clr);
			}
		}
		key=GetKey();
		if((key!=0xff)&&(key!=0x0b))
			return;
	}
}

/***********************************************************************************
* 函数名称:Draw_Rectangle;
*
* 函数功能描述:画矩形;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Draw_Rectangle(void)
{	
	unsigned char x;
	unsigned char y;

	LCDC_DisFull(Clr);
	x=0;
	y=0;
  	while(1)
	{
		Delay_ms(200);
		LCD_Draw_Rectangle(63-x,31-y,63+x,31+y,1);
		x+=4;
		y+=2;
		if(x>64)
		{	
			x=0;
			LCDC_DisFull(Clr);
		}
		if(y>32)
		{	
			LCDC_DisFull(Clr);
			y=0;
		}
		key=GetKey();
		if((key!=0xff)&&(key!=0x0c))
			return;
	}
}

/***********************************************************************************
* 函数名称:Draw_FillRectangle;
*
* 函数功能描述:画实心矩形;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Draw_FillRectangle(void)
{
	unsigned char x;
	unsigned char y;

	LCDC_DisFull(Clr);
	x=0;
	y=0;
  	while(1)
	{
		Delay_ms(200);
		LCDC_DisFull(Clr);
		LCD_Draw_FillRectangle(63-x,31-y,63+x,31+y,1);
		x+=4;
		y+=2;
		if(x>64)
		{	
			x=0;
			LCDC_DisFull(Clr);
		}
		if(y>32)
		{	
			LCDC_DisFull(Clr);
			y=0;
		}
		key=GetKey();
		if((key!=0xff)&&(key!=0x0d))
			return;
	}
}

/***********************************************************************************
* 函数名称:Draw_circle;
*
* 函数功能描述:画同心圆;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/
void Draw_circle(void)
{	
	unsigned char x;

	LCDC_DisFull(Clr);
	x=0;
  	while(1)
	{
		Delay_ms(200);
		LCD_Draw_circle(63,31,x,1);
		x+=3;
		if(x>32)
		{	
			x=0;
			LCDC_DisFull(Clr);
		}
		key=GetKey();
		if((key!=0xff)&&(key!=0x0e))
			return;
	}
}

/************************************************************************************
* 文件结束
************************************************************************************/

⌨️ 快捷键说明

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