单片机
返回首页

AVR六个IO口驱动液晶LCD1602

2016-07-18 来源:eefocus

液晶LCD1602比中文大液晶12864较容易驱动,这个驱动程序只用六个单片机IO口驱动,可以减少四个IO口,套用也方便...

//LCD1602.h

/*---------------------------------------------------------------
要使用本驱动,改变下面配置信息即可

注意:RW要接地
-----------------------------------------------------------------*/
#define LCD_EN_PORT    PORTD   //以下2个要设为同一个口
#define LCD_EN_DDR     DDRD
#define LCD_RS_PORT    PORTD   //以下2个要设为同一个口
#define LCD_RS_DDR     DDRD
#define LCD_DATA_PORT  PORTD   //以下3个要设为同一个口
#define LCD_DATA_DDR   DDRD    //一定要用高4位
#define LCD_DATA_PIN   PIND
#define LCD_RS         (1<<0) //0x04   portd2       out
#define LCD_EN         (1<<2) //0x08   portd3       out
#define LCD_DATA       ((1<<4)|(1<<5)|(1<<6)|(1<<7)) //0xf0   portd4/5/6/7 out
/*-------------------------------------------------------------------------------
函数说明
------------------------------------------------------------------------------*/
void LCD_init(void);
void LCD_en_write(void);
void LCD_write_command(unsigned  char command) ;
void LCD_write_data(unsigned char data);
void LCD_set_xy (unsigned char x, unsigned char y);
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);
void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data);
void delay_nus(unsigned int n);
void delay_nms(unsigned int n);

//LCD1602.c

#include
#include
#include'LCD1602.h'


void delay_1us(void)                 //1us延时函数
  {
   asm('nop');
  }

void delay_nus(unsigned int n)       //N us延时函数
  {
   unsigned int i=0;
   for (i=0;i   delay_1us();
  }
  
void delay_1ms(void)                 //1ms延时函数
  {
   unsigned int i;
   for (i=0;i<1140;i++);
  }
  
void delay_nms(unsigned int n)       //N ms延时函数
  {
   unsigned int i=0;
   for (i=0;i   delay_1ms();
  }


/*----------------------------------------------------------------------------*/
void LCD_init(void)         //液晶初始化
{
  LCD_DATA_DDR|=LCD_DATA;   //数据口方向为输出
  LCD_EN_DDR|=LCD_EN;       //设置EN方向为输出
  LCD_RS_DDR|=LCD_RS;       //设置RS方向为输出
  LCD_write_command(0x28); 
  LCD_en_write();
  delay_nus(40);
  LCD_write_command(0x28);  //4位显示
  LCD_write_command(0x0c);  //显示开
  LCD_write_command(0x01);  //清屏
  delay_nms(2);
}

/*----------------------------------------------------------------------------*/
void LCD_en_write(void)  //液晶使能
{
  LCD_EN_PORT|=LCD_EN;
  delay_nus(1);
  LCD_EN_PORT&=~LCD_EN;
}

/*----------------------------------------------------------------------------*/
void LCD_write_command(unsigned char command) //写指令
{
  delay_nus(16);
  LCD_RS_PORT&=~LCD_RS;        //RS=0
  LCD_DATA_PORT&=0X0f;         //清高四位
  LCD_DATA_PORT|=command&0xf0; //写高四位
  LCD_en_write();
  command=command<<4;          //低四位移到高四位
  LCD_DATA_PORT&=0x0f;         //清高四位
  LCD_DATA_PORT|=command&0xf0; //写低四位
  LCD_en_write();
  
}
/*----------------------------------------------------------------------------*/
void LCD_write_data(unsigned char data) //写数据
{
  delay_nus(16);
  LCD_RS_PORT|=LCD_RS;       //RS=1
  LCD_DATA_PORT&=0X0f;       //清高四位
  LCD_DATA_PORT|=data&0xf0;  //写高四位
  LCD_en_write();
  data=data<<4;               //低四位移到高四位
  LCD_DATA_PORT&=0X0f;        //清高四位
  LCD_DATA_PORT|=data&0xf0;   //写低四位
  LCD_en_write();
}
/*----------------------------------------------------------------------------*/
void LCD_set_xy( unsigned char x, unsigned char y )  //写地址函数
{
    unsigned char address;
    if (y == 0) address = 0x80 + x;
    else   address = 0xc0 + x;
    LCD_write_command( address);
}
/*----------------------------------------------------------------------------*/

//列x=0~15,行y=0,1
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s)

{
    LCD_set_xy( X, Y ); //写地址    
    while (*s)  // 写显示字符
    {
      LCD_write_data( *s );
      s ++;
    }
      
}

/*----------------------------------------------------------------------------*/

//列x=0~15,行y=0,1
void LCD_write_char(unsigned char X,unsigned char Y,unsigned char data)

{
  LCD_set_xy( X, Y ); //写地址
  LCD_write_data( data);
  
}

//main.c

#include
#include
#include'LCD1602.h'

void main(void)
{
   LCD_init();
                    //      X  Y      *s
   LCD_write_string(2, 0, 'hello!!');
   while(1)
   {
                    //      X  Y      *s
   LCD_write_string(2, 1,'1234567890');
                    //     X  Y   data
   LCD_write_char(12, 0, '8');
   LCD_write_char(13, 0, '8');    
   }
 
}

进入单片机查看更多内容>>
相关视频
  • RISC-V嵌入式系统开发

  • SOC系统级芯片设计实验

  • 云龙51单片机实训视频教程(王云,字幕版)

  • 2022 Digi-Key KOL 系列: 你见过1GHz主频的单片机吗?Teensy 4.1开发板介绍

  • TI 新一代 C2000™ 微控制器:全方位助力伺服及马达驱动应用

  • MSP430电容触摸技术 - 防水Demo演示

精选电路图
  • 家用电源无载自动断电装置的设计与制作

  • 短波AM发射器电路设计图

  • 开关电源的基本组成及工作原理

  • 用NE555制作定时器

  • 带有短路保护系统的5V直流稳压电源电路图

  • 基于TDA2003的简单低功耗汽车立体声放大器电路

    相关电子头条文章