LCD1602常用驱动子程序(汇编语言)
- 格式:doc
- 大小:30.50 KB
- 文档页数:3
单片机LCD1602显示字符和数字的汇编程序(无聊原创)1,单片机和LCD1602的连线,和程序结果显示如下图:2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。
程序如下:ORG 0000HAJMP MAINRS EQU P2.4RW EQU P2.5E EQU P2.6MAIN: MOV SP,#60HMOV 40H,#01HMOV 41H,#02HMOV 42H,#03HMOV 43H,#04HMOV 44H,#05HMOV 45H,#06HMOV 46H,#07HACALL DD1 ;DD1是LCD初始化MOV DPTR,#TABLE1ACALL DD2;DD2是LCD第一行显示TABLE1ACALL PPP ;PPP是LCD第二行显示RAM中40H到46H中的数据SJMP $DD1: MOV p0,#01H ;清屏CALL ENABLEMOV p0,#38H ;显示功能CALL ENABLEMOV p0,#0FH ;显示开关控制CALL ENABLEMOV p0,#06H ;+1CALL ENABLERETDD2: MOV p0,#80H;第一行的开始位置cALL ENABLECALL WRITE1;到TABLE1取码?RETDD3: MOV p0,#0C0H;第二行的位置CALL ENABLECALL WRITE1;到TABLE2 取码RETENABLE: CLR RS ;送命令CLR RWCLR ECALL DELAYSETB ERETWRITE1: MOV R1,#00H ;显示table中的值A1: MOV A,R1;到table取码MOVC A,@A+DPTRcall wRITE2 ;显示到lcdINC R1CJNE A,#00H,A1 ;是否到00hRETWRITE2:MOV p0,A ;显示SETB RSCLR RWCLR ECALL DELAYSETB ERET(动态显示频率、幅度核心程序设计思想:可以利用如下程序)MOV 40H,#01HMOV 41H,#02HMOV 42H,#03H)MOV R1,#40H ;显示table中的值MOV A,R1;到table取码MOVC A,@A+DPTRMOV P0,AINC R1LJMP LOOPDELAY: P USH ACCMOV A,R4MOV R4,#05D1: MOV R5,#0FFHDJNZ R5,$DJNZ R4,D1MOV R4,APOP ACCRETPPP: M OV p0,#0C0H;第二行的位置CALL ENABLEMOV DPTR,#TAB;显示CALL WRITE3;到TABLE2 取码RETWRITE3: MOV R1,#40H ;显示table中的值MOV R7,#07HA2: MOV A,@R1;到table取码MOVC A,@A+DPTRcall wRITE2 ;显示到lcdINC R1DJNZ R7,A2 ;是否到00hRETtable1: db"XIAORENGUANG ",00HTAB: DB 30H, 31H, 32H, 33HDB 34H, 35H, 36H, 37HDB 38H, 39HEND。
;******************************************* ********************* ;本程序用来驱动LCD1602 *;****************************************************************RS BIT P2.0 ;RS引脚RW BIT P2.1 ;RW引脚E BIT P2.2 ;使能信号引脚DA T_X EQU 08H ;存放DDRAM的列序号DA T_Y EQU 09H ;存放DDRAM的行序号DA T_C EQU 10H ;存放待显示的数据;**************************************************************** ORG 0000HAJMP STARTORG 0030H;**************************************************************** ;对LCD进行初始化*;**************************************************************** START: MOV SP, #5FH;LCALL DL_1640U ;延时大约(不小于)1.64msMOV A, #38H ;初始化LCD,数据总线为8位;显示2行,57点阵/字符LCALL CMD_LC ;调用指令发送程序MOV A, #0FH ;开显示,有光标闪烁LCALL CMD_LC ;调用指令发送程序MOV A, #06H ;写入新数据后光标右移,;写入新数据后,屏幕不移动LCALL CMD_LC ;调用指令发送程序MOV A, #01H ;清楚屏幕显示LCALL CMD_LC ;调用指令发送程序LCALL DL_1640U ;延时1.64ms,因为清屏指令;的执行时间是1.64ms;**************************************************************** ;主程序*;**************************************************************** MAIN: MOV DAT_C, #41H ;把A的ASCII码存入DA T_C中MOV DAT_X, #06 ;把列的序号存入DAT_X中MOV DAT_Y, #0 ;把行的序号存入DAT_Y中LCALL DAT_DISP ;调用显示程序AJMP $ ;主程序到此结束;**************************************************************** ;指令发送程序*;**************************************************************** CMD_LC: CLR R SCLR R WMOV P0, ASETB ECLR ELCALL DL_40U ;延时40us,我们知道大部分;的指令执行的时间都是40usRET;**************************************************************** ;数据发送程序*;**************************************************************** DA T_LC: SETB RSCLR R WMOV P0, ASETB E ;下降沿执行指令,;所以要先高后低CLR ELCALL DL_40U ;延时40usRET;**************************************************************** ;数据显示程序;**************************************************************** DA T_DISP: MOV R0, DAT_Y ;把行序号送到R0中CJNE R0, #1, DAT_1 ;判断行的序号是0;还是1如果是0,则;把列序号加上#80H;如果是01,则把列;序号加上#0C0HMOV A, DAT_XADD A, #0C0HLCALL CMD_LCMOV A, DAT_CLCALL DAT_LCRETDA T_1: MOV A, DAT_XADD A, #80HLCALL CMD_LCMOV A, DAT_CLCALL DAT_LCRET;**************************************************************** ;本程序用来延时大约(不小于)40us *;**************************************************************** DL_40U: MOV R7, #20 ;晶振频率是12M的情况下DJNZ R7, $RET;**************************************************************** ;本程序用来延时大约(不小于)1.64ms *;**************************************************************** DL_1640U: MOV R7, #20 ;晶振频率是12M的情况下DL_1640: MOV R6, #40DJNZ R6, $DJNZ R7, DL_1640RET;**************************************************************** END。
1602汇编指令程序ORG 0000HAJMP STARTORG 0013HLJMP INT1ZDORG 0030HRS BIT P3.5RW BIT P3.6E BIT P3.4L0 EQU P0START:CLR RS //初始化CLR RWMOV L0,#38HSETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#06HSETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#0CH //选中第二行显示SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#' ' //显示空白SETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#00HSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'w' //显示字母 WSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'w' //显示字母 WSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'w' //显示字母 WSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'.' //显示 .SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'1' //显示SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'0'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'0'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'8'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'6'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#' 'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'.'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'c'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'o'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'m'SETB EACALL DELAYCLR ECLR RSCLR RWMOV L0,#0C0HSETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'t'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'e'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'l'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'l'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#':'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'0'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'2'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'8'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'-'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'7'ACALL DELAYCLR ESETB RSCLR RWMOV L0,#'8'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'-'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'5'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'7'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'3'SETB EACALL DELAYCLR ESETB RSCLR RWMOV L0,#'6'SETB EACALL DELAYSJMP $DELAY:MOV R5,#10 //延时子程序 D0:MOV R6,#10D1:DJNZ R6,D1DJNZ R5,D0RETEND。
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上得到一个完整汉字。
LCD1602常用驱动子程序(汇编语言)文章发表于:2007-11-19 10:35最近找到了LCD1602的驱动程序,经本人整理把常用的驱动子程序现上传给大家,希望能对大家有用。
此程序以EDN的51实验板为基础,数据口为P0,控制口为P1。
程序共有9段,START为主程序,INSE为中断服务子程序,INIT为LCD显示模式设置子程序,QLCD为清屏子程序,WIR为写指令子程序,WDR为写数据子程序,CKLCD为查LCD空闲子程序,STS00为延时子程序,PWDR为批量写数据子程序。
程序如下:RS BIT P1.0RW BIT P1.1E BIT P1.2ORG 0000HAJMP STARTORG 000BHAJMP INSEORG 0100H ;程序地址START: MOV TMOD,#00H ;设置计时/计数模式MOV TL0,#00H ;#00H-->计时0低位MOV TH0,#00H ;#00H-->计时0高位SETB EA ;开中断SETB ET0 ;中断使能SETB TR0 ;计时0开绐MOV 50H,#32H ;#32H-->50HMOV SP,#60H ;#60h-->SP 地址指针ACALL INIT ;调 INIT 子程序 ( LCD 模式设置) ACALL QLCD ;调清屏子程序MOV A,#80H ;#80H-->A (设LCD地址第一行第一列)ACALL WIR ;调写IR子程序MOV DPTR,#L1 ;#L1-->DPTRACALL PWDR ;调批量写DR子程序MOV A,#0C0H ;#0C0H-->A (设LCD地址第二行第一列) ACALL WIR ;调写 IR 子程序MOV DPTR,#L2 ;#L2-->DPTRACALL PWDR ;调批量写DR子程序LOOP: AJMP LOOP ;转LOOPINSE: MOV TL0,#00H ;#00H-->计时0低位MOV TH0,#00H ;#00H-->计时0高位DJNZ 50H,INSE0 ;50H-1 不等于0转INSE0MOV 50H,#32H ;#32H-->50HINSE0: RETI; ;中断返回INIT: MOV A,#38H ;#38H-->A (使用8Bits汇流排,显示2行5*7字符) LCALL WIR ;调写IR子程序MOV A,#0EH ;#0EH-->A (显示开,光标开,光标闪烁)LCALL WIR ;调写IR子程序MOV A,#06H ;#06H-->A (字符不动,光标自动右移一格) LCALL WIR ;调写IR子程序RET ;返回CKLCD: PUSH Acc ;Acc进栈CK00: CLR RS ;RS 清 0SETB RW ;RW 置 1CLR E ;E 清 0SETB E ;E 置 1MOV A,P0 ;P0-->ACLR E ;E 清 0JB Acc.7,CK00 ;Acc.7=1 转 CK00POP Acc ;Acc 出栈ACALL STS00 ;调延时子程序 STS00RET ;返回WIR: ACALL CKLCD ;调查空闲子程序CLR E ;E 清 0CLR RS ;RS 清 0CLR RW ;RW 清 0SETB E ;E 置 1MOV P0,A ;A-->P0CLR E ;E 清 0RET ;返回WDR: ACALL CKLCD ;调查空闲子程序CLR E ;E 清 0SETB RS ;RS 置 1CLR RW ;RW 清 0SETB E ;E 置 1MOV P0,A ;A-->P0CLR E ;E 清 0RET ;返回STS00: MOV 52H,#05H ;#05H-->52HSTS001: MOV 51H,#0F8H ;#0F8H-->51HDJNZ 51H,$ ;51H-1不等于0转再-1DJNZ 52H,STS001 ;51H-1不等于0转STS001RET ;返回QLCD: MOV A,#01H ;#01H-->AACALL WIR ;调写IR子程序RET ;返回PWDR: PUSH Acc ;Acc进栈PWDR1: CLR A ;A 清 0MOVC A,@A+DPTR ;A+DPTR-->AJZ PEND ;A=0 转 PENDACALL WDR ;调写DR子程序INC DPTR ;DPTR+1AJMP PWDR1 ;转 PWDR1PEND: POP Acc ;Acc 出栈RET ;返回L1: DB 20H,4EH,61H,74H,69H,65H,62H,20H,45H,6CH,65H,63H,74H,72H,6FH,6EH,00HL2: DB 7EH,6EH,61H,74H,69H,65H,6DH,40H,32H,31H,63H,6EH,2EH,63H,6FH,6DH,00HEND此程序已在仿真与EDN-51实验板上通过,只要把L1与L2的数据改动一下,就能在LCD上显示不同的字符。
1602是课程设计和毕业设计经常用到的显示器,还在愁怎么对1602操作吗?那么看完1602驱动程序,一切变得那么简单。
LCD1602驱动程序://===========LCD1602.H===============#ifndef _LCD1602_H__#define _LCD1602_H__#include<intrins.h>#include"delay.h"//lcd1602管脚定义#define LCD_Data P0 //第7~14脚:D0~D7为8位双向数据线#define Busy 0x80 //用于检测LCM状态字中的Busy标识sbit LCD_RS=P2^0; //寄存器选择位,将LCD_RS位定义为P2.0引脚sbit LCD_RW=P2^1; //读写选择位,将LCD_RW位定义为P2.1引脚sbit LCD_E=P2^2; //使能信号位,将E位定义为P2.2引脚sbit BF=P0^7; //忙碌标志位,,将BF位定义为P0.7引脚//函数定义声明bit BusyTest(void);//判断液晶模块的忙碌状态void WriteInstruction (unsigned char );//将模式设置指令或显示地址写入液晶模块//void WriteAddress(unsigned char ); //指定字符显示的实际地址void WriteData(unsigned char );//将数据(字符的标准ASCII码)写入液晶模块void CursorFlash(unsigned char,unsigned char); //光标在指定坐标闪烁void InitLcd(void);//初始化LCD1602/*****************************************************函数功能:判断液晶模块的忙碌状态返回值:result。
HD44780内置了DDRAM、CGROM和CGRAM。
CGROM和CGRAM就是内置192个常用字符产生器,用户自定义的字符产生器RAM DDRAM就是显示数据RAM,用来寄存待显示的字符代码。
共80个字节,其地址和屏幕的对应关系如下表:显示位置: 1 2 3 4 5 6 7 8 (40)第一行: 00H 01H 02H 03H 04H 05H 06H 07H ..... 27H第二行: 40H 41H 42H 43H 44H 45H 46H 47H ..... 67H*/1602LCD的RAM地址映射液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。
要显示字符时要先输入显示字符地址,也就是告诉模块在,哪里显示字符,图是1602的内部显示地址。
也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM的00H地址写入“A”字的代码就行了。
但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。
那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。
第二行也一样用前16个地址。
对应如下:DDRAM地址与显示位置的对应关系图五:LCD1602内部显示地址例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1,所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。
/*1602液晶模块内部的控制器共有11条控制指令,如下表序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D01 清显示0 0 0 0 0 0 0 0 0 12 光标返回0 0 0 0 0 0 0 0 1 *3 置输入模式0 0 0 0 0 0 0 1 I/D S4 显示开/关控制0 0 0 0 0 0 1 D C B5 光标或字符移位0 0 0 0 0 1 S/C R/L * *D3=1移字符D3=0移光标D2=1右移D2=0左移6 功能设置0 0 0 0 1 DL N F * *DL=1总线8位DL=0总线4位N=0显单行N=1显双行F=0 5X7点阵F=1 5X10点阵7 置字符发生器地址0 0 0 1 -字符发生存贮器地址(6位)-8 置数据存贮器地址0 0 1 --显示数据存贮器地址(7位)---9 读忙标志或地址0 1 BF ----计数器地址(7位)---------10 写CGRAM或DDRAM 1 0 --------要写的数据内容(8位------11 读CGRAM或DDRAM 1 1 --------读出的数据内容(8位)-----*/// 51单片机对lcd1602一些基础程序/* 基本操作时序:写指令输入:RS=0,RW=0,E=下降沿脉冲,DB0~DB7=指令码输出:无写数据输入:RS=1,RW=0,E=下降沿脉冲,DB0~DB7=数据输出:无读状态输入:RS=0,RW=1,E=1 输出:DB0~DB7=状态字读数据输入:RS=1,RW=1,E=1 输出:DB0~DB7=数据/*//*lcd_1602指令:指令位D7 D6 D5 D4 D3 D2 D1 D0功能设置0 0 1 DL N F * *DL=1总线8位DL=0总线4位N=0显单行N=1显双行F=0 5X7点阵F=1 5X10点阵lcd_1602指令汇总0x28 设置16*2显示,5*7点阵,4位数据接口0x38 设置16*2显示,5*7点阵,8位数据接口0x01 清屏,光标复位到地址00H位置0x02 光标归原点,DDRAM中内容不变,地址计数器AC=0;(此时地址为0x80)0x0F 开显示,显示光标,光标闪烁0x0e 开显示,显示光标,光标不闪烁0x0c 开显示,不显示光标0x08 只开显示0x06 地址加一,当写入数据的时候光标右移设定显示屏或光标移动方向指令0x18 字符全部左移一格,但光标不动0x1c 字符全部右移一格,但光标不动0x10 光标左移1格,且AC值减10x14 光标右移1格,且AC值加1*/#include <intrins.h>#define dataport P1sbit RS=P2^ 6;sbit RW=P2^5;sbit EN=P2^4;void waitfor() //检测忙信号函数{dataport=0xff;RS=0;RW=1; //选择指令寄存器读操作RS=0指令RS=1数据; RW=0写RW=1读EN=1; //使能操作while(dataport&0x80); //如果最高位是1 表示1602正忙原地踏步忙完后芯片会将高位拉低EN=0;}void writedata(unsigned char dataw) //写数据到LCD1602{waitfor(); //测忙RS=1;RW=0; //选择数据寄存器写操作RS=0指令RS=1数据; RW=0写RW=1读dataport=dataw; //将数据送到数据口EN=1;EN=0; //使能下降沿脉冲}void writecmd(unsigned char cmd) //写命令到LCD1602{waitfor(); //测忙RS=0;RW=0; //选择指令寄存器写操作dataport=cmd; //将数据送到数据口EN=1;EN=0; //使能下降沿脉冲}void init(void) // 初始化函数{writecmd(0x38); //功能设定8位数据传输双行显示设置工作方式:0x28=4位总线字符两行显示,0x38=8位总线字符两行显示writecmd(0x0c); //显示器开关writecmd(0x01); //清屏writecmd(0x06); //字符进入模式每进入一个字符光标向右移动一格原有字符不动}void location(unsigned char x,unsigned char y) //坐标函数{unsigned char temp;temp=x&0x0f; //只要x数据的后四位if(y){temp=temp|0x40;} //第一行为0 第二行为1 如果y=1则地址加0x40temp|=0x80; //DDRAM地址的命令DB7为一writecmd(temp);}void DisplayOneChar(unsigned char x,unsigned char y,unsigned char dataw) //显示一个字符函数{location(x,y);writedata(dataw);}void displaylistchar(unsigned char x,unsigned char y,unsigned char *p) //显示字符串{while(*p) //当一个字符型数组读完时*P指的为零{displayonechar(x,y,*(p++));x++;}}void WriteCgram(unsigned char address,unsigned char *p) //写CGRAM的数据{unsigned char i=8;writecmd(address); //CGRAM里的地址初始值0x40 每次加0x80while(i--){writedata(*p);p++;}}void DisplayOneChar(unsigned char x,unsigned char y,unsigned char address,unsigned char *p) //显示一个自定义字符{unsigned char i=8;writecmd(address); //CGRAM里的地址初始值0x40 每次加0x08while(i--){writedata(*p);p++;}location(x,y); //设定要显示的位置writedata((address&=0x3f)/0x08); //要从CGRAM中读出数据在1602上显示搞了半天发现CGRAM里的地址} //和DDRAM里的地址有上面的转换关系void displynumber(unsigned char x,unsigned char y,unsigned long num) //显示一个整数{unsigned int number[8];int k,gh;for(k=0;;k++){*(number+k)=(unsigned int)(num%10);//强制类型转换num=num/10;if(num==0)break;}for(gh=k;gh>=0;gh--){displyonechar(x,y,(*(number+gh)+48));x++;}}//字型码uchar code nian[]={0x08,0x0f,0x12,0x0f,0x0a,0x1f,0x02,0x02};// "年"uchar code yue[]={0x0f,0x09,0x0f,0x09,0x0f,0x09,0x0b,0x11};// "月"uchar code ri[]={0x1f,0x11,0x11,0x1f,0x11,0x11,0x11,0x1f};// "日"//显示汉字displyonecharacter(0,0,0x40,nian);displyonecharacter(1,0,0x80,yue);displyonecharacter(1,0,0xc0,ri);。
LCD1602显示屏的驱动设置及例程一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。
我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚。
如图1所示:图1再来一张它的背面的,如图2所示:引脚号符号引脚说明引脚号符号引脚说明1 VSS 电源地9 D2 数据端口2 VDD 电源正极10 D3 数据端口3 VO 偏压信号11 D4 数据端口4 RS 命令/数据12 D5 数据端口5 RW 读/写13 D6 数据端口6 E 使能14 D7 数据端口7 D0 数据端口15 A 背光正极图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所示。
8 D1 数据端口16 K 背光负极图4二.基本操作LCD1602的基本操作分为四种:1. 读状态:输入RS=0,RW=1,E=高脉冲。
输出:D0—D7为状态字。
2. 读数据:输入RS=1,RW=1,E=高脉冲。
LCD1602常用驱动子程序(汇编语言)
文章发表于:2007-11-19 10:35
最近找到了LCD1602的驱动程序,经本人整理把常用的驱动子程序现上传给大家,希望能对大家有用。
此程序以EDN的51实验板为基础,数据口为P0,控制口为P1。
程序共有9段,START为主程序,INSE为中断服务子程序,INIT为LCD显示模式设置子程序,QLCD为清屏子程序,WIR为写指令子程序,WDR为写数据子程序,CKLCD为查LCD空闲子程序,STS00为延时子程序,PWDR为批量写数据子程序。
程序如下:
RS BIT P1.0
RW BIT P1.1
E BIT P1.2
ORG 0000H
AJMP START
ORG 000BH
AJMP INSE
ORG 0100H ;程序地址
START: MOV TMOD,#00H ;设置计时/计数模式
MOV TL0,#00H ;#00H-->计时0低位
MOV TH0,#00H ;#00H-->计时0高位
SETB EA ;开中断
SETB ET0 ;中断使能
SETB TR0 ;计时0开绐
MOV 50H,#32H ;#32H-->50H
MOV SP,#60H ;#60h-->SP 地址指针
ACALL INIT ;调 INIT 子程序 ( LCD 模式设置) ACALL QLCD ;调清屏子程序
MOV A,#80H ;#80H-->A (设LCD地址第一行第一列)
ACALL WIR ;调写IR子程序
MOV DPTR,#L1 ;#L1-->DPTR
ACALL PWDR ;调批量写DR子程序
MOV A,#0C0H ;#0C0H-->A (设LCD地址第二行第一列) ACALL WIR ;调写 IR 子程序
MOV DPTR,#L2 ;#L2-->DPTR
ACALL PWDR ;调批量写DR子程序
LOOP: AJMP LOOP ;转LOOP
INSE: MOV TL0,#00H ;#00H-->计时0低位
MOV TH0,#00H ;#00H-->计时0高位
DJNZ 50H,INSE0 ;50H-1 不等于0转INSE0
MOV 50H,#32H ;#32H-->50H
INSE0: RETI
; ;中断返回
INIT: MOV A,#38H ;#38H-->A (使用8Bits汇流排,显示2行5*7字符) LCALL WIR ;调写IR子程序
MOV A,#0EH ;#0EH-->A (显示开,光标开,光标闪烁)
LCALL WIR ;调写IR子程序
MOV A,#06H ;#06H-->A (字符不动,光标自动右移一格) LCALL WIR ;调写IR子程序
RET ;返回
CKLCD: PUSH Acc ;Acc进栈
CK00: CLR RS ;RS 清 0
SETB RW ;RW 置 1
CLR E ;E 清 0
SETB E ;E 置 1
MOV A,P0 ;P0-->A
CLR E ;E 清 0
JB Acc.7,CK00 ;Acc.7=1 转 CK00
POP Acc ;Acc 出栈
ACALL STS00 ;调延时子程序 STS00
RET ;返回
WIR: ACALL CKLCD ;调查空闲子程序
CLR E ;E 清 0
CLR RS ;RS 清 0
CLR RW ;RW 清 0
SETB E ;E 置 1
MOV P0,A ;A-->P0
CLR E ;E 清 0
RET ;返回
WDR: ACALL CKLCD ;调查空闲子程序
CLR E ;E 清 0
SETB RS ;RS 置 1
CLR RW ;RW 清 0
SETB E ;E 置 1
MOV P0,A ;A-->P0
CLR E ;E 清 0
RET ;返回
STS00: MOV 52H,#05H ;#05H-->52H
STS001: MOV 51H,#0F8H ;#0F8H-->51H
DJNZ 51H,$ ;51H-1不等于0转再-1
DJNZ 52H,STS001 ;51H-1不等于0转STS001
RET ;返回
QLCD: MOV A,#01H ;#01H-->A
ACALL WIR ;调写IR子程序
RET ;返回
PWDR: PUSH Acc ;Acc进栈
PWDR1: CLR A ;A 清 0
MOVC A,@A+DPTR ;A+DPTR-->A
JZ PEND ;A=0 转 PEND
ACALL WDR ;调写DR子程序
INC DPTR ;DPTR+1
AJMP PWDR1 ;转 PWDR1
PEND: POP Acc ;Acc 出栈
RET ;返回
L1: DB 20H,4EH,61H,74H,69H,65H,62H,20H,45H,6CH
,65H,63H,74H,72H,6FH,6EH,00H
L2: DB 7EH,6EH,61H,74H,69H,65H,6DH,40H,32H,31H,63H
,6EH,2EH,63H,6FH,6DH,00H
END
此程序已在仿真与EDN-51实验板上通过,只要把L1与L2的数据改动一下,就能在LCD上显示不同的字符。