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

📄 lcm1602avr动.c

📁 atmega16L的LCD经典试验已经通过验证
💻 C
字号:
/************************************************************

函数名:1602驱动函数。

编写:邓椿薪

日期:2006年4月29日

引脚定义:数据总线==>PORTB;   En==>PD0;   R/W==>PD1;  RS==>PD2;
/***********************************************************/
#include<avr/io.h>

#define LCDPORT PORTB                        //数据总线接在PB口
#define LCDDDR  DDRB
#define LCDPIN  PINB
#define En_H    PORTD|=(1<<PD0)              //En接PD0
#define En_L    PORTD&=~(1<<PD0)
#define RW_R    PORTD|=(1<<PD1)              //R/W接PD1
#define RW_W    PORTD&=~(1<<PD1)
#define RS_H    PORTD|=(1<<PD2)              //RS接PD2
#define RS_L    PORTD&=~(1<<PD2)
#define DelaytE Delay(10)                    //延时

/*****************延时程序**********************/
void Delay(unsigned char time)
{
  while(time>0)
    {time--;}
}


/****************产生一个使能脉冲****************/
void En_Toggle(void)
{
  En_H;
  DelaytE;
  En_L;
  DelaytE;
}



/*******************检查LCD忙标志****************/
void Wait_Until_Ready(void)
{
  RW_R;
  RS_L;
  LCDDDR=0x00;
  LCDPORT=0x00;
  En_H;
  DelaytE;
  loop_until_bit_is_clear(LCDPIN,7);           //不断循环检查忙标志。
  En_L;
}



/***************写入命令字****************/
void Write_Command(unsigned char Command)
{ 
  RW_W;
  RS_L;
  LCDDDR=0xFF;
  LCDPORT=Command;            //发送数据
  En_Toggle();                //使能1602
  Wait_Until_Ready();         //查忙         
}


/****************写入数据(地址)************************/
void Write_Data(unsigned char Data)
{
  RW_W;
  RS_H;
  LCDDDR=0xFF;
  LCDPORT=Data;                 //发送地址
  En_Toggle();                  //使能1602
  Wait_Until_Ready();           //查忙
}


/************************设置字符位置**********************/

void Write_Positlon(unsigned char row,unsigned char colum)
{
  unsigned char p;
  if(row==1)
    {
	 p=colum-1;                      //上面一例
	 Write_Command(p);               //写入命令
	}
  else
    {
	 p=0xc0+colum-1;                 //下面一例
	 Write_Command(p);
	}
}


/********************写字符串*******************************/
void Write_String(unsigned char *s)    
{
  for(; *s!='\0';s++)               //
  {             
   Write_Data(*s);                  //写入数据
  }
}



/*********************lcd初始化*****************************/

void Initialize_LCD(void)      
{
  DDRD=0xff;                    //LCD的控制线接在PD口,所以将其设为输出
                                //此处可根据实际情况调整,或者在主程序中设置
								
  Write_Command(0x38);         //设为8位接口模式,显示2行字符
  DelaytE;
  Write_Command(0x38);         //设为8位接口模式,显示2行字符
  DelaytE;
  Write_Command(0x38);         //设为8位接口模式,显示2行字符
  DelaytE;
  Write_Command(0x06);         //写入新数据后光标右移
  DelaytE;
  Write_Command(0x0c);         //显示功能开,不显示光标
  DelaytE;
  Write_Command(0x01);         //清屏
}
unsigned char uchar[]={"www.89s51DIY.com"};
unsigned char uchar1[]={"mcu-DIY web"};

int main (void)
{   
    DDRA=0xff;
	PORTA=0x00;

    DDRD=0xff;                 //设置为输出
	PORTD=0x00;

	DDRB=0xff;
	PORTB=0x00;

    DDRC=0x00;                 //设为输入
	PORTC=0x0F;                //低四位上拉有效

    Initialize_LCD();          //LCD初始化
  
    while(1)
    {
      Write_Positlon(1,0);         //第一行,第一例
      Write_String(uchar);         //显示:
      Write_Positlon(2,2);         //第二行,第三例
      Write_String(uchar1);         //显示
    }
}

⌨️ 快捷键说明

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