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

📄 lcd.c

📁 在单片机控制的液晶屏上显示汉字
💻 C
📖 第 1 页 / 共 2 页
字号:
* 注意:    none;
************************************************************************************/

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;

	ENABLE_INTERRUPTS;
  }

/***********************************************************************************
* 函数名称:lcd_rdda;
*
* 函数功能描述:从LCD中读数据;
*              
* 输入参数:unsigned char类型坐标x,y, 
*
* 返回数据:unsigned char类型读出数据;
*
* 注意:    none;
************************************************************************************/

unsigned char lcd_rdda(unsigned char x,unsigned char y)
{  
	unsigned char xdata readdata;

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

			tp=addr;
			addr=0x1805;
		 }
    else
         {
			addr=0x980b;

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

			tp=addr;
			addr=0x1805;
		 }
    else
         {
			addr=0x980b;

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

/***********************************************************************************
* 函数名称:dis_start;
*
* 函数功能描述:显示开机画面;
*              
* 输入参数:none;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

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;
              }
        }
}

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

void  LCD_Draw_dot(unsigned char x,unsigned char 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);
}

/***********************************************************************************
* 函数名称:LCD_Draw_line;
*
* 函数功能描述:(x1,y1)--(x2,y2)处划线;
*              
* 输入参数:BYTE类型坐标x1,y1,x2,y2; bool类型标识flag;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

bool  LCD_Draw_line(unsigned char 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);
			}	
		}
	}
}

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

void  LCD_Draw_circle(unsigned char x,unsigned char y,unsigned char 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);
		}

	}
}

/***********************************************************************************
* 函数名称: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, 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);
}


/***********************************************************************************
* 函数名称: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, bool flag)
{
	R_BYTE  i;
	for (i=x1; i<=x2; i++)
		LCD_Draw_line(i,y1,i,y2,flag);
}

/***********************************************************************************
* 函数名称:LCD_Draw_byte;
*
* 函数功能描述:向LCD写一个字节数据;
*              
* 输入参数:BYTE类型坐标x,y;BYTE类型字节数据value;
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void  LCD_Draw_byte(unsigned char x,y, unsigned char 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);		
	}
}

/***********************************************************************************
* 函数名称:LCD_Disp_Word;
*
* 函数功能描述:向LCD写一组数据,显示黑字符;
*              
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据code区指针p;
*	    BYTE类型占用空间line*8行,length列
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void LCD_Disp_Word(unsigned char x,y,unsigned char code *p,unsigned char 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++);
	
}

/***********************************************************************************
* 函数名称: LCD_Disp_Word_F;
*
* 函数功能描述:向LCD写一组数据,显示白字符;
*              
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据code区指针p;
*	    BYTE类型占用空间line*8行,length列
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void LCD_Disp_Word_F(unsigned char x,y,unsigned char code *p,unsigned char 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++));
	
}

/***********************************************************************************
* 函数名称: LCD_Disp_Time;
*
* 函数功能描述:向LCD写一组数据,显示时间;
*              
* 输入参数:BYTE类型写入起始坐标x,y; BYTE类型写入数据code区指针p;
*	    BYTE类型占用空间line*8行,length列
*
* 返回数据:none;
*
* 注意:    none;
************************************************************************************/

void LCD_Disp_Time(unsigned char x,y,unsigned char code *p,unsigned char 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 + -