NERV最近研究了点亮LCD1602屏幕、调整对比度和显示文字的方法,小结如下。

接线:

  • LCD1602引脚定义:
    • 1-Vss, 2-Vcc, 3-Vee, 4-RS, 5-RW, 6-E, 7~14-D0-D7, 15-A, 16-K
    • Vss: 电源地;Vcc:电源正(5V);Vee:对比度调整电压;A:背光正;K:背光负
    • D0-D7:数据
    • RS:0-输入指令 1-输入数据
    • RW:0-输入 1-读取
    • E:1-读取信息,1-0下降沿执行指令
  • Vee参考接法:通过一个3.1kΩ的电阻接负极

一些经验:

  1. 屏幕硬件电路正常的判断:通电后第一行显示16个方块。
  2. 屏幕初始化后,屏幕显示2×16个方块(全是方块)。这时调整对比度应使方块看不出。
  3. 注意接线的可靠性,注意各引脚需要上拉电阻。

参考程序:

#include <reg51.h>

#define CLEARSCREEN LCD_write_command(0x01)
#define uchar unsigned char
/**************定义接口************************/
#define LCDIO P2
sbit LCD1602_RS=P0^0;
sbit LCD1602_RW=P0^1;
sbit LCD1602_EN=P0^2;
/**************定义函数************************/
void LCD_write_command(unsigned char command);//写入指令函数
void LCD_write_dat(unsigned char dat);//写入数据函数
void LCD_set_xy( unsigned char x, unsigned char y );//设置显示位置函数
void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat);//显示一个字符函数
void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s);//显示字符串函数
void LCD_init(void);//初始化函数
void delay_nms(unsigned int n);//延时函数
/********************************************/
/************初始化函数****************/
void LCD_init(void)
{
CLEARSCREEN;//clear screen
LCD_write_command(0x38);//set 8 bit data transmission mode
LCD_write_command(0x0c);//open display (enable lcd display)
LCD_write_command(0x80);//set lcd first display address
CLEARSCREEN;//clear screen
}
/****************************************************/
/**************写指令函数********************************/
void LCD_write_command(unsigned char command)
{
LCDIO=command;
LCD1602_RS=0;
LCD1602_RW=0;
LCD1602_EN=0;
LCD1602_EN=1;
delay_nms(10);
}
/***************************************************/
/****************写数据函数************************/
void LCD_write_dat(unsigned char dat)
{
LCDIO=dat;
LCD1602_RS=1;
LCD1602_RW=0;
LCD1602_EN=0;
delay_nms(1);
LCD1602_EN=1;
}
/****************************************************/
/***************设置显示位置**************************/
void LCD_set_xy( unsigned char x, unsigned char y )
{
unsigned char address;
if (y == 1)
address = 0x80 + x;
else
address =0xc0+ x;
LCD_write_command(address);
}
/***************************************************/
/****************显示一个字符**********************/
void LCD_dsp_char( unsigned x,unsigned char y,unsigned char dat)
{
LCD_set_xy( x, y );
LCD_write_dat(dat);
}
/**********************************************/
/***************显示字符串函数***************/
void LCD_dsp_string(unsigned char X,unsigned char Y,unsigned char *s)
{
LCD_set_xy( X, Y );
while (*s)
{
LCD_write_dat(*s);
s ++;
}
}
/***********************************************/
/********** 延时**********************/
void delay_nms(unsigned int n)
{
unsigned int i=0,j=0;
for (i=n;i&gt;0;i--)
for (j=0;j&lt;10;j++);
}
/**************************************/
/***********主函数**************/
char code dx516[3] _at_ 0x003b;
void main(void)
{
LCD_init();

delay_nms(100);
LCD_dsp_string(0,1,"Your password:");
while (1){
LCD_dsp_string(0,2,"****_");
delay_nms(5000);
LCD_dsp_string(0,2,"**** ");
delay_nms(5000);
}
}
/********************************************************************/