原创 AVR学习日志(四十五)--学习使用1602字符液晶

2010-7-12 15:07 3718 4 4 分类: MCU/ 嵌入式


        液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。


1602字符型液晶模块是一种用5x7点阵图形来显示字符的液晶显示器


1602采用标准的16脚接口,其中:



第1脚:VSS为地电源
第2脚:VDD接5V正电源
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度
第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。
第5脚:RW为读写信号线,高电平时进行读操作,低电平时进行写操作。当RS和RW共同为低电平时可以写入指令或者显示地址,当RS为低电平RW为高电平时可以读忙信号,当RS为高电平RW为低电平时可以写入数据。
第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模块执行命令。


第7~14脚:D0~D7为8位双向数据线。


第15~16脚:空脚


1602液晶模块内部的控制器共有11条控制指令:



指令1:清显示,指令码01H,光标复位到地址00H位置

指令2:光标复位,光标返回到地址00H

指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移 S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效


指令4:显示开关控制。 D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁


指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标


指令6:功能设置命令 DL:高电平时为4位总线,低电平时为8位总线 N:低电平时为单行显示,高电平时双行显示 F: 低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符 (有些模块是 DL:高电平时为8位总线,低电平时为4位总线)


指令7:字符发生器RAM地址设置


指令8:DDRAM地址设置



指令9:读忙信号和光标地址 BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。


指令10:写数据


指令11:读数据



初始化时序:


 


好了,还是把俺的程序弄上来吧;


/******************************************************************
//文件名称:LCD1602
//功    能:学习使用LCD1602
//作    者:懒猫爱飞
//日    期:2010.07.04
*******************************************************************/
#include<iom8515v.h>
#include<macros.h>


#define uchar unsigned char
#define uint  unsigned int


//定义1602引脚状态
#define RS_H() PORTC|=BIT(0)
#define RS_L() PORTC&=~BIT(0)


#define RW_H() PORTC|=BIT(1)
#define RW_L() PORTC&=~BIT(1)


#define EN_H() PORTC|=BIT(2)
#define EN_L() PORTC&=~BIT(2)


const uchar DSY_CODE[4][16]={
                             " welecom to you",
                             "-my blog space-",
        "my name is:",
        "LaoMaoAiFei^_^"
        };


/****************************************************************
//函数名称: delay(void)
//功    能:延时
//入口参数:无
//出口参数:无
*****************************************************************/
void delay(void)
{
 uint i;
 for(i=1;i<100;i++)
    ;
}


/****************************************************************
//函数名称:delay_1ms(void)
//功    能:延时1ms
//入口参数:无
//出口参数:无
*****************************************************************/
void delay_1ms(void)//1ms
{
 uint i;
 for(i=1;i<(uint)(8*143-2);i++)
    ;
}
/****************************************************************
//函数名称:delay_ms(uint time)
//功    能:延时time ms
//入口参数:time
//出口参数:无
*****************************************************************/
void delay_ms(uint time)//time*1ms
{
   uint i="0";
   while(i<time)
   {
   delay_1ms();
    i++;
   }
}
/****************************************************************
//函数名称:uchar Busy_Check(void)
//功    能:检测忙状态
//入口参数:无
//出口参数:无
*****************************************************************/
uchar Busy_Check(void)
{
  uchar LCD_Status;
 RS_L();
 RW_H();
 EN_H();
 delay();
 DDRA = 0x00;
    LCD_Status = PINA;
 EN_L();
 DDRA = 0xff;
 return LCD_Status;
}
/****************************************************************
//函数名称:void write_cmd(uchar cmd)
//功    能:写命令
//入口参数:cmd
//出口参数:无
*****************************************************************/
void write_cmd(uchar cmd)
{
   // while((Busy_Check()&0x80)==0x80);
    RS_L();
 RW_L();
 EN_L();
 PORTA= cmd;
 EN_H();
 delay_ms(5);
 EN_L();
}
/****************************************************************
//函数名称:void write_dat(uchar dat)
//功    能:写数据
//入口参数:dat
//出口参数:无
*****************************************************************/
void write_dat(uchar dat)
{
    //while((Busy_Check()&0x80)==0x80);
    RS_H();
 RW_L();
 EN_L();
 PORTA= dat;
 EN_H();
 delay_ms(5);
 EN_L();
}
/****************************************************************
//函数名称:void Initialize_LCD()
//功    能:初始化液晶
//入口参数:无
//出口参数:无
*****************************************************************/
void Initialize_LCD()
{
    write_cmd(0X38); // 写命令
    delay_ms(5);
 write_cmd(0X08); //关显示
    delay_ms(5);
    write_cmd(0X01); //清屏指令
    delay_ms(5);
 write_cmd(0X06);
    delay_ms(5);
    write_cmd(0X0c);//关光标,关闪烁,画面显示,显示状态设置
    delay_ms(5);
}
/****************************************************************
//函数名称:Port_init(void)
//功    能:端口初始化
//入口参数:无
//出口参数:无
*****************************************************************/
void Port_init(void)
{
 DDRA  = 0xff;   //A口设为输出  
 PORTA = 0x00;
 
 DDRB  = 0x00;         //B口为输出,
 PORTB = 0x00;
 
 DDRC  = 0xff;   //C口
 PORTC = 0x00;
 
 DDRD  = 0x00;   //D口
 PORTD = 0x00;
}
/****************************************************************
//函数名称:void main(void)
//功    能:主程序入口
//入口参数:无
//出口参数:无
*****************************************************************/
void main(void)
{
 uchar i;
 Port_init();
 Initialize_LCD();
 
 // write_cmd(0X1c);//-----------------
 
   write_cmd(0X80+0X0f);//从最右边开始显示,等下要左移
   delay_ms(5);
   //write_dat('a');  //测试显示
   for(i=0; i<15; i++)
   {
    write_dat(DSY_CODE[0]);
    delay_ms(5);
   }
 
  write_cmd(0X80+0X4f);
  delay_ms(5);
  for(i=0; i<16; i++)
   {
   write_dat(DSY_CODE[1]);
   delay_ms(5);
   }
  for(i=0;i<15;i++)
  {
   write_cmd(0X1c);//向左移动16个字符
   delay_ms(200);
  }
  delay_ms(1000);//停止1S再移走
  for(i=0;i<16;i++)
  {
   write_cmd(0X18);//向右移动16个字符
   delay_ms(200);
  }
 
  Initialize_LCD();//再初始化一下LCD1602
  write_cmd(0X80+0X00);//第一行从最左边开始显示
   delay_ms(5);
   for(i=0; i<11; i++)
   {
    write_dat(DSY_CODE[2]);
    delay_ms(100);//延时根据自己需要而定了
   }
 
  write_cmd(0X80+0X40);//第二行也是从最左边开始显示
  delay_ms(5);
  for(i=0; i<15; i++)
   {
   write_dat(DSY_CODE[3]);
   delay_ms(100);
   }
 while(1);


}


 


程序不难就是显示几个字符,而且都是在while(1);前面搞定的.


好了,今天就先弄到这吧,学点其它的东东吧,明天又要上班了,得把工作上的事干好再说吧。


 


 


 


每天进步一点点,开心多一点^_^


 


修改声明,由于懒猫没有照相机所以没有拍1602液晶的照片,只在网上搜了一几张图片,可是又显不出来,哎,懒猫也很郁闷,就把它删了,不过还好,我的电路路在附件中,所以你想看可以用PROTEUS7.5打开,里面有仿真。


 


 


 


 


 

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
EE直播间
更多
我要评论
0
4
关闭 站长推荐上一条 /3 下一条