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

📄 mylcd.c

📁 c8051f020LCD驱动
💻 C
📖 第 1 页 / 共 2 页
字号:
					LCD_Draw_Rectangle(40,50,20,10,1);
					break;
				case 0x5e:		
					dis_clr();
					LCD_Draw_FillRectangle(50,50,90,90,1);
					break;
				case 0x79:		
					dis_clr();
					LCD_Draw_circle(60,30,20,1);
					break;
				case 0x71:		
					dis_clr();
					dis_start0();
					break;
				default:        ;
			}
		}
   	Delay(5000);
	}

}
/****************************************************************************************/
void dis_clr(void)
{
      unsigned char x,y;
      for(y=0;y<8;y++)
        {
           for(x=0;x<128;x++)                
                 lcd_wrda(x,y,0x00);
        }
}
/****************************************************************************************/
void dis_full(void)
{
      unsigned char x,y;
      for(y=0;y<8;y++)
        {
           for(x=0;x<128;x++)                
                 lcd_wrda(x,y,0xff);
        }
}
/****************************************延时*******************************************/
void Delay(Uchar MS)
	{
		Uchar us,usn;
		while(MS!=0)
			{ usn = 4;
				while(usn!=0)
					{
						us=0xf0;
						while (us!=0){us--;};
						usn--;
					}
				MS--;
			}
	}
/****************************************自定义************************************/

void checkbusy(void)
{
	addr=0x980e;

	_nop_();_nop_();
    _nop_();_nop_();

	do
	{
		tp=addr;
	}while((*tp&0x80)==0x80);

	addr=0x180f;
}

//write command to lcd
void lcd_wrct(unsigned char dd)
{
	DISABLE_INTERRUPTS;	

	addr=0x980c;
    tp=addr;
	*tp=dd;

	addr=0x180c;

	_nop_();_nop_();
    _nop_();_nop_();

	addr=0x180d;

	ENABLE_INTERRUPTS;
}


//set write or read lcd position
void set_xy(unsigned char x,unsigned char y)
{
	DISABLE_INTERRUPTS;
  
    checkbusy();

	y&=0x07;
	y|=0xB8;
	lcd_wrct(y);

    x&=0x3F;
	x|=0x40;
	lcd_wrct(x);

	ENABLE_INTERRUPTS;
}

//write data to lcd
void lcd_wrda(unsigned char x,unsigned char y,unsigned char dd)
  {
    
   	DISABLE_INTERRUPTS;
	set_xy(x,y);
    checkbusy();
    if(x<64)
         {
			addr=0x9805;
			tp=0x9805;
		 }
    else
         {
			addr=0x9809;
			tp=0x9809;
		 }


	*tp=dd;

//	SelectLCD();
//	addr&=0x1fff;

//	_nop_();_nop_();
//	_nop_();_nop_();

//	UnSelectLCD();
//	addr|=0x8000;

	ENABLE_INTERRUPTS;
  }

//read data from lcd
unsigned char lcd_rdda(unsigned char x,unsigned char y)
{  
unsigned char xdata readdata;

    set_xy(x,y);
    checkbusy();
    if(x<64)
         {//SelectLeft();
			addr=0x9807;

			tp=addr;
			addr=0x1805;
		 }
    else
         {//SelectRight();
			addr=0x980b;

			tp=addr;
			addr=0x1809;
		 }
	readdata=*tp;
    checkbusy();
    if(x<64)
         {//SelectLeft();
			addr=0x9807;

			tp=addr;
			addr=0x1805;
		 }
    else
         {//SelectRight();
			addr=0x980b;

			tp=addr;
			addr=0x1809;
		 }
	readdata=*tp;
	return readdata;
}

//显示开机画面
void dis_start(void)
  {
      unsigned char x,y;
      for(y=0;y<8;y++)
        {
           for(x=0;x<128;x++)
              {
                 _nop_();_nop_();
                 lcd_wrda(x,y,0xAA); _nop_();_nop_();
                 lcd_wrda(x+1,y,0x55);_nop_();_nop_();
                 x+=1;
              }
        }
  }


// draw dot in lcd (x,y)
void  LCD_Draw_dot(BYTE x,BYTE y,bool flag)
{
	R_BYTE temp,bit_x;

	bit_x=7-y%8;

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

	lcd_wrda(x,y,temp);
}


//draw line in lcd (x1,x2)--(x2,y2)
bool  LCD_Draw_line(BYTE x1,y1,x2,y2,bool flag)
{
	R_BYTE 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);
			}	

		}
	}
}


void  LCD_Draw_circle(BYTE x,BYTE y,BYTE r,bool flag)
{
	R_BYTE r_2,i,x1,y1,temp_x;
	R_WORD 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);
		}

	}
}


void  LCD_Draw_Rectangle(BYTE  x1,y1,x2,y2, bool 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);
}


void  LCD_Draw_FillRectangle(BYTE  x1,y1,x2,y2, bool flag)
{
	R_BYTE  i;
	for (i=x1; i<=x2; i++)
		LCD_Draw_line(i,y1,i,y2,flag);
}



void  LCD_Draw_byte(BYTE x,y, BYTE value)
{
	R_BYTE temp,bit_x;

	bit_x=y%8;
	y=y/8;

	if (bit_x==0)
		lcd_wrda(x,y,value);
	else
	{	
		temp=lcd_rdda(x,y);	
		
		temp&=(0xff>>(8-bit_x));
		temp|=(value<<bit_x);
		lcd_wrda(x,y,temp);
	
		temp=lcd_rdda(x,y+1);
		temp&=(0xff<<bit_x);
		temp|=(value>>(8-bit_x));
		lcd_wrda(x,y+1,temp);		
	}
}


void LCD_Disp_Word(BYTE x,y,BYTE code *p,BYTE line,length)
{
	R_BYTE i,j;

	y+=(4<<line);	
	if (y>64)
		y=64;
	y=64-y;
		
	for (i=0; i<line; i++)
	for (j=0; j<length; j++)
		LCD_Draw_byte(x+j,y+i*8, *p++);
	
}

void LCD_Disp_Word_F(BYTE x,y,BYTE code *p,BYTE line,length)
{
	R_BYTE i,j;

	y+=(4<<line);	
	if (y>64)
		y=64;
	y=64-y;
		
	for (i=0; i<line; i++)
	for (j=0; j<length; j++)
		LCD_Draw_byte(x+j,y+i*8, ~(*p++));
	
}

void LCD_Disp_Time(BYTE x,y,BYTE code *p,BYTE line,length)
{
	R_BYTE i,j;

	y+=(4<<line);	
	if (y>64)
		y=64;
	y=64-y;
		
	for (i=0; i<line; i++)
	for (j=0; j<length; j++)
		LCD_Draw_byte(x+j,y+i*8, *p++);
}

⌨️ 快捷键说明

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