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

📄 lcd_driver._h

📁 自己做的AVR洗衣机模型程序
💻 _H
字号:
#include <iom16v.h>
#include <macros.h>

#define nop()  NOP()


#define Set_CS() DDRA |= (1<<0);PORTA |= (1<<0)
#define Set_SID() DDRA |= (1<<1);PORTA |= (1<<1)
#define Set_SCLK() DDRA |= (1<<2);PORTA |= (1<<2)

#define Clr_CS() DDRA |= (1<<0);PORTA &=~(1<<0)
#define Clr_SID() DDRA |= (1<<1);PORTA &=~(1<<1)
#define Clr_SCLK() DDRA |= (1<<2);PORTA &=~(1<<2)
#define cls  W_1byte(0,0,0x01)//清屏

 
//====================================================================
//函数声明
void Delay(uint ms);      //延时子程序
void W_1byte(uchar RW, uchar RS, uchar W_data);
void Write_8bits(uint W_bits);
void LCD_Init(void);
/********************************************************************
********************************************************************/ 
//===================================================================

/********************************************************************
09.5.10
影龙   未完成
在(x,y)点写句子,能实现换行功能
********************************************************************/
/*
void Set_XY_str(uchar x, uchar y, uchar *p) 
{
uchar counter; 
counter=x*2-1;//把X值赋给COUNTER
x--;
switch (y)
{
case 1:W_1byte(0,0,(0x80+x));
case 2:W_1byte(0,0,(0x90+x));
case 3:W_1byte(0,0,(0x88+x));
case 4:W_1byte(0,0,(0x98+x));
}

	while(*p != 0)
	{counter++;
	    if(counter==16)//假如定时器等于8且为单数行
		 {y++;
		  counter=1;
		 switch (y)
		  {
		  case 1:W_1byte(0,0,0x80);counter=0;break;
		  case 2:W_1byte(0,0,0x90);counter=0;break;
		  case 3:W_1byte(0,0,0x88);counter=0;break;
		  case 4:W_1byte(0,0,0x98);counter=0;break;
		  default:break;
		  }
		 }		  
		W_1byte(0,1,*p++);//写字节数据
	}
}
*/

void Char_Set_XY(uchar x, uchar y, uchar *p) 
{
uchar i;
 
switch (y)
{
case 0:W_1byte(0,0,(0x80+x));break;
case 1:W_1byte(0,0,(0x90+x));break;
case 2:W_1byte(0,0,(0x88+x));break;
case 3:W_1byte(0,0,(0x98+x));break;
default:break;
}
  nop();
  for(i=0;p[i]!='\0';i++)
  {
   W_1byte(0,1,p[i]);
     nop();
  }
  nop();
}

void Set_XY(uchar x,uchar y)
{
nop();
switch (y)
{
case 0:W_1byte(0,0,(0x80+x));break;
case 1:W_1byte(0,0,(0x90+x));break;
case 2:W_1byte(0,0,(0x88+x));break;
case 3:W_1byte(0,0,(0x98+x));break;
default:break;
}
nop();
}

void Display_init(void)
{
 Clr_CS();
 Clr_SID();
 Clr_SCLK();
 LCD_Init();
/* //while(1){ 
  nop();
  nop();
  W_1byte(0,0,0x80);   //显示的地址0x80
  nop();
  for(i=0;mynew1[i]!='\0';i++)
  {
   W_1byte(0,1,mynew1[i]);
  }
  W_1byte(0,0,0x90);     //显示的地址0x90
  for(i=0;mynew2[i]!='\0';i++)
  {
   W_1byte(0,1,mynew2[i]); 
  }
  W_1byte(0,0,0x88);   //显示的地址0x88
  for(i=0;mynew3[i]!='\0';i++)
  {
   W_1byte(0,1,mynew3[i]);
  }
  W_1byte(0,0,0x98);     //显示的地址0x98
  for(i=0;mynew4[i]!='\0';i++)
  {
   W_1byte(0,1,mynew4[i]);
  }
  nop();
//  for(;;)
//  {
//    continue;
//  } 
// }
*/
}
/******************************************************************/
void LCD_Init(void)
{
  uchar cmd;
  cmd=0x30;   //功能设置 8位数据,基本指令
 W_1byte(0,0,cmd);
 Delay(2);
 cmd=0x0C;   //显示状态 ON,游标OFF,反白OFF
 W_1byte(0,0,cmd); //写指令
 Delay(2);
 cmd=0x01;   //清除显示
 W_1byte(0,0,cmd); //写指令
 Delay(2);
 cmd=0x02;   //地址归位
 W_1byte(0,0,cmd); //写指令
 Delay(2);
 cmd=0x80;   //设置DDRAM地址
 W_1byte(0,0,cmd); //写指令
 Delay(2);   //延时
}
/*******************************************************************
函 数 名:W_1byte
入口参数:RW、RS、W_data
出口参数:无
建立日期:2007年3月3日
修改日期:
函数作用:写一个字节的数据到12864液晶,包括指令和数据
说    明:RW=1,从液晶读数据到MCU;RW=0,写一个数据到液晶;
   (一般RW都设为0,即只向液晶写数据,不读数据)
          RS=1,写入的是数据;RS=0,写入的是指令;
    一般模式:RW=0,RS=1;写数据
       RW=0,RS=0;写指令
********************************************************************/
void W_1byte(uchar RW, uchar RS, uchar W_data)
{
	uint H_data,L_data,S_ID = 0xf8;	 //11111RWRS0
	if(RW == 0)
	{
	 	S_ID &=~ 0x04;
	}
	else					//if(RW==1)
	{
	 	S_ID |= 0X04;
	}
	if(RS == 0)
	{
	 	S_ID &=~ 0x02;
	}
	else					//if(RS==1)
	{
	 	S_ID |= 0X02;
	}
	H_data = W_data;
	H_data &= 0xf0;			//屏蔽低4位的数据
	L_data = W_data;	   	//xxxx0000格式
	L_data &= 0x0f;			//屏蔽高4位的数据
	L_data <<= 4;			//xxxx0000格式
	Set_CS();
	Write_8bits(S_ID); 		//发送S_ID
	Write_8bits(H_data);	//发送H_data
	Write_8bits(L_data);	//发送L_data
	Clr_CS();	
}
/********************************************************************
函 数 名:Write_8bits
入口参数:W_bits
出口参数:无
建立日期:2007年3月3日
修改日期:
函数作用:负责串行输出8个bit位
说    明:
********************************************************************/
void Write_8bits(uint W_bits)
{
	uint i,Temp_data;
	for(i=0; i<8; i++)
	{
		Temp_data = W_bits;
		Temp_data <<= i;
		if((Temp_data&0x80)==0)
		{
		 	Clr_SID();
		}
		else
		{
		 	Set_SID();
		} 
		nop();
		Set_SCLK();
		nop();
		nop();
		Clr_SCLK();
		nop();
		Clr_SID();
	}
}
/*
//字符反白函数
//clear==1时清除反白
//clear==0时设置反白
void Set_White(uchar x,uchar y,uchar end_x,uchar clear)
{
 	uchar i, j, white_x, white_y,white_end_x,clr_x,clr_y;		//
	white_end_x = (end_x-x+1);
	white_end_x <<= 1;
	if(y==1)
	{
	 	white_x = (0x80+x-1);
		white_y = 0x80;
		clr_x = 0x80;
		clr_y = 0x80;
	}
	else if(y==2)
	{
	 	white_x = (0x80+x-1);
		white_y = 0x90;
		clr_x = 0x80;
		clr_y = 0x90;
	}
	else if(y==3)
	{
	 	white_x = (0x88+x-1);
		white_y = 0x80;
		clr_x = 0x88;
		clr_y = 0x80;
	}
	else if(y==4)
	{
	 	white_x = (0x88+x-1);
		white_y = 0x90;
		clr_x = 0x88;
		clr_y = 0x90;
	}
	if(clear==0)//要反白时,先将整行的液晶全部清成不反白(此处行指y)
	{
	 	for(i=0;i<16;i++ )			//16行
		{
		 	W_1byte(0,0,clr_y++);	//设置绘图区的Y地址坐标0
			W_1byte(0,0,clr_x);		//设置绘图区的X地址坐标0
			for(j=0;j<16;j++)		//
			{
			 	W_1byte(0,1,0x00);	//清成不反白
			 	nop();
			}
		}
	}
	nop();
	for(i=0;i<16;i++ )				//16行,因为是16*16汉字
	{
		W_1byte(0,0,white_y++);		//设置绘图区的Y地址坐标0
		W_1byte(0,0,white_x);		//设置绘图区的X地址坐标0
		for(j=0;j<white_end_x;j++)	//
		{
			 if(clear==1)
			 {
			  	W_1byte(0,1,0x00); //取消这一行的8个点的反白,液晶地址自动加1
								   //(此处行指一个一个液晶点所组成的行)
			 }
			 else
			 {
				W_1byte(0,1,0xff); //反白这一行的8个点,液晶地址自动加1
								   //(此处行指一个一个液晶点所组成的行)
			 }
			 nop();
		}
	}
}*/

⌨️ 快捷键说明

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