lcd1602中文资料-----LCD1602的3引脚VO怎么接
VO为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度。
LCD1602的VO引脚必须不能悬空,要连接一个滑动变阻器来调节的,当然LCD1602有多种型号,但是大多数的VO脚只有两种情况:一个是VO脚接18欧的下拉电阻接地,一个是接1k欧的电阻接地,当然,也可以接个滑动变阻器更好。
一般用上图,具体看看你LCD1602的技术手册说明VO引脚的具体情况
lcd1602与单片机连接图----实例解读
下面我们分享以一个实例。LCD1602的型号是16条引脚的HJ1602A;单片机最小系统(扩充了外部RAM 62256),采用STC89C52RC,晶振22.1184MHZ。以5×8点阵,16×2行,8位数据端口。首先在第一行显示“I love MCU!”,第二行显示“LCD1602 Test!”。延时一段时间,清屏。然后在第一行显示自定义字符:摄氏温标标志。第二行显示圆周率(pai)标志。再延时一段时间,清屏。最后在第一行显示“Welcome to my blog!”,显示方式是从屏幕右面移入,左面移出。周而复始。
//File1
#ifndef __ZHANGTYPE_H__
#define __ZHANGTYPE_H__
#define uint8 unsigned char
#define uint16 unsigned short int
#define uint32 unsigned long int
#define int8 signed char
#define int16 signed short int
#define int32 signed long int
#define uint64 unsigned long long int
#define int64 signed long long int
#endif
//File2
#ifndef __FUN_H__
#define __FUN_H__
#include “ZhangType.h”
#include
void Delay(uint16 time);
#endif
//File3
#include “fun.h”
void Delay(uint16 time)
{
while(time--);
}
//File4
#ifndef __1602_H__
#define __1602_H__
#include
#include “ZhangType.h” //变量类型
#include “fun.h” //常用函数
#define SETMODE 0x38 //16*2显示,5*7点阵,8位数据接口
#define DISOPEN 0x0C //显示开,不显示光标,光标不闪烁
#define DISMODE 0x06 //读写字符后地址加1,屏显不移动
#define SETADDR 0x80 //设置数据地址指针初始值
#define CLEAR 0x01 //清屏,数据指针清零
#define RET 0x02 //回车,数据指针清零
#define PORT P2 //I/O口
sbit RS = P1^0;
sbit RW = P1^1;
sbit E = P1^2;
void Init1602(void); //初始化1602
void Write1602_Com(uint8 com); //写命令
void Write1602_Dat(uint8 dat); //写数据
void CheckBusy(void); //检查忙
void Write1602_One_Dat(uint8 X,uint8 Y,uint8 dat); //写一个数据
void Write1602_Str(uint8 addr,uint8 length,uint8 *pbuf); //写一个数据串
#endif//
//File5
#include “1602.h”
void Write1602_Com(uint8 com)
{
E=0;
RS=0; //命令
Delay(50); //延时
RW=0; //写
Delay(50);
PORT=com; //端口赋值
Delay(50);
E=1; //高脉冲
Delay(50);
E=0;
}
void Write1602_Dat(uint8 dat)
{
E=0;
RS=1; //数据
Delay(50); //延时
RW=0; //写
Delay(50);
PORT=dat; //端口赋值
Delay(50);
E=1; //高脉冲
Delay(50);
E=0;
}
void CheckBusy(void)
{
uint8 temp;
RS=0; //命令
RW=1; //读
E=0;
while(1)
{
PORT=0xFF; //端口为输入
E=1; //高脉冲
temp=PORT;
E=0;
if ((temp&0x80)==0) //检查BF位是否为0
break;
}
}
void Init1602(void)
{
Write1602_Com(SETMODE); //模式设置
Delay(500);
Write1602_Com(DISOPEN); //显示设置
Delay(500);
Write1602_Com(DISMODE); //显示模式
Delay(500);
Write1602_Com(CLEAR); //清屏
Delay(500);
}
void Write1602_One_Dat(uint8 x,uint8 y,uint8 dat)
{
x&=0x0f;
y&=0x01;
if(y)
x|=0x40;
x|=0x80;
Write1602_Com(x);
Write1602_Dat(dat);
}
void Write1602_Str(uint8 addr,uint8 length,uint8 *pbuf)
{
uint8 i;
Write1602_Com(addr);
for(i=0;i
{
Write1602_Dat(pbuf[i]);
}
}
//File6
*******************************************************
*名称:主文件(_main.c)
*功能:测试
*日期:2014/09/09
*******************************************************/
#include “1602.h”
#include “fun.h”
uint8 code hot[8]={ //摄氏温度字模
0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00
};
uint8 code pi[8]={
0x00,0x1f,0x0a,0x0a,0x0a,0x13,0x00,0x00 //pai
};
uint8 code strMCU[]=“I love MCU!”;
uint8 code strTest[]=“LCD1602 Test!”;
uint8 code blog[]=“Welcome to my blog!”;
uint8 i;
void main()
{
Init1602(); //初始化1602
//自定义CGRAM
Write1602_Str(0x40,8,hot); //摄氏温标
Write1602_Str(0x48,8,pi); //pai
Write1602_Str(0x80,strlen(strMCU),strMCU); //“I love MCU!”
Write1602_Str(0x80+0x40,strlen(strTest),strTest); //“LCD1602 Test!”
for(i=0;i《50;i++) //延时一段时间
Delay(10000);
Write1602_Com(CLEAR); //指令执行时间较长
Delay(500); //多加一些延时
for(i=0;i《16;i++)
Write1602_Dat(0);
Write1602_Com(0xc0); //设置DDRAM地址
for(i=0;i《16;i++)
Write1602_Dat(1);
for(i=0;i《50;i++) //延时一段时间
Delay(10000);
Write1602_Com(CLEAR); //指令执行时间较长
Delay(500); //多加一些延时
Write1602_Str(0x80+0x10,strlen(blog),blog); //写在显示之外
while(1)
{
Write1602_Com(0x18); //左移
for(i=0;i《20;i++) //延时
Delay(10000);
}
}
//####### THE END ######
lcd1602与单片机连接图----LCD1602与8051单片机接线图
下图是LCD1602与8051单片机的接口图,图中LCD1602的数据线与8051的P2口相连,RS与8051的P1.7相连,R/W与8051的P1.6相连,E端与8051的P1.5相连。编程在LCD显示器的第1行、第1列开始显示“HOW”,第2行、第5列开始显示“ARE YOU!”。
LCD1602与8051单片机接线图
汇编语言程序:
RS BIT P1.7
RW BIT P1.6 E BIT P1.5 ORG 00H AJMP START
ORG 50H ;主程序
START: MOV SP,#50H ACALL INIT
MOV A,#10000000B ;写入显示缓冲区起始地址为第1行第1列 ACALL WC51R
MOV A,#‘H’ ;第1行第1列显示字母‘H’ ACALL WC51DDR MOV A,#‘O’ ;第1行第2列显示字母“O” ACALL WC51DDR MOV A,#‘W’ ;第1行第3列显示字母‘W’
ACALL WC51DDR
MOV A,#11000100B ;写入显示缓冲区起始地址为第2行第5列 ACALL WC51R
MOV A,#‘A’ ;第2行第5列显示字母‘A’ ACALL WC51DDR MOV A,#‘R’ ;第2行第6列显示字母‘R’ ACALL WC51DDR MOV A,#‘E’ ;第2行第7列显示字母‘E’ ACALL WC51DDR MOV A,#‘ ’ ;第2行第8列显示字母‘ ’ ACALL WC51DDR MOV A,#‘Y’
;第2行第9列显示字母‘Y’
ACALL WC51DDR
MOV A,#‘O’ ;第2行第10列显示字母‘O’ ACALL WC51DDR MOV A,#‘U’ ;第2行第11列显示字母‘U’ ACALL WC51DDR MOV A,#‘!’
;第2行第12列显示字母‘!’
ACALL WC51DDR LOOP: AJMP LOOP ;初始化子程序
INIT: MOV A,#00000001H ;清屏
ACALL WC51R MOV A,#00111000B ;使用8位数据,显示两行,使用5×7的字型 LCALL WC51R MOV A,#00001100B ;显示器开,光标关,字符不闪烁 LCALL WC51R MOV A,#00000110B
;字符不动,光标自动右移一格
LCALL WC51R RET ;检查忙子程序 F_BUSY:PUSH ACC ;保护现场
MOV P2,#0FFH CLR RS SETB RW WAIT: CLR E SETB E JB P2.7,WAIT
;忙,等待
POP ACC ;不忙,恢复现场
RET ;写入命令子程序 WC51R: ACALL F_BUSY CLR E CLR RS CLR RW SETB E MOV P2,ACC CLR E RET ;写入数据子程序 WC51DDR:ACALL F_BUSY CLR E SETB RS CLR RW SETB E MOV P2,ACC CLR E RET END
C语言编程:
#include 《reg51.h》
#define uchar unsigned char sbit RS=P1^7; sbit RW=P1^6; sbit E=P1^5;
void init(void);
void wc51r(uchar i); void wc51ddr(uchar i); void fbusy(void);
//主函数
void main() {
SP=0x50; init();
wc51r(0x80); //写入显示缓冲区起始地址为第1行第1列 wc51ddr(’H’); //第1行第1列显示字母’H’ wc51ddr(’O’); //第1行第2列显示字母’O’ wc51ddr (’W’); //第1行第3列显示字母’W’
wc51r(0xc4); //写入显示缓冲区起始地址为第2行第5列 wc51ddr(’A’); //第2行第5列显示字母’A’ wc51ddr(’R’); //第2行第6列显示字母’R’ wc51ddr(’E’); //第2行第7列显示字母’E’ wc51ddr(’ ’); //第2行第8列显示字母’ ’ wc51ddr(’Y’); //第2行第9列显示字母’Y’ wc51ddr(’O’); //第2行第10列显示字母’O’ wc51ddr(’U’); //第2行第11列显示字母’U’ wc51ddr(’!’); //第2行第11列显示字母’!’ while(1); }
//初始化函数 void init() {
wc51r(0x01); //清屏
wc51r(0x38); //使用8位数据,显示两行,使用5×7的字型 wc51r(0x0c); //显示器开,光标关,字符不闪烁 wc51r(0x06); //字符不动,光标自动右移一格 }
//检查忙函数 void fbusy() {
P2=0Xff;RS=0;RW=1; E=0; E=1;
while (P2&0x80){E=0;E=1;} //忙,等待 }
//写命令函数
void wc51r(uchar j) {
fbusy();
E=0;RS=0;RW=0; E=1; P2=j; E=0; }
//写数据函数
void wc51ddr(uchar j) {
fbusy();
E=0;RS=1;RW=0; E=1; P2=j; E=0; }
小编推荐阅读:
评论
查看更多