51单片机驱动1602液晶显示器的小例子

2019-07-14 02:12发布

首先附上1602的相关资料: 引脚功能
1602采用标准的16脚接口,其中:
第1脚:VSS为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会 产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。
第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。
第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。
第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。
第7~14脚:D0~D7为8位双向数据端。
第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。 指令表:   指令码 功 能 令 RS R/W D7 D6 D5 D4 D3 D2 D1 D0   清除显示 0 0 0 0 0 0 0 0 0 1 将DDRAM填满"20H",并且设定DDRAM的地址计数器(AC)到"00H" 地址归位 0 0 0 0 0 0 0 0 1 X 设定DDRAM的地址计数器(AC)到"00H",并且将游标移到开头原点位置;这个指令不改变DDRAM 的内容 显示状态开/关 0 0 0 0 0 0 1 D C B [D=1: 整体显示 ON][C=1: 游标ON] [B=1:游标位置反白允许] 进入点设定 0 0 0 0 0 0 0 1 I/D S 指定在数据的读取与写入时,设定游标的移动方向及指定显示的移位 游标或显示移位控制 0 0 0 0 0 1 S/C R/L X X 设定游标的移动与显示的移位控制位;这个指令不改变DDRAM 的内容 功能设定 0 0 0 0 1 DL X RE X X [DL=0/1:4/8位数据] [RE=0/1: 基本指令操作 / 扩充指令操作] 设定CGRAM地址 0 0 0 1 AC5 AC4 AC3 AC2 AC1 AC0 设定CGRAM 地址 设定DDRAM地址 0 0 1 0 AC5 AC4 AC3 AC2 AC1 AC0 设定DDRAM 地址(显示位址) [第一行:80H-A7H] [第二行:C0H-E7H] 读取忙标志和地址 0 1 BF AC6 AC5 AC4 AC3 AC2 AC1 AC0 读取忙标志(BF)可以确认内部动作是否完成,同时可以读出地址计数器(AC)的值 写数据到RAM 1 0 数据 将数据D7——D0写入到内部的RAM (DDRAM/CGRAM/IRAM/GRAM) 读出RAM的值 1 1 数据 从内部RAM读取数据D7——D0(DDRAM/CGRAM/IRAM/GRAM)
特性:
3.3V或5V工作电压,对比度可调
内含复位电路
提供各种控制命令,如:清屏、字符闪烁、光标闪烁、显示移位等多种功能
有80字节显示数据存储器DDRAM
内建有192个5X7点阵的字型的字符发生器CGROM
8个可由用户自定义的5X7的字符发生器CGRAM

测试电路原理图: 测试代码: #include #define uchar unsigned char #define uint unsigned int sbit lcden=P3^2; //使能端 sbit lcdrs=P3^0; //数据命令选择端 sbit rw=P3^1; uchar code table[]="xian shi 1"; //输入的字符 uchar code table1[]="xian shi 2"; //输入的字符 uchar num=0; void delay(uint z) { uint x,y; for(x=z;x>0;x--) for(y=110;y>0;y--); } void write_com(uchar com)//根据写时序图写出指令程序 { lcdrs=0; rw=0; P1=com; delay(5); lcden=1; delay(5); lcden=0; } void write_data(uchar date)//根据写时序图写出数据程序 { lcdrs=1; rw=0; P1=date; delay(5); lcden=1; delay(5); lcden=0; } void init() { lcden=0; //使能端为低电平 write_com(0x38); /*显示模式设置 00111000 设置16*2显示 5*7点阵 8位数据接口*/ write_com(0x0f); /*显示开关及光标设置 00001DCB D=1,开显示 D=0, 关显示 C=1,显示光标 C=0,不显示光标 B=1,光标闪烁 B=0,光标不闪烁*/ write_com(0x06);//地址指针自动+1且光标+1,写字符屏幕不会移动 write_com(0X01); write_com(0X80); } void main() { init(); for(num=0;num<10;num++) //输入的字符数量,修改 { write_data(table[num]); delay(50); } write_com(0X80+0x40); for(num=0;num<10;num++) //输入的字符数量,修改 { write_data(table1[num]); delay(50); } while(1); }
测试效果: