1602显示屏驱动详解

合集下载

lcd1602四位数据线接法的驱动

lcd1602四位数据线接法的驱动

lcd1602四位数据线接法的驱动LCD1602四位数据线接法的驱动硬件及驱动 2009-04-14 13:56:22 阅读480 评论0 字号:大中小订阅IO端口不够用是就可以接成6线接法:RS、E、DB4、DB5、DB6、DB7 可以任意用6根独立的IO线;这样就可以节省了5根IO线;程序如下://////////////////////////////////////根据自己的接线修改sbit LCD_DB0=P0^4;sbit LCD_DB1=P0^5;sbit LCD_DB2=P0^6;sbit LCD_DB3=P0^7;sbit LCD_RS=P2^0;sbit LCD_RW=P2^1; //只读数据而不写时可以直接接地sbit LCD_E=P2^2;////////////////////////////////////******定义函数****************/#define uchar unsigned char#define uint unsigned intvoid LCD_write_command(uchar command); //写指令函数void LCD_init_first(void);void LCD_init(void); //初始化函数void LCD_write_data(uchar dat); //写数据函数void LCD_disp_char(uchar x,uchar y,uchar dat);//在某个屏幕位置上显示一个字符,X(0-15),y(1-2)void LCD_disp_str(uchar x,uchar y,uchar *str); //LCD1602显示字符串函数void LCD_pos(unsigned char x,unsigned char y );void delay_ms(unsigned int n) ;void delay_n10us(uint n);/////////////////////////////////////////////*-------------------------------------;首次初始化时要先运行此函数;/*************************************/void LCD_init_first(void){delay_ms(50);LCD_write_command(0x30);delay_ms(6);LCD_write_command(0x30);delay_ms(1);LCD_write_command(0x30);delay_ms(1);LCD_write_command(0x02);}/*--------------------------------------;模块名称:LCD_init();;功能:初始化LCD1602;占用资源:--;参数说明:--;创建日期:2008.08.15;版本:FV1.0(函数版本Function Version);修改日期:--;修改说明:--;-------------------------------------*/void LCD_init(void){//LCD_write_command(0x38);//设置8位格式,2行,5x7LCD_write_command(0x28);//设置4位格式,2行,5x7LCD_write_command(0x0c);//整体显示,关光标,不闪烁LCD_write_command(0x06);//设定输入方式,增量不移位LCD_write_command(0x01);//清除屏幕显示delay_n10us(100); //延时清屏,延时函数,延时约n个10us}/*--------------------------------------;模块名称:LCD_write_command();;功能:LCD1602写指令函数;占用资源: P2.0--RS(LCD_RS),P2.1--RW(LCD_RW),P2.2--E(LCD_E). ;参数说明:dat为写命令参数;创建日期:2008.08.15;版本:FV1.0(函数版本Function Version) ;修改日期:--;修改说明:--;-------------------------------------*/ void LCD_write_command(uchar dat){LCD_RS=0;LCD_RW=0; //只读数据而不写时可以直接接地LCD_E=0;dat<<=1;LCD_DB3=CY;dat<<=1;LCD_DB2=CY;dat<<=1;LCD_DB1=CY;dat<<=1;LCD_DB0=CY;LCD_E=1;delay_n10us(1);LCD_E=0;dat<<=1;LCD_DB3=CY;dat<<=1;LCD_DB2=CY;dat<<=1;LCD_DB1=CY;dat<<=1;LCD_DB0=CY;LCD_E=1;delay_n10us(1);LCD_E=0;}/*--------------------------------------;模块名称:LCD_write_data(); ;功能:LCD1602写数据函数;占用资源: P2.0--RS(LCD_RS),P2.1--RW(LCD_RW),P2.2--E(LCD_E). ;参数说明:dat为写数据参数;创建日期:2008.08.15;版本:FV1.0(函数版本Function Version);修改日期:--;修改说明:--;-------------------------------------*/void LCD_write_data(uchar dat){LCD_RS=1;LCD_RW=0; //只读数据而不写时可以直接接地LCD_E=0;dat<<=1;LCD_DB3=CY;dat<<=1;LCD_DB2=CY;dat<<=1;LCD_DB1=CY;dat<<=1;LCD_DB0=CY;LCD_E=1;delay_n10us(1);LCD_E=0;dat<<=1;LCD_DB3=CY;dat<<=1;LCD_DB2=CY;dat<<=1;LCD_DB1=CY;dat<<=1;LCD_DB0=CY;LCD_E=1;delay_n10us(1);LCD_E=0;}/*-------------------------------------- ;模块名称:LCD_disp_char();;功能:LCD1602显示一个字符函数,在某个屏幕位置上显示一个字符,X(0-15),y(1-2)。

LCD1602驱动编程(一)——LCD1602简介

LCD1602驱动编程(一)——LCD1602简介

LCD1602驱动编程(一)——LCD1602简介(一)基本概念1.液晶显示基本原理:(1)线段显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。

例如屏的第一行的亮暗由RAM区的000H——00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=FFH,……(00EH)=FFH,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。

这就是LCD显示的基本原理。

(2)字符显示用LCD显示一个字符时比较复杂,因为一个字符由6×8或8×8点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为“1”,其它的为“0”,为“1”的点亮,为“0”的不亮。

这样一来就组成某个字符。

但对内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显示的行列号及每行的列数找出显示RAM对应的地址,设立光标,在此送上该字符对应的代码即可。

(3)汉字显示汉字的显示一般采用图形的方式,事先从微机中提取要显示的汉字的点阵码(一般用字模提取软件),每个汉字占32B,分左右两半,各占16B,左边为1、3、5……右边为2、4、6……根据在LCD上开始显示的行列号及每行的列数可找出显示RAM对应的地址,设立光标,送上要显示的汉字的第一字节,光标位置加1,送第二个字节,换行按列对齐,送第三个字节……直到32B显示完就可以LCD上得到一个完整汉字。

51单片机驱动LCM1602

51单片机驱动LCM1602

功能;驱动LCM1602,LCM1602为深圳誉信公司的16*2液晶字符型显示模块,程序使用读写方式控制LCM1602,地址分别为:写指令口:80H; 读忙检查口:81H;写数据口:82H; 读数据口:83H;;子程序1:写控制指令子程序;子程序2:写CGRAM数据子程序;子程序3:写DDRAM子程序;子程序4:写数据子程序;子程序5:读忙子程序RG_DLY EQU 2HORG 0000HAJMP MAIORG 0030HMAI: MOV SP,#60HLP_MAI: NOPLCALL SB_WRIN;调用写控制指令子程序LCALL SB_WRCG;调用写CGRAMLP2_MAI:NOPLCALL SB_WRDR;调用写DDRAMRT_MAI: AJMP LP2_MAI;---------------------------------------------------------;---------子程序---开始------------------------------------;-1------写控制指令子程序----------SB_WRIN:PUSH ACCMOV R0,#80H ;写指令口MOV A,#01H ;(INSTR.1)LCALL SB_WAT ;清屏MOVX @R0,AMOV A,#02H ;(INSTR.2)LCALL SB_WAT ;A光标归位MOVX @R0,AMOV A,#06H ;(INSTR.3)LCALL SB_WAT ;AC自动加一,画面不动;MOVX @R0,AMOV A,#0CH ;(INSTR.4)0FH:显示开,关标开,闪烁开LCALL SB_WAT ;0CH 显示开,关标、闪烁关 MOVX @R0,A;MOV A,#18H ;(INSTR.5);LCALL SB_WAT ;光标或画面平移指令;MOVX @R0,AMOV A,#38H ;(INSTR.6)LCALL SB_WAT ;8位数据,2行显示,5-7点阵MOVX @R0,APOP ACCRET;-2----写CGRAM数据子程序------SB_WRCG:PUSH ACCMOV DPTR,#CGRMOV R1,#40H;=CGRAM的首地址MOV R2,#4;=4个字符LP_WG0: MOV R3,#8;=每个字符有8位数据即8行LP_WG1: MOV R0,#80HMOV A,R1LCALL SB_WATMOVX @R0,ACLR AMOVC A,@A+DPTRLCALL SB_WRTDINC R1INC DPTRDJNZ R3,LP_WG1DJNZ R2,LP_WG0NOPPOP ACCRET;-3-----写DDRAM子程序--------SB_WRDR:PUSH ACCMOV R0,#80HMOV A,#80H ; 写第一行DDRAM数据LCALL SB_WATMOVX @R0,AMOV A,#49H ; ILCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#4CH ; LLCALL SB_WRTDMOV A,#4FH ; OLCALL SB_WRTDMOV A,#56H ; VLCALL SB_WRTDMOV A,#45H ; ELCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#4DH ; MLCALL SB_WRTDMOV A,#59H ; YLCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#42H ; BLCALL SB_WRTDMOV A,#41H ; ALCALL SB_WRTDMOV A,#42H ; BLCALL SB_WRTDMOV A,#59H ; YLCALL SB_WRTDMOV A,#20H ; EMPTYLCALL SB_WRTDMOV A,#20H ; EMPTYLCALL SB_WRTDMOV R0,#80HMOV A,#0C0H ;写第二行DDRAM LCALL SB_WATMOVX @R0,AMOV A,#49H ; ILCALL SB_WRTDMOV A,#20H ; SPACE LCALL SB_WRTDMOV A,#41H ; ALCALL SB_WRTDMOV A,#4CH ; LLCALL SB_WRTDMOV A,#53H ; SLCALL SB_WRTDMOV A,#4FH ; OLCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#4DH ; MLCALL SB_WRTDMOV A,#49H ; ILCALL SB_WRTDMOV A,#53H ; SLCALL SB_WRTDMOV A,#53H ; SLCALL SB_WRTDMOV A,#20H ; SPACE LCALL SB_WRTDMOV A,#59H ; YLCALL SB_WRTDMOV A,#4FH ; OLCALL SB_WRTDMOV A,#55H ; ULCALL SB_WRTDMOV R2,#50 ;延时229ms ACALL SB_DLYPOP ACCRET;-4---写数据子程序---------SB_WRTD:MOV R0,#82H ; LCALL SB_WATMOVX @R0,A ;RET;-5---读忙子程序-----------SB_WAT: PUSH ACCPUSH 00HMOV R0,#81HLP_WAT: MOVX A,@R0RLC AJC LP_WATPOP 00HPOP ACCRET;---------子程序----结束----------------------------------- ;---------------------------------------------------------;------延时子程序-----------SB_DLY: PUSH RG_DLY ;LP1_DLY:PUSH RG_DLYLP2_DLY:PUSH RG_DLYDJNZ R2,$POP RG_DLYDJNZ R2,LP2_DLYPOP RG_DLYDJNZ R2,LP1_DLYPOP RG_DLYDJNZ R2,SB_DLYRET;----------CGRAM区---------- CGR:...................;(用户自编码字符区)END。

1602液晶的驱动方法

1602液晶的驱动方法

之前,必须查看 BF 是否为 0。 6. AC 为地址计数器(AddressCounter,简称 AC),负责计数写入/读出 CGRAM 或 DDRAM 的数据地址,AC 依照 MCLI 对 LCD 的设置值而自动修改它本身的内 容。 3、1602 的接口定义 1602 采用标准的 16 脚接口,其中: 第 1 脚:VSS 为电源地。 第 2 脚:VDD 接 5V 正电源。 第 3 脚:V0 为液晶显示器对比度调整端,接正电源时对比度最弱,接地示器, 是用于显示数字、图形符号及少量自定义符号的显示器。 l602 可分为 2 行共显示 32 个字符,每行显示 16 个字符。 第 4 脚:RS 为寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器。 第 5 脚:R/W 为读写信号线,高电平时进行读操作,低电平时进行写操作。当 RS 和 R/W 共同为低电平时可以写入指令或者显示地址, 当 RS 为低电平 R/W 为高电平时可以读忙信号,当 RS 为高电平 R/W 为低电平时可以写入数 据。 第 6 脚:E 端为使能端,当 E 端由高电平跳变成低电平时,液晶模块执行命令。 第 7~14 脚:D0~D7 为 8 位双向数据线。 第 15~16 脚:背光。 4、1602 的结构简述 1)模块特点可与 8 位或 4 位微处理器连接;内藏式字符发生器 ROM,可提供 160 种工 业标准字符,包括全部大小写字母、阿拉伯数字及日文片假名,以及 32 个特殊字符 或符号的显示;内藏 RAM 可根据用户的需要,由用户自定义字符或符号;+5V 单 电源供电;低功耗(10mW)。 2)1602 内部结构由 DDRAM、CGROM、IR、DR、BF、AC 等大规模集成电路组 成。 1. DDRAM 为数据显示用的 RAM(DataDisplayRAM,简称 DDRAM).用以存放 要 LCD 显示的数据,只要将标准的 ASCII 码放入 DDRAM,内部控制_线路就 会自动将数据传送到显示器上,并显示出该 ASCII 码对应的字符。

Task 2 驱动1602液晶显示

Task 2 驱动1602液晶显示

驱动1602液晶显示任务要求:1、弄清楚液晶1602驱动的原理,理解并写在实训报告中2、在DE2板上的液晶上显示你的名字和学校的名字。

建议步骤:1、建立所需其他辅助模块,包括分频等;2、建立LCD控制模块(用纯硬件实现,也可以先实现NIOS II,再用C实现);通过1602时序资料我们知道LCD_EN最小允许脉冲宽度周期为900纳秒(无最大值)、数据传输允许的最小时钟周期为1000纳秒,由于我们DE2实验板为50MHZ因此我们这里分频时钟周期大于1微秒就可,这里分频为4HZ。

本实验在LCD1602中间第一行,第二行分别显示某个字符,并且显示完后,以一定的速率向左循环移动。

module lcd1602(clk,rst,lcd_e,lcd_rw,lcd_rs,data,lcd_on,lcd_blon);input clk,rst;output lcd_e,lcd_rw,lcd_rs,lcd_blon,lcd_on;output [7:0] data;reg lcd_rw,lcd_rs;reg [7:0] data;reg [9:0] state;reg [5:0] address;reg [22:0] cnt;reg clk500hz;parameter IDLE =10'b0000000000;parameter CLEAR =10'b0000000001; //清屏parameter RETURNCURSOR =10'b0000000010; //归home位parameter SETMODE =10'b0000000111;//输入方式设置,读写数据后ram地址增/减1;画面动/不动parameter SWITCHMODE =10'b0000001111;//显示状态设置,显示开/关;光标开/关;闪烁开/关parameter SHIFT =10'b0000011100;//光标画面滚动画面/光标平移一位;左/右平移一位parameter SETFUNCTION =10'b0000111100;//工作方式设置1:8/1:4位数据接口;两行/一行显示;5x10/5x7点阵parameter SETCGRAM =10'b0001000000; //设置CGRAMparameter SETDDRAM1 =10'b0010000001; //设置DDRAMparameter SETDDRAM2 =10'b0010000010; //设置DDRAMparameter READFLAG =10'b010*******; //读状态parameter WRITERAM1 =10'b1000000001; //写RAMparameter WRITERAM2 =10'b1000000010; //写RAMparameter READRAM =10'b1100000000; //读RAMassign lcd_on=1'b1;assign lcd_blon=1'b1;always@(posedge clk ) //由50MHZ时钟分频得到4HZ时钟begin if(cnt==19'h7a120) //19'h7a120=19'd500000begin cnt<=0;clk500hz<=~clk500hz; //500000*20ns=1000000us 取反即为2ms=1/500 s endelse cnt<=cnt 1;endassign lcd_e=clk500hz;function [7:0] ddram; //input [5:0] n;begincase(n)//下面修改成你所需内容6'b000_000:ddram=8'b0100_0011;//C6'b000_001:ddram=8'b0100_1000;//H6'b000_010:ddram=8'b0100_0101;//E6'b000_011:ddram=8'b0100_1110;//N6'b000_100:ddram=8'b0010_0000;//6'b000_101:ddram=8'b0100_1010;//J6'b000_110:ddram=8'b0101_0101;//U6'b000_111:ddram=8'b0100_1110;//N6'b001_000:ddram=8'b0100_1010;//J6'b001_001:ddram=8'b0100_1001;//I6'b001_010:ddram=8'b0100_0001;//A6'b001_011:ddram=8'b0100_1110;//N6'b001_100:ddram=8'b0111_0111;//G6'b001_101:ddram=8'b0010_0000;//6'b001_110:ddram=8'b0101_1000;//X6'b001_111:ddram=8'b0100_1001;//I6'b010_000:ddram=8'b0010_0000;//6'b010_001:ddram=8'b0101_0010;//R6'b010_010:ddram=8'b0100_0101;//E6'b010_100:ddram=8'b0100_1110;//Nendcaseendendfunctionalways@(posedge clk500hz or negedge rst)if(!rst) beginstate<=IDLE;address<=6'b000000;data<=8'b00000000;lcd_rs<=0;lcd_rw<=0;endelse begincase(state)IDLE: begin state<=CLEAR;data<=8'bzzzz_zzzz;endCLEAR:begin lcd_rs<=0;lcd_rw<=0;data<=8'h01;state<=SETFUNCTION; //清屏endSETFUNCTION :begin lcd_rs<=0;lcd_rw<=0;data<=8'h3c;state<=SWITCHMODE;endSWITCHMODE: begin lcd_rs<=0;lcd_rw<=0; //显示状态开关设置0C data<=8'h0c; //开光标、开闪烁state<=SETMODE;endSETMODE: begin lcd_rs<=0;lcd_rw<=0;data<=8'h06;//采取增量方式,光标不移动state<=SHIFT;endSHIFT: begin lcd_rs<=0;lcd_rw<=0;data<=8'h18;state<=SETDDRAM1;endSETDDRAM1 :begin lcd_rs<=0;lcd_rw<=0;data<=8'b10000100; //显示数据存储器地址80 4 state<=WRITERAM1;endSETDDRAM2 :begin lcd_rs<=0;lcd_rw<=0;data<=8'b11000010; //显示数据存储器地址80 40 2state<=WRITERAM2;endWRITERAM1 :beginif(address<=6'b000_111 )beginlcd_rs<=1;lcd_rw<=0;data<=ddram(address);address<=address 1;state<=WRITERAM1;endelsebeginlcd_rs<=0;lcd_rw<=0;state<=SETDDRAM2;endendWRITERAM2 :beginif(address<=6'b010_100 )beginlcd_rs<=1;lcd_rw<=0;data<=ddram(address);address<=address 1;state<=WRITERAM2;endelsebeginlcd_rs<=0;lcd_rw<=0;state<=SHIFT;address<=6'b000000; endendendcaseendendmodule。

液晶LCD1602驱动代码

液晶LCD1602驱动代码

液晶LCD1602驱动代码液晶LCD1602简介LCD1602液晶显示器是广泛使用的一种字符型液晶显示模块。

它是由字符型液晶显示屏(LCD)、控制驱动主电路HD44780及其扩展驱动电路HD44100,以及少量电阻、电容元件和结构件等装配在PCB板上而组成。

不同厂家生产的LCD1602芯片可能有所不同,但使用方法都是一样的。

为了降低成本,绝大多数制造商都直接将裸片做到板子上。

各引脚的功能介绍如下。

1、引脚1:VSS 为地电源。

2、引脚2:VDD 接5V 正电源。

3、引脚3:VL 为液晶显示器对比度调整端,接正电源时对比度最弱,接地时对比度最高,对比度过高时会产生“鬼影”现象,使用时可以通过一个10kQ 的电位器调整其对比度。

4、引脚4:RS 为寄存器选择脚,高电平时选择数据寄存器、低电平时选择指令寄存器。

5、引脚5:R/W 为读/写信号线,高电平时进行读操作,低电平时进行写操作。

当RS 和R/W 共同为低电平时可以写入指令或显示地址;当RS 为低电平,R/W 为高电平时,可以读忙信号;当RS 为高电平,R/W 为低电平时,可以写入数据。

6、引脚6:E 端为使能端,当E 端由高电平跳变为低电平时,液晶模块执行命令。

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

8、引脚15:背光源正极。

9、引脚16:背光源负极。

液晶LCD1602驱动源代码/***********************LCD驱动基本代码************************ 单片机:51单片机* 开发环境:keil uVision3* 名称:1602驱动基本代码**************************************************************/#include<reg51.h> //包含头文件#include<intrins.h>#define LCD_Data P0#define Busy 0x80sbit LCD_RS = P1^0;sbit LCD_RW = P1^1;sbit LCD_E = P2^5;unsigned char code welcome[] = {"YOU ARE WELCOME"};unsigned char code mcu[] = {"SL-51A"};void Delay5Ms(void);void WriteDataLCD(unsigned char WDLCD);void WriteCommandLCD(unsigned char WCLCD,BuysC);unsigned char ReadDataLCD(void);unsigned char ReadStatusLCD(void);void LCDInit(void);void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData); void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData); void Info_display(void);/*************************5ms延时函数***************************/void Delay5Ms(void){unsigned int TempCyc = 3552;while(TempCyc--);}/**************************写数据函数***************************/void WriteDataLCD(unsigned char WDLCD){ReadStatusLCD(); //检测忙LCD_Data = WDLCD;LCD_E = 0; //若晶振速度太高可以在这后加小的延时 LCD_E = 0; //延时LCD_RS = 1;LCD_RW = 0;LCD_E = 1;LCD_E = 0;}/*************************写指令函数****************************/void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if (BuysC) ReadStatusLCD(); //根据需要检测忙LCD_Data = WCLCD;LCD_E = 0;LCD_E = 0;LCD_RS = 0;LCD_RW = 0;LCD_E = 1;LCD_E = 0;}/**************************读状态函数***************************/ unsigned char ReadStatusLCD(void){LCD_Data = 0xFF;LCD_RS = 0;LCD_RW = 1;LCD_E = 0;LCD_E = 0;LCD_E = 1;while (LCD_Data & Busy); //检测忙信号return(LCD_Data);}/***************************LCD初始化***************************/void LCDInit(void) //LCD初始化{LCD_Data = 0;WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,1); //显示模式设置, 开始要求每次检测忙信WriteCommandLCD(0x08,1); //关闭显示WriteCommandLCD(0x01,1); //显示清屏WriteCommandLCD(0x06,1); //显示光标移动设置WriteCommandLCD(0x0C,1); //显示开及光标设置}/**********************按指定位置显示一个字符*********************/void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData){Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1if (Y) X |= 0x40; //当要显示第二行时地址码+0x40;X |= 0x80; //算出指令码WriteCommandLCD(X, 0); //这里不检测忙信号,发送地址码WriteDataLCD(DData);}/***********************按指定位置显示一串字符********************/void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData) {unsigned char ListLength;ListLength = 0;Y &= 0x1;X &= 0xF; //限制X不能大于15,Y不能大于1while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void main(void){LCDInit();DisplayListChar(5,0,mcu);DisplayListChar(0,1,welcome); while(1){;}}。

lcd1602驱动程序 (2)

lcd1602驱动程序 (2)

LCD1602是每一个电子类行业初学者必须会使用的显示设备。

LCD1602也是一个非常简单的显示设备,相比于数码管而言,它是反射式显示设备即外界的光强时它才会有显示,所以黑夜是看不到显示的而必须加背光。

LCD1602有两行每行16个单元共32个单元的显示单位。

LCD1602有的支持中文字库有的不支持。

当然不支持中文字库的也可以显示中文这时候需要自定义中文字符(相关技术可查阅以下)。

LCD1602的指令分为写数据和写命令两种,他们的指令有着严格的格式。

可以查阅一下中文数据手册。

LCD1602共16个引脚,分别为:VDD:地VCC:+5V电源VEE:对比度,即调节显示字符的显著度RS:写寄存器或数据的选择位R/W:读或写选择位E:使能位D0-D7:数据口BL+:背光的正电源端BL-:背光的地下面是LCD1602的驱动程序:#include <REG51.H>#include<INTRINS.H>#define uchar unsigned char#define uint unsigned int#define DataPort P0 //定义液晶数据传输口sbit LCM_RS=P2^7; //定义液晶显示控制口sbit LCM_RW=P2^6;sbit LCM_EN=P2^5;/**********************************************************函数名:Wait_Enable功能:等待1602液晶完成内部操作参数:无返回值:无***********************************************************/void Wait_Enable(void){DataPort=0xff; //DataPort=11111111切换PO口为输入状态LCM_RS=0; //RS为低电平,RW为高电平时才可以读忙信号LCM_RW=1;_nop_();LCM_EN=1;_nop_();_nop_();while(DataPort&0x80){}; //相与等于0,说明BF为0,不忙;等于1,BF=1,忙碌LCM_EN=0; //判断忙碌之后,置位EN=0,液晶不执行任何操作}/**********************************************************函数名:Write_Command功能:向液晶模块写入命令参数:cmd--命令chk--是否判忙的标志,1:判忙,0:不判返回值:无***********************************************************/void Write_Command(uchar cmd,uchar chk){if(chk)Wait_Enable();LCM_RS=0; //当RS和RW都为低电平时才可以写入指令或者显示地址LCM_RW=0;_nop_();DataPort=cmd; //将命令置入数据总线_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0; //EN由高电平到低电平,液晶执行写指令操作}/**********************************************************函数名:Write_Data功能:向液晶显示的当前地址写入显示数据参数:data--显示字符数据返回值:无***********************************************************/void Write_Data (uchar datas){Wait_Enable();LCM_RS=1; //RS高电平,RW低电平时可以写入数据LCM_RW=0;_nop_();DataPort=datas; //置数据到数据总线_nop_();LCM_EN=1;_nop_();_nop_();LCM_EN=0;}/**********************************************************函数名:void InitLcd()功能:对LCD1602进行初始化参数:无返回值:无**********************************************************/void InitLcd(){Write_Command(0x3c,1); //设置显示模式:8位2行5*7点阵Write_Command(0x08,1); //显示器关,不显示光标,光标不闪烁Write_Command(0x01,1); //清屏并光标复位Write_Command(0x06,1); //文字不动,光标自动右移Write_Command(0x0c,1); //显示开,不开光标,不闪烁}/**********************************************************函数名:void DisplayOneChar(uchar X,uchar Y,uchar Data)功能:在指定位置第y行第x列显示一个字符参数:X--列坐标Y--行坐标Data--欲显示字符返回值:无**********************************************************/void DisplayOneChar(uchar X,uchar Y,uchar Datas){Y&=1;X&=15;if(Y)X|=0x40;X|=0x80;Write_Command(X,0);Write_Data(Datas);}/**********************************************************函数名:void DisplayListChar(uchar X,uchar Y,uchar code *Data功能:以起始位置第Y行第X列开始显示一串字符参数:X--起始列坐标Y--起始行坐标Data--欲显示字符串首地址返回值:无**********************************************************/ void DisplayListChar(uchar X,uchar Y,uchar code *Datas){uchar ListLength=0;Y&=0x1;X&=0xF;while(X<=15){DisplayOneChar(X,Y,Datas[ListLength]);ListLength++;X++;}}。

单片机驱动LCD1602

单片机驱动LCD1602

LCD_DispStr(1,1,"LCD_Serial_test!");
利用传递参数x、y void LCD_DispStr(char x,char y,char *p) { 确定要显示的字符 if (x !=0x00 && y!=0x00) 串的位置 { switch(y) //数据指针=80h+地址码(0-27H,40-67H) { case 1:LCD_WriteCommand( 0x80 + x-1 );break; //第1行 case 2:LCD_WriteCommand( 0x80 + 0x40 + x-1 );break; //第2行 }
0 要写的数据内容 1 读出的数据内容
写命令时序和对应程序
void LCD_WriteCommand(unsigned char Com)
{ RS_SET_L; //命令总线 RW_SET_L; //写操作 P1=Com; _NOP(); //P1为8位二进制数据
_NOP();
E_SET_H;
// tsp1
LCD_WriteCommand(0x38); 显示模式设置
LCD_WriteCommand(0x01); //清屏 LCD_WriteCommand(0x06);//显示光标移动设置 LCD_WriteCommand(0x0c); //开显示,不显示光标 LCD_WriteCommand(0x00); }
DelayNop(15); // tpw E_SET_L; //使能端下降沿沿写入
图中的延时是有最小限制的,相当 于1602的反应时间,所以单片机 引脚高低电平跳变不能太快
Delay(Delay_Count);

lcd1602工作原理

lcd1602工作原理

lcd1602工作原理LCD1602是一种常见的液晶显示模块,广泛应用于各种电子设备中。

它具有简单易用、显示清晰、功耗低等特点,因此备受电子爱好者和工程师的青睐。

那么,LCD1602是如何工作的呢?接下来,我们就来详细了解一下LCD1602的工作原理。

首先,LCD1602由液晶面板和驱动电路组成。

液晶面板是由一定数量的像素点组成的,每个像素点由液晶分子组成,通过控制液晶分子的排列来实现显示。

而驱动电路则负责控制液晶面板的工作,包括向液晶面板发送数据和控制信号,以及控制液晶面板的亮暗程度。

其次,LCD1602的工作原理主要涉及到两个方面,即液晶显示原理和驱动电路原理。

液晶显示原理是指液晶分子在电场的作用下改变排列状态,从而改变光的透过程度,实现显示。

而驱动电路原理则是指通过控制信号和数据信号,将需要显示的内容传输到液晶面板上,并控制液晶面板的亮暗程度,从而实现显示效果。

液晶显示原理中,液晶分子的排列状态是通过外加电场来改变的。

当电场作用于液晶分子时,液晶分子会改变排列状态,从而改变光的透过程度。

这就是为什么液晶显示需要背光源的原因,因为液晶本身并不会发光,需要外部光源来照亮。

而驱动电路原理则是通过发送数据信号和控制信号,来控制液晶面板的每个像素点的显示状态,从而实现整个画面的显示。

在LCD1602的驱动电路中,一般采用平行接口或串行接口来与微控制器或其他设备进行通信。

通过发送指令和数据,来控制液晶面板的工作。

在发送数据时,需要先发送指令或地址,然后再发送数据,通过这样的方式来控制液晶面板的显示内容。

同时,还需要控制液晶面板的亮暗程度,以及清除显示内容等操作。

总的来说,LCD1602的工作原理主要包括液晶显示原理和驱动电路原理两个方面。

液晶显示原理是通过改变液晶分子的排列状态来实现显示,而驱动电路原理则是通过发送指令和数据信号,来控制液晶面板的工作。

通过这些原理的相互作用,LCD1602能够实现清晰的显示效果,广泛应用于各种电子设备中。

1602显示屏C语言驱动程序及相关上传资料.

1602显示屏C语言驱动程序及相关上传资料.
1602液晶屏通用连接图
C语言编写的程序再说明的下面
1602显示屏的使用方面的知识。
一般市场上的1602液晶使用的驱动器为HD44780U或HD44780S,市场上大部分液晶用的是后者。HD44780S的供电电压为5V±10%,而HD44780U的供电电压为2.7V~5.5V。也就是说,绝大部分1602液晶只能工作在5V电压下,其供电电压必须为5V。经过试验发现,1602液晶的供电虽然必须为5V,但其控制总线和数据总线可以用3.3V电平(因为对于TTL电平,一般大于2.5V以上都算高电平,不过最可靠的是大于3.6V),只不过在3.3V电平下,数据的通信速度会大大降低,这一点需要在写驱动时注意。需要时,可以将MCU的IO配置为漏极开路方式,用上拉电阻拉到5V电平;实在不能配置为漏极开路方式时,请查阅MCU的电气参数,在允许的条件下,直接使用电阻弱上拉也可以。
1602液晶驱动程序及相关资料
简介:本文的内容包括1602的电路连接图,C语言编写的驱动程序,及说明书资料。初学者按图连接并烧好程序就可以直接点亮显示屏。是初学者不可多得的参考资料,可大大节约初学者的学习时间。需要说明的是本例用到的单片机是AT89S52或AT89S51型单片机。如果别的型号的单片机需要足以更新头文件。
characterN[8] = {0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00}; //日
//=====================================================================================
4、1602液晶的初始化
通用1602液晶的初始化需要注意一个问题,即一定要在最开始写入功能设定指令,该指令用以控制LCD的数据通信位数,及显示行数和字型。并且强烈建议将此指令写两次,因为LCD启动后并不知道您使用的是4位数据通信方式还是8位方式,所以它总是先执行高4位的指令,也就是说第一次写入该指令时,低四位的数据可能被忽略(这是我根据使用其它液晶的猜测)。总之为了可靠,最好写两遍该指令。

使用DSP驱动1602液晶屏实验

使用DSP驱动1602液晶屏实验

实验题目:使用DSP驱动1602液晶屏实验一、实验目的1.掌握液晶的使用方法;2.掌握液晶信号之间时序的正确识别和引入。

二、实验仪器1. 一台装有CCS2000软件的计算机;2. 插上2812主控板的DSP实验箱;3. DSP硬件仿真器。

4.杜邦线5.LCD1602三、实验原理1.1602LCD主要技术参数:显示容量: 16×2个字符芯片工作电压: 4.5~5.5V工作电流: 2.0mA(5.0V)模块最佳工作电压: 5.0V字符尺寸: 2.95×4.35(W×H)mm原理图和管脚连接图如下图四、实验步骤1.把LCD1602根据程序设定的管脚与实验箱上的管脚对应连接起来。

2.在CCS2000环境中打开本实验的工程编译Example_lcd.prj,生成输出文件,通过仿真器把执行代码下载到DSP芯片;3.运行程序;液晶上会循环显示预定内容。

五、实验程序以及图片#include "include/DSP281x_Device.h"#include "include/DSP281x_Examples.h"#define uint unsigned short int#define uchar unsigned charuchar table1[]="xiaoqiang ";uchar table2[]="123";void Gpio_select(void);main(){unsigned char i;InitSysCtrl();EALLOW;EDIS;Gpio_select();DINT;InitPieCtrl();IER = 0x0000;IFR = 0x0000;InitPieVectTable();InitXintf();init();write_com(0x80);for(i=0;i<10;i++){write_data(table1[i]);}write_com(0x80+0x40);for(i=0;i<12;i++){write_data(table2[i]);}while(1);}void Gpio_select(void){Uint16 var1;Uint16 var2;Uint16 var3;var1= 0x0000;var2= 0xFFFF;var3= 0x0000;EALLOW;GpioMuxRegs.GPAMUX.all=var1;GpioMuxRegs.GPBMUX.all=var1;GpioMuxRegs.GPDMUX.all=var1;GpioMuxRegs.GPFMUX.all=var1;GpioMuxRegs.GPEMUX.all=var1;GpioMuxRegs.GPGMUX.all=var1;GpioMuxRegs.GPADIR.all=var2;GpioMuxRegs.GPBDIR.all=var2;GpioMuxRegs.GPDDIR.all=var2;GpioMuxRegs.GPEDIR.all=var2;GpioMuxRegs.GPFDIR.all=var2;GpioMuxRegs.GPGDIR.all=var2;GpioMuxRegs.GPAQUAL.all=var3;GpioMuxRegs.GPBQUAL.all=var3;GpioMuxRegs.GPDQUAL.all=var3;GpioMuxRegs.GPEQUAL.all=var3;EDIS;}六、总结通过本次实验我掌握了液晶的使用方法和掌握了液晶信号之间时序的正确识别和引入。

第五次课LCD1602显示驱动电路基础.

第五次课LCD1602显示驱动电路基础.

8X8 点阵LED工作原理说明
P0 口
P2口
第7章 1602液晶的使用
第7章 1602液晶的使用
显示驱动技术讲义
专用液晶定制产业链
1.液晶面板设计与生产
门槛较高,投资较大
厂家:大连大显,深圳新深辉,瑞捷兴,河北冀雅
2.液晶驱动控制模块(LCM)的设计
门槛低,小公司多如牛毛, 厂家:西安海晶,陕西振远
3.含液晶显示模块的嵌入式开发应用
如:工业仪器仪表,专用手持式工控设备等
第7章 1602液晶的使用
显示驱动技术讲义
液晶显示器组成
第7章 1602液晶的使用
显示驱动技术讲义
压框:
第7章 1602液晶的使用
显示驱动技术讲义
背光电源安装方法
第7章 1602液晶的使用
显示驱动技术讲义
背光电源电特性
第7章 1602液晶的使用
显示驱动技术讲义
第7章 1602液晶的使用
显示驱动技术讲义
显示驱动技术讲义
2010年:条形码扫码系统 李光,关伟
第7章 1602液晶的使用
显示驱动技术讲义
流水线产品扫码系统
第7章 1602液晶的使用
显示驱动技术讲义
2011年:三相电能质量分析仪
第7章 1602液晶的使用
显示驱动技术讲义
1602字符液晶原理以及使用方法
知识点 :
⑴1602字符液晶显示器组 成及驱动电路(LCM)。 ⑵了解1602字符液晶显示 器接口。 ⑶编程实现显示功能。
第7章 1602液晶的使用
显示驱动技术讲义
北京航天金税技术有限公司
招聘职位: LCM开发工程师 招聘要求 1.应用电子技术或自动控制专业本科学历; 2.能熟练应Protel,POWERPCB或CADENCE等电子软件设计电路图和 PCB图; 3.从事过LCM设计或熟悉LCM原理者优先考虑; 4.能熟练阅读和翻译英文技术资料; 5.具有创新能力和良好的团队协作精神。 专业职责 1.负责产品的试制工作 2.负责编制试制总结报告及追踪具体落实情况 3.负责和试制产品信息交流,做好资源和产品标准化的协调 4.跟踪量产产品的生产状况

LCD1602驱动

LCD1602驱动
#define LCD_CHAR_RIGHT 0x1C //显示器上字符全部右移一格,但光标不动
uchar code number[10]={"0123456789"};
/*所有函数声明*********************************************************/
*********************************************************************/
uchar Rstatus(void)
{
Port = 0xFF;
Rs = 0;
Rw = 1;
En = 0;
En = 0;
En = 1;
while (Port & 0x80); //检测忙信号,不忙则退出等待
LCD_wcommand(0x38,1); //显示模式设置(0X38双行(5*7),0X34单行(5*10)),0X30单行(5*7);开始要求每次检测忙信号
LCD_wcommand(0x08,1); //关闭显示
LCD_wcommand(0x01,1); //显示清屏
LCD_wcommand(0x06,1); // 显示光标移动设置
void LCD_print(uchar x,uchar y,uchar *str)
{
LCD_gotoxy(x,y);
while(*str!='\0')
{
LCD_wdata(*str);
str++;
}
}
/*
********************************************************************

LCD1602驱动及显示计数值程序

LCD1602驱动及显示计数值程序
1.6.2 显示开/关及光标设置
1.6.3 数据指针设置 1.6.4 其它设置
5
1.7 外形
嵌入式应用软件园,版权所有,请勿转载/销售。
6
嵌入式应用软件园,版权所有,请勿转载/销售。
第 2 章 程序功能
程序中包含 LCM 用到的所有函数:初始化、写指令、写数据、判忙碌、清屏 幕。
单片机外接 2x2 (P3.7,P3.6 与 P3.0,P3.1)矩阵键盘,利用定时器 T0 的定时中断, 查询矩阵键盘。矩阵键盘被命名为 A、B、C、D。对键盘被按下的次数进行计数, 计数值会在 LCM 上显示。
LCM 与单片机的连接
7
嵌入式应用软件园,版权所有,请勿转载/销售。
第 3 章 程序代码
我们的辛勤付出,需要您的肯定,请访问: 嵌入式应用软件园。
;******************************************************************************
9
嵌入式应用软件园,版权所有,请勿转载/销售。
LCALL WRITE_DATA MOV A,#10001010B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;显示 C: MOV A,#11000000B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#43H LCALL WRITE_DATA MOV A,#11000001B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;显示 D: MOV A,#11001001B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#44H LCALL WRITE_DATA MOV A,#11001010B ;数据指针(显示地址设置) LCALL WRITE_COM MOV A,#3AH LCALL WRITE_DATA ;计数的循环,一直执行,永不跳出 START: MOV LCM_P,#10000010B ;数据指针(显示地址设置) MOV R0,#A4 LCALL DISP MOV LCM_P,#10001011B ;数据指针(显示地址设置) MOV R0,#B4 LCALL DISP MOV LCM_P,#11000010B ;数据指针(显示地址设置) MOV R0,#C4 LCALL DISP MOV LCM_P,#11001011B ;数据指针(显示地址设置) MOV R0,#D4 LCALL DISP LJMP START

lcd1602液晶显示模块原理

lcd1602液晶显示模块原理

lcd1602液晶显示模块原理LCD1602液晶显示模块原理引言:LCD1602液晶显示模块是一种常见的显示设备,广泛应用于各种电子产品中。

它采用液晶技术,通过控制液晶分子的排列来实现显示功能。

本文将介绍LCD1602液晶显示模块的工作原理、构造和应用。

一、LCD液晶显示原理液晶显示是利用液晶分子的光学特性来实现显示的。

液晶分子具有双折射特性,即在电场的作用下,液晶分子的折射率发生改变,从而改变光的传播方向和偏振态,从而实现显示效果。

二、LCD1602液晶显示模块的构造LCD1602液晶显示模块由1602液晶屏、驱动芯片、背光源和控制电路组成。

1602液晶屏是由16列2行的字符组成,每个字符由5x8个像素点组成。

驱动芯片负责控制液晶分子的排列,实现显示功能。

背光源提供背光照明,使得显示内容清晰可见。

控制电路则负责将输入的数据和信号转化为液晶屏可以理解的信号。

三、LCD1602液晶显示模块的工作原理1. 数据和信号输入用户通过控制电路将需要显示的数据和命令输入到LCD1602液晶显示模块。

这些数据和命令通过数据总线和控制总线传输到驱动芯片。

2. 数据处理和驱动驱动芯片接收到输入的数据和命令后,根据不同的指令进行相应的处理。

驱动芯片内部有一个字符发生器和一个字符显示RAM,根据接收到的指令和数据来控制液晶分子的排列,从而显示出相应的字符。

3. 图形显示和刷新除了显示字符外,LCD1602液晶显示模块还可以显示简单的图形。

驱动芯片中的字符发生器可以根据用户的要求生成不同的图形,并通过驱动液晶分子的排列方式来显示这些图形。

为了保持显示内容的稳定,LCD1602液晶显示模块需要进行周期性刷新,即不断更新液晶屏上显示的内容。

4. 背光控制LCD1602液晶显示模块的背光源可以通过控制电路来控制其亮度。

用户可以通过调节背光源的电流或使用PWM调光方式来控制背光的亮度和显示效果。

四、LCD1602液晶显示模块的应用LCD1602液晶显示模块广泛应用于各种电子产品中,如电子秤、计时器、温度计、计数器等。

lcd1602使用手册,LCD1602的使用详解

lcd1602使用手册,LCD1602的使用详解

lcd1602 使用手册,LCD1602 的使用详解LCD1602 是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780 或者其它兼容芯片。

刚开始接触它的大多是单片机的初学者。

由于对它的不了解,不能随心所欲地对它进行驱动。

经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。

一般来说,LCD1602 有16 条引脚,据说还有14 条引脚的,与16 脚的相比缺少了背光电源A(15 脚)和地线K(16 脚)。

我手里这块LCD1602 的型号是HJ1602A,是绘晶科技公司的产品,它有16 条引脚。

LCD1602 的基本操作1. 读状态:输入RS=0,RW=1,E=高脉冲。

输出:D0D7 为状态字。

2. 读数据:输入RS=1,RW=1,E=高脉冲。

输出:D0D7 为数据。

3. 写命令:输入RS=0,RW=0,E=低脉冲。

输出:无。

(写完置E= 高脉冲)4. 写数据:输入RS=1,RW=0,E=低脉冲。

输出:无。

分析时序图(1)写操作(单片机至HD44780)首先要对寄存器的选择和读、写操作选择进行配置。

RS 是寄存器选择,RS = 1 对数据进行操作;RS = 0 对指令进行操作。

接着对读写操作选择进行配置,RW = 0 写操作。

打开使能端,输入使能信号E = 1。

数据总线,对DB0~DB7 赋值,进行数据的传输【注】如果先打开使能,再进行其他配置的话,有可能传输的数据不是自己想要的。

(2)读操作(HD44780 至单片机)显示模块的指令集,根据自己的显示需要进行相应的配置显示的位置设置DDRAM显示在第一行某一列的数据可以写命令:0x80 | 0x**,显示在第二行某一列的数据可以写命令:0x80 | 0x40 | 0x** = 0xC0 | 0x**,0x80 是因为在设置DDRAM 地址时,DB7 固定是为1 的。

LCD1602 写入自己的字符及显示汉字1、由于LCD 是外部设备,处理速度比CPU 速度慢,向LCD 写入命令到完成功能需要一定的时间,在这个过程中,LCD 处于忙状态,不能向LCD 写入新的内容。

1602显示屏驱动详解

1602显示屏驱动详解

LCD1602的单片机驱动详解一.接口LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。

刚开始接触它的大多是单片机的初学者。

由于对它的不了解,不能随心所欲地对它进行驱动。

经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。

与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的。

一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。

我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。

如图1所示:图1再来一它的背面的,如图2所示:图2它的16条引脚定义如下:对这个表的说明:1. VSS接电源地。

2. VDD接+5V。

3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。

或同样阻值的RM065/RM063蓝白可调电阻。

见图3。

图34. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。

5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。

如果不需要进行读取操作,可以直接将其接VSS。

6. E,执行命令的使能引脚,接单片机的一个I/O。

7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意的8个I/O口。

如果接P0口,P0口应该接4.7K —10K的上拉电阻。

如果是4线并行驱动,只须接4个I/O口。

8. A背光正极,可接一个10—47欧的限流电阻到VDD。

9. K背光负极,接VSS。

单片机对1602液晶的驱动

单片机对1602液晶的驱动

单片机对1602液晶的驱动
液晶的操作:
1602液晶只能显示ASCI,今天把1602液晶驱动起来,液晶操作要比数码管简单
液晶的基本操作时序:
1.1读状态:输入:RS = L,RW =H,E = H输出D0~D7
1.2写指令:输入:RS = L,RW = L,D0~D7指令码,E = 高脉冲,输出:无;
RS是数据命令选择端(H/L);
1.3读数据:输入RS= H,RW=H,E=H
1.4写指令:输出,RS = L,RW = L,D0~D7=数据,E=高脉冲
注意:对控制器每次进行读写操作之前,都必须进行读写检测,确保STA7为0,可以用简单的延时来代替
初始化设置
显示模式设置
指令码:00111000 功能16*2显示,5*7点阵,8为数据接口0x38的指令
显示开/关光标的设置
因此左移和右由N和S设置
数据指针的指令码
80H+地址码(0-27H,40H到67H)
其他设置
指令码01H 功能是显示清屏:1数据指针清零,2所有显示清零
02H显示回车:1数据指针清零
电路图如图所示:
示例代码:动态显示
#include
#include。

  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

LCD1602的单片机驱动详解一.接口LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片。

刚开始接触它的大多是单片机的初学者。

由于对它的不了解,不能随心所欲地对它进行驱动。

经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。

与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的。

一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。

我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。

如图1所示:. . . 资料. .图1再来一张它的背面的,如图2所示:. . . 资料. .图2它的16条引脚定义如下:. . . 资料. .. . . 资料. .对这个表的说明:1. VSS接电源地。

2. VDD接+5V。

3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。

或同样阻值的RM065/RM063蓝白可调电阻。

见图3。

图34. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。

5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据。

如果不需要进行读取操作,可以直接将其接VSS。

6. E,执行命令的使能引脚,接单片机的一个I/O。

. . . 资料. .7. D0—D7,并行数据输入/输出引脚,可接单片机的P0—P3任意的8个I/O口。

如果接P0口,P0口应该接4.7K—10K 的上拉电阻。

如果是4线并行驱动,只须接4个I/O口。

8. A背光正极,可接一个10—47欧的限流电阻到VDD。

9. K背光负极,接VSS。

见图4所示。

. . . 资料. .图4二.基本操作LCD1602的基本操作分为四种:1. 读状态:输入RS=0,RW=1,E=高脉冲。

输出:D0—D7为状态字。

. . . 资料. .2. 读数据:输入RS=1,RW=1,E=高脉冲。

输出:D0—D7为数据。

3. 写命令:输入RS=0,RW=0,E=高脉冲。

输出:无。

4. 写数据:输入RS=1,RW=0,E=高脉冲。

输出:无。

读操作时序图(如图5):图5. . . 资料. .写操作时序图(如图6):图6时序时间参数(如图7):. . . 资料. .图7三.DDRAM、CGROM和CGRAMDDRAM(Display Data RAM)就是显示数据RAM,用来寄存待显示的字符代码。

共80个字节,其地址和屏幕的对应关系如下(如图8):. . . 资料. .图8DDRAM相当于计算机的显存,我们为了在屏幕上显示字符,就把字符代码送入显存,这样该字符就可以显示在屏幕上了。

同样LCD1602共有80个字节的显存,即DDRAM。

但LCD1602的显示屏幕只有16×2大小,因此,并不是所有写入DDRAM的字符代码都能在屏幕上显示出来,只有写在上图所示范围内的字符才可以显示出来,写在范围外的字符不能显示出来。

这样,我们在程序中可以利用下面的“光标或显示移动指令”使字符慢慢移动到可见的显示范围内,看到字符的移动效果。

. . . 资料. .前面说了,为了在液晶屏幕上显示字符,就把字符代码送入DDRAM。

例如,如果想在屏幕左上角显示字符‘A’,那么就把字符‘A’的字符代码41H写入DDRAM的00H地址处即可。

至于怎么写入,后面会有说明。

那么为什么把字符代码写入DDRAM,就可以在相应位置显示这个代码的字符呢?我们知道,LCD1602是一种字符点阵显示器,为了显示一种字符的字形,必须要有这个字符的字模数据,什么叫字符的字模数据,看看下面的这个图就明白了(如图9)。

图9上图的左边就是字符‘A’的字模数据,右边就是将左边数据用“○”代表0,用“■”代表1。

从而显示出‘A’这个字形。

从下面的图可以看出,字符‘A’的高4位是0100,低4位是0001,合在一起就是01000001b,即41H。

它恰. . . 资料. .好与该字符的ASCII码一致,这样就给了我们很大的方便,我们可以在PC上使用P2=‘A’这样的语法。

编译后,正好是这个字符的字符代码。

在LCD1602模块上固化了字模存储器,就是CGROM和CGRAM,HD44780内置了192个常用字符的字模,存于字符产生器CGROM(Character Generator ROM)中,另外还有8个允许用户自定义的字符产生RAM,称为CGRAM(Character Generator RAM)。

下图(如图12)说明了CGROM和CGRAM与字符的对应关系。

从ROM和RAM的名字我们也可以知道,ROM是早已固化在LCD1602模块中的,只能读取;而RAM是可读写的。

也就是说,如果只需要在屏幕上显示已存在于CGROM中的字符,那么只须在DDRAM中写入它的字符代码就可以了;但如果要显示CGROM中没有的字符,比如摄氏温标的符号,那么就只有先在CGRAM中定义,然后再在DDRAM中写入这个自定义字符的字符代码即可。

和CGROM中固化的字符不同,CGRAM中本身没有字符,所以要在DDRAM中写入某个CGROM不存在的字符,必须在CGRAM中先定义后使用。

程序退出后CGRAM中定义的字符也不复存在,下次使用时,必须重新定义。

. . . 资料. .图10上面这个图(如图10)说明的是5×8点阵和5×10点阵字符的字形和光标的位置。

先来说5×8点阵,它有8行5列。

那么定义这样一个字符需要8个字节,每个字节的前3个位没有被使用。

例如,定义摄氏温标的符号{0x10,0x06,0x09,0x08,0x08,0x09,0x06,0x00}。

. . . 资料. .图11上面这个图(如图11)说明的是设置CGRAM地址指令。

从这个指令的格式中我们可以看出,它共有aaaaaa这6位,一共可以表示64个地址,即64个字节。

一个5×8点阵字符共占用8个字节,那么这64个字节一共可以自定义8个字符。

也就是说,上面这个图的6位地址中的DB5DB4DB3用来表示8个自定义的字符,DB2DB1DB0用来表示每个字符的8个字节。

这DB5DB4DB3所表示的8个自定义字符(0--7)就是要写入DDRAM中的字符代码。

我们知道,在CGRAM 中只能定义8个自定义字符,也就是只有0—7这8个字符代码,但在下面的这个表(如图12)中一共有16个字符代码(××××0000b--××××1111b)。

实际上,如图所示,它只能表示8个自定义字符(××××0000b=××××1000b, ××××0001b=××××1001b……依次类推)。

也就是说,写入DDRAM中的字符代码0和字符代码8是同一个自定义字符。

5×10点阵每个字符共占用16个字节的空间,所以CGRAM中只能定义4个这样的自定义字符。

. . . 资料. .那么如何在CGRAM中自定义字符呢?在上面的介绍中,我们知道有一个设置CGRAM地址指令,同写DDRAM指令相似,只须设置好某个自定义字符的字模数据,然后按照上面介绍的方法,设置好CGRAM地址,依次写入这个字模数据即可。

我们在后面的例子中再进行说明。

. . . 资料. .. . . 资料. .图12四.LCD1602指令1.工作方式设置指令(如图13)图13×:不关心,也就是说这个位是0或1都可以,一般取0。

DL:设置数据接口位数。

DL=1:8位数据接口(D7—D0)。

DL=0:4位数据接口(D7—D4)。

N=0:一行显示。

N=1:两行显示。

. . . 资料. .F=0:5×8点阵字符。

F=1:5×10点阵字符。

说明:因为是写指令字,所以RS和RW都是0。

LCD1602只能用并行方式驱动,不能用串行方式驱动。

而并行方式又可以选择8位数据接口或4位数据接口。

这里我们选择8位数据接口(D7—D0)。

我们的设置是8位数据接口,两行显示,5×8点阵,即0b00111000也就是0x38。

(注意:NF是10或11的效果是一样的,都是两行5×8点阵。

因为它不能以两行5×10点阵方式进行显示,换句话说,这里用0x38或0x3c是一样的)。

2.显示开关控制指令(如图14)图14D=1:显示开,D=0:显示关。

. . . 资料. .C=1:光标显示,C=0:光标不显示。

B=1:光标闪烁,B=0:光标不闪烁。

说明:这里的设置是显示开,不显示光标,光标不闪烁,设置字为0x0c。

3.进入模式设置指令(如图15、16)图15I/D=1:写入新数据后光标右移。

I/D=0:写入新数据后光标左移。

S=1:显示移动。

S=0:显示不移动。

. . . 资料. .图16说明:这里的设置是0x06。

4.光标或显示移动指令(如图17、18)图17. . . 资料. .图18说明:在需要进行整屏移动时,这个指令非常有用,可以实现屏幕的滚动显示效果。

初始化时不使用这个指令。

5.清屏指令(如图19)图19说明:清除屏幕显示内容。

光标返回屏幕左上角。

执行这个指令时需要一定时间。

6.光标归位指令(如图20). . . 资料. .图20说明:光标返回屏幕左上角,它不改变屏幕显示内容。

7.设置CGRAM地址指令(如图21)图21说明:这个指令在上面已经介绍过。

用法在后面例子中说明。

. . . 资料. .8.设置DDRAM地址指令(如图22)图22说明:这个指令用于设置DDRAM地址。

在对DDRAM进行读写之前,首先要设置DDRAM地址,然后才能进行读写。

前面我们说过,DDRAM就是LCD1602的显示存储器。

我们要在它上面进行显示,就要把要显示的字符写入DDRAM。

同样,我们想知道DDRAM某个地址上有什么字符,也要先设置DDRAM地址,然后将它读出到单片机。

9.读忙信号和地址计数器AC(如图23). . . 资料. .图23说明:这个指令用来读取LCD1602状态。

对于单片机来说,LCD1602属于慢速设备。

相关文档
最新文档