液晶显示器以其微功耗、体积小、显示内容丰富、超薄轻巧的诸多优点,在袖珍式仪表和低功耗应用系统中得到越来越广泛的应用。
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打开,里面有仿真。
文章评论(0条评论)
登录后参与讨论