LCD1602常用驱动子程序(汇编语言)

合集下载

LCD1602汇编程序

LCD1602汇编程序

;******************************************* ********************* ;本程序用来驱动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。

LCD1602的驱动程序的代码编写

LCD1602的驱动程序的代码编写
#define LCD_WRITE_COM 0
sbit RS = P2_;
sbit RW = P2_;
sbit E = P2_;
unsigned char flag = 1;
unsigned char shi = 23, fen = 59, miao = 50;
void lcd1602_write(unsigned char byte, unsigned char flag)
lcd1602_write(0x80,LCD_WRITE_COM);
lcd1602_write((temp / 16) + 0x30,LCD_WRITE_DATA);
lcd1602_write((temp % 16) + 0x37,LCD_WRITE_DATA);
}
void main()
{
time0_init();
{
EA = 1;
TMOD |= 0x01;
TH0 = (65536 - 20000) / 255;
TL0 = (65536 - 20000) % 255;
ET0 = 1;
TR0 = 1;
}
void TIme0_isr() interrupt 1
{
staTIc unsigned char i = 0;
lcd_init();
lcd_dis_hex();
lcd_dis_char(0,2,time:);
while(1)
{
lcd_diaplay_time();
}
}
#include reg52.h
#include ./delay/delay.h
#define LCDPORT P0

LCD1602常用驱动子程序(汇编语言)

LCD1602常用驱动子程序(汇编语言)

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上显示不同的字符。

LCD1602驱动程序

LCD1602驱动程序

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。

LCD1602驱动程序

LCD1602驱动程序

//=============LCD1602驱动程序================#include "systemInit.h"#define uchar unsigned char#define uint unsigned int#define LCD_PERIPH SYSCTL_PERIPH_GPIOE | SYSCTL_PERIPH_GPIOF #define LCD_PORT GPIO_PORTF_BASE#define LCD_RS_L GPIOPinWrite(GPIO_PORTE_BASE, 0x04, 0x00)#define LCD_RS_H GPIOPinWrite(GPIO_PORTE_BASE, 0x04, 0x04)//#define LCD_RW_L GPIOPinWrite(GPIO_PORTE_BASE, 0x02, 0x00)//#define LCD_RW_H GPIOPinWrite(GPIO_PORTE_BASE, 0x02, 0x02)#define LCD_E_L GPIOPinWrite(GPIO_PORTE_BASE, 0x01, 0x00)#define LCD_E_H GPIOPinWrite(GPIO_PORTE_BASE, 0x01, 0x01)#define LCD_DB_H GPIOPinWrite(LCD_PORT, 0xf0, num&0xf0)#define LCD_DB_L GPIOPinWrite(LCD_PORT, 0xf0, (num&0x0f)<<4)void delay_nms(uint z)//毫秒级延时函数{uint i,j;for(i=0;i<z;i++)for(j=0;j<120;j++);}void write_num(uchar num) //写数据线命令(四线模式数据要分两次写){LCD_DB_H;LCD_E_H;LCD_E_L;delay_nms(50);//等待执行完毕。

lcd1602 C语言驱动

lcd1602 C语言驱动

/*LCD1602驱动程序*//*程序用法:1、按行显示:display(行号,数据指针)2、定位显示:displayUser(行号,列号,字符/字符串)3、动态显示:Ddisplay(行号、列号、字符/字符串)4、闪烁显示:Fldisplay(行号、列号、字符/字符串)*//*声明代码(放工程中需要包含的自定义头文件中):void delay(unsigned char n);void init();void display(unsigned char a,unsigned char table[]);void write_date(uchar);void write_command(uchar);void displayUser(unsigned char hang,unsigned lie,unsigned char table[]); void Ddisplay(unsigned char hang,unsigned lie,unsigned char table[]); void Fldisplay(unsigned char hang,unsigned lie,unsigned char table[]); */#include <reg51.h>#define uchar unsigned charsbit rs=P2^4;sbit rw=P2^5;sbit e=P2^6;uchar busyc,line;void delay(uchar n){uchar x,y;for(x=n;x>0;x--)for(y=110;y>0;y--);}void busy(uchar busyc){rs=0;rw=1;e=1;delay(1);busyc=P0;e=0;}void write_command(uchar command) {busy(busyc);while(busyc); //判断LCD 是否冗忙rs=0;rw=0;e=1;P0=command;delay(10);e=0;}void write_date(uchar date){busy(busyc);while(busyc); //判断LCD 是否冗忙rs=1;rw=0;e=1;P0=date;delay(10);e=0;}void init(){e=0;write_command(0x38);delay(15);write_command(0x0c);write_command(0x06);write_command(0x01);}void display(unsigned int a,unsigned char *table){uchar i;if(a==1){write_command(0x80); //设置显示位置(第一行开头)for(i=0;i<16;i++)write_date(*(table+i)); //显示字符}if(a==2){write_command(0xc0); //设置显示位置(第二行开头)for(i=0;i<16;i++)write_date(*(table+i)); //显示字符}}void displayUser(unsigned char hang,unsigned lie,unsigned char table[])和列号//定位显示,定位行号{unsigned char add,i;if(hang==1){add=0x80+lie-1;}if(hang==2){add=0xc0+lie-1;}write_command(add);for(i=0;i<(add%15);i++)write_date(table[i]); //显示字符}void Ddisplay(unsigned char hang,unsigned lie,unsigned char table[]) //动态、定位显示,定位行号和列号{unsigned char add,i,m;if(hang==1){add=0x80+lie-1;}if(hang==2){add=0xc0+lie-1;}write_command(add);for(i=0;i<(add%15);i++){write_date(table[i]); //显示字符for(m=0;m<4;m++)delay(250);}}void Fldisplay(unsigned char hang,unsigned lie,unsigned char table[])//闪烁、定位显示,定位行号和列号{unsigned char add,i;if(hang==1){add=0x80+lie-1;}if(hang==2){add=0xc0+lie-1;}write_command(add);while(1){for(i=0;i<(add%15);i++){write_date(table[i]); //显示字符}delay(250);delay(250);delay(250);write_command(0x01); delay(250);delay(250);delay(250);}}。

LCD1602.H51单片机LCD1602显示驱动程序

LCD1602.H51单片机LCD1602显示驱动程序

LCD1602.H(51单片机LCD1602显示驱动程序)/*无敌高氯酸修改函数功能delay_ms(time) 延时time毫秒LCD_init() 初始化清空LCD屏LCD_print(x,y,str)在(x,y)坐标上显示str字符0=;0;i--)for (j=0;j<1140;j++);}/************************************************ *********************函数名称:LCD_print()功能描述:显示字符或字符串入口参数:字符或字符串返回值:无************************************************* *********************/void LCD_print(uchar x,uchar y,uchar *str){LCD_gotoxy(x,y);while(*str!='\0'){LCD_wdata(*str);str++;}}/************************************************** *******************函数名称:LCD_wcommand()功能描述:LCD写指令入口参数:uchar lcd_cmd:命令字,uchar busy_f:忙检测标志位返回值:无************************************************* ********************/void LCD_wcommand(uchar lcd_cmd,busy_f){if (busy_f) Rstatus(); //不忙才执行下个程序Port = lcd_cmd;Rw = 0;En = 0;En = 0;En = 1;}/************************************************ *********************函数名称:LCD_wdata()功能描述:LCD写数据入口参数:uchar wdata:所写数据返回值:无************************************************* ********************/void LCD_wdata(uchar wdata){Rstatus();Port = wdata;Rs = 1;Rw = 0;En = 0; //若晶振速度太高可以在这后加小的延时En = 0; //延时}/************************************************ *********************函数名称:LCD_rdata()功能描述:LCD读数据入口参数:无返回值:所读数据************************************************* ********************/uchar LCD_rdata(void){Rs = 1;Rw = 1;En = 0;En = 0;En = 1;return Port;}/************************************************ *********************函数名称:Rstatus()功能描述:LCD读忙状态入口参数:无返回值:若忙,则等待,不忙则返回Port************************************************* ********************/uchar Rstatus(void){Port = 0xFF;Rs = 0;Rw = 1;En = 0;En = 0;En = 1;while (Port & 0x80); //检测忙信号,不忙则退出等待return(Port);}/************************************************ *********************函数名称:LCD_init()功能描述:LCD初始化入口参数:无返回值:无************************************************* ********************/void LCD_init(void){Port = 0;LCD_wcommand(0x38,0); //三次显示模式设置,不检测忙信号delay_ms(3);LCD_wcommand(0x38,0);delay_ms(3);LCD_wcommand(0x38,0);delay_ms(3);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); // 显示光标移动设置LCD_wcommand(0x0C,1); // 显示开及光标设置}/************************************************ *********************函数名称:LCD_gotoxy()功能描述:定位到(x,y)位置入口参数:x为行(0~1),y为列(0~15)返回值:无************************************************* ********************/void LCD_gotoxy(uchar x, uchar y){x &= 0x1; //限制x不能大于1,y不能大于15y &= 0xF;if(!x) LCD_wcommand(0x80|y,1);else LCD_wcommand(0xC0|y,1);}。

LCD1602驱动编程(二)——驱动程序编写

LCD1602驱动编程(二)——驱动程序编写
Void LCD_DispStr( uchar x, uchar y, char *p) { if (x!=0x00&&y!=0x00) {
switch( y) {
case 1:LCD_WriteCommand(0x80+x-1);break; //第一行 case2:LCD_WriteCommand(0x80+0x40+x-1); break; //第二行
7. 初始化 void LCD_Initial( void ) { LCD_WriteCommand(0x38); //4 位总线,5*10 点阵字符 LCD_WriteCommand(0x01); //清屏 LCD_WriteCommand(0x06); //显示光标,光标右移 LCD_WriteCommand(0x0c); //开显示 }
8. 滚动字符 Void Character_move( void ) { LCD_WriteCommand(0x18); //字符左移 LCD_WriteCommand(0x1C); //字符右移 }
{
P0=0x00;
RS_SET_C; //数据总线
RW_SET_W; //操作
EN_SET_L;
_NOP( );
//tps1
EN_SET_H; //拉高使能端
while(P0&0x80); } 4. 清屏 Void LCD_Clear( void ) {
Read_busy( ); //判忙 LCD_WriteCommand(0x01) ; DelayMs(5); } 5. 显示字符串
{
Read_busy( ); //判忙
RS_SET_C; //命令总线
RW_SET_R; //写操作

lcd1602程序 汇编版本

lcd1602程序  汇编版本
MOV DAT_PORT,#38H ; 8位数据接口 5*7 点阵
LCALL WR_LCD_CMD
MOV DAT_PORT,#06H ; 光标右移,文字不移
LCALL WR_LCD_CMD
INIT_DS: CLR DS_RST
CLR DS_CLK
SETB DS_RST
MOV DS_DAT,8EH
LCALL WR_DS
MOV R2,#00H
CLR LCD_RS ;选择指令寄存器
SETB LCD_RW ;高电平,读操作
CLR LCD_E ;电平由高到低,执行命令
;=====================DS1302子程序===============================
;---------------------取DS1302数据-------------------------------
;---------------------读DS1302-----------------------------------
RD_DS: MOV R0,#SECOND
MOV R7,#7
MOV R1,#80H ;SECOND ADRESS 80H
SET1: CLR DS_RST
CLR DS_CLK
DS_ADDR EQU 30H
DS_DAT EQU 31H
SECOND EQU 32H
MINUTE EQU 33H
ORG 0000H
LJMP MAIN
ORG 0060H
;=====================初始化程序=================================

LCD1602液晶屏驱动程序

LCD1602液晶屏驱动程序

//top module:LCD_1602 module LCD_1602 ( ////////////////////Clock Input//////////////////// CLOCK_50, // 50 MHz ////////////////////LCD Module 16X2//////////////// LCD_ON, // LCD Power ON/OFF LCD_BLON, // LCD Back Light ON/OFF LCD_RW, // LCD Read/Write Select, 0 = Write, 1 = Read
PDF 文件使用 "pdfFactory" 试用版本创建
// Line 1 LCD_LINE1+0: LUT_DATA<=9'h120; LCD_LINE1+1: LUT_DATA<=9'h121; LCD_LINE1+2: LUT_DATA<=9'h122; LCD_LINE1+3: LUT_DATA<=9'h123; LCD_LINE1+4: LUT_DATA<=9'h124; LCD_LINE1+5: LUT_DATA<=9'h125; LCD_LINE1+6: LUT_DATA<=9'h126; LCD_LINE1+7: LUT_DATA<=9'h127; LCD_LINE1+8: LUT_DATA<=9'h128; LCD_LINE1+9: LUT_DATA<=9'h129; LCD_LINE1+10:LUT_DATA<=9'h12a; LCD_LINE1+11:LUT_DATA<=9'h12b; LCD_LINE1+12:LUT_DATA<=9'h12c; LCD_LINE1+13:LUT_DATA<=9'h12d; LCD_LINE1+14:LUT_DATA<=9'h12e; LCD_LINE1+15:LUT_DATA<=9'h12f; //Change Line LCD_CH_LINE: LUT_DATA<=9'h0C0; //Line 2 LCD_LINE2+0: LUT_DATA<=9'h130; LCD_LINE2+1: LUT_DATA<=9'h131; LCD_LINE2+2: LUT_DATA<=9'h132; LCD_LINE2+3: LUT_DATA<=9'h133; LCD_LINE2+4: LUT_DATA<=9'h134; LCD_LINE2+5: LUT_DATA<=9'h135; LCD_LINE2+6: LUT_DATA<=9'h136; LCD_LINE2+7: LUT_DATA<=9'h137; LCD_LINE2+8: LUT_DATA<=9'h138; LCD_LINE2+9: LUT_DATA<=9'h139; LCD_LINE2+10:LUT_DATA<=9'h13a; LCD_LINE2+11:LUT_DATA<=9'h13b; LCD_LINE2+12:LUT_DATA<=9'h13c; LCD_LINE2+13:LUT_DATA<=9'h13d; LCD_LINE2+14:LUT_DATA<=9'h13e; LCD_LINE2+15:LUT_DATA<=9'h13f; default: LUT_DATA<=9'h000; endcase end LCD_Controller u0 ( //Host Side .iDATA(mLCD_DATA), .iRS(mLCD_RS),

LCD1602 C语言驱动程序

LCD1602 C语言驱动程序
#define LINE2_HEAD 0xC0
#define LCD_DELAY_TIME 40
#define DATA_MODE 0x38
#define OPEN_SCREEN 0x0C
#define DISPLAY_ADDRESS 0x80
#define CLEARSCREEN LCD_en_command(0x01)
void delay_nms(unsigned int n);//delay function
/********************************************************************/
void main(void)
{
LCD_init();
void LCD_en_dat(unsigned char dat)
{
LCDIO=dat;
LCD1602_RS=HIGH;
LCD1602_RW=LOW;
LCD1602_EN=LOW;
LCD_delay();
LCD1602_EN=HIGH;
}
/********************************************************************/
void LCD_write_string(unsigned char X,unsigned char Y,unsigned char *s);//write lcd string function
void LCD_init(void);//lcd initize function
/********************************************************************/

(整理)LCD1602汇编程序.

(整理)LCD1602汇编程序.

(整理)LCD1602汇编程序.LCD1602汇编程序;* 描述: LCD1602 滚动显示*;* 显示方式:*;* 1、从左到右逐字显示,闪动二次,清屏。

*;* 2、再从右到左逐字显示,闪动二次,清屏。

*;* 3、周期性地重复上述显示方式。

*;************************************************************** ***** LCD_RS EQU P2.0LCD_RW EQU P2.1LCD_EN EQU P2.2;************************************************************** ***** ORG 0000HAJMP MAINORG 0030H;************************************************************** ***** MAIN:MOV SP,#60HMOV R4,#02H ;设置闪烁次数ACALL LCD_INITMAIN1:ACALL LCDSET1MOV DPTR,#CHAR1ACALL WRITE1 ;MOV A,#0C0H ;显示第二行左边第一位位置ACALL LCD_CMDMOV DPTR,#CHAR2 ;显示ACALL WRITE1ACALL DELAY4 ;延时ACALL DELAY4ACALL SHAN ;闪烁两次ACALL LCDSET2MOV DPTR,#CHAR3 ;ACALL WRITE1MOV A,#0C0H ;显示第二行右边第一位位置ACALL LCD_CMDMOV DPTR,#CHAR4 ;显示ACALL WRITE1ACALL DELAY4 ;延时ACALL DELAY4ACALL SHAN ;闪烁两次ACALL MAIN1;************************************************************** *;LCD初始化设定子程序;************************************************************** * LCD_INIT:ACALL DELAY5MS ;延时15MSACALL DELAY5MS ;等待LCD 电源稳定ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#38H ;16*2 显示,5*7 点阵,8 位数据ACALL LCD_CMD_NC ;不进行LCD 忙检测ACALL DELAY5MSMOV A,#08H ;显示关ACALL LCD_CMD ;进行LCD 忙检测MOV A,#01H ;清除屏幕ACALL LCD_CMD ;进行LCD忙检测MOV A,#06H ;移动光标ACALL LCD_CMD ;进行LCD 忙检测MOV A,#0CH ;显示开,关光标ACALL LCD_CMD ;进行LCD 忙检测RET;************************************************************** * ;显示位置与移动光标设定;************************************************************** * LCDSET1:MOV A,#01H ;清除屏幕ACALL LCD_CMDACALL DELAY5MSMOV A,#06H ;移动光标(光标加1)ACALL LCD_CMDACALL DELAY5MSMOV A,#80H ;显示第一行左边第一位位置ACALL LCD_CMDACALL DELAY5MSRETLCDSET2:MOV A,#01H ;清除屏幕ACALL LCD_CMDACALL DELAY5MSMOV A,#06H ;移动光标(光标减1)ACALL LCD_CMDACALL DELAY5MSMOV A,#80H ;显示第一行右边第一位位置ACALL LCD_CMDACALL DELAY5MSRET;************************************************************** * ;写指令数据到LCD;RS=L,RW=L,D0-D7=指令码,E=高脉冲;************************************************************** * LCD_CMD:ACALL CHECKBUSYLCD_CMD_NC:CLR LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;************************************************************** * ; 发送字符串子程序;************************************************************** * WRITE1:MOV R0,#16WRITE0:CLR AMOVC A,@A+DPTRINC DPTRACALL LCD_WDATACALL DELAY ;加延时形成滚动效果DJNZ R0,WRITE0RET;************************************************************** * ;写显示数据到LCD;RS=H,RW=L,D0-D7=数据,E=高脉冲;************************************************************** * LCD_WDATA:ACALL CHECKBUSYSETB LCD_RSCLR LCD_RWMOV P0,ASETB LCD_ENNOPNOPNOPNOPCLR LCD_ENRET;************************************************************** * ;检测LCD 控制器忙状态;读数据;RS=L,RW=H,E=H,输出:D0-D7=数据;************************************************************** * CHECKBUSY:PUSH ACCMOV P0,#0FFHCLR LCD_RSSETB LCD_RWSETB LCD_ENBUSYLOOP:NOPJB P0.7,BUSYLOOPCLR LCD_ENPOP ACCRET;************************************************************** * ;闪烁子程序;************************************************************** * SHAN:MOV A,#08H ;关闭显示ACALL LCD_CMDACALL DELAY4MOV A,#0CH ;开显示,关闭光标ACALL LCD_CMDACALL DELAY4DJNZ R4,SHANMOV R4,#02H ;设置闪烁次数RET;************************************************************** * ;延时120MS 子程序;发送字符串时使用;************************************************************** * DELAY:MOV R7,#240DL1: MOV R6,#250DL2: DJNZ R6,DL2DJNZ R7,DL1RET;************************************************************** * ;延时800MS 子程序;闪烁时使用;************************************************************** * DELAY4:MOV R0,#40DL3: MOV R1,#100DL4: MOV R2,#100DL5: DJNZ R2,DL5DJNZ R1,DL4DJNZ R0,DL3RET;************************************************************** * ;延时5MS子程序;LCD初始化使用;************************************************************** * DELAY5MS:MOV R1,#10DL6: MOV R2,#249DL7: DJNZ R2,DL7DJNZ R1,DL6RET;************************************************************** * ;延时1MS子程序;************************************************************** * DELAY1MS:MOV R6,#14H ;20DL8: MOV R7,#19H ;25DL9: DJNZ R7,DL9DJNZ R6,DL8RET;************************************************************** * CHAR1:DB "Welcome to Cras-"CHAR2:DB " yBoye WorkGroup"CHAR3:DB " QQ: 15910380 "CHAR4:DB "TEL: 139********";************************************************************** *END12864汇编程序X EQU 26H ;LCD 地址变量RS EQU P2.0RW EQU P2.1EN EQU P2.2PSB EQU P2.3RST EQU P2.5ORG 0000HJMP MAINORG 0003H ;外部中断INT0入口地址MAIN:MOV SP,#40HMOV A,#00HMOV R0,#20HLOOP0: MOV @R0,A ;20H-26H清零INC R0CJNE R0,#27H,LOOP0MOV IE,#81H ;允许总中断中断,使能INT0 外部中断MOV TCON,#01H ;触发方式为脉冲负边沿触发SETB RSTNOPSETB PSB ;8位数据,并口CALL SET_LCD ;初始化TS12864mCALL MENU1CALL MENU2CALL MENU3CALL MENU4LOOP1:MOV A,22HCJNE A,#40H,LOOP2LOOP2: CJNE A,#04H,LOOP3LOOP3: JMP LOOP1;====================================== =======; LCD 初始化设置;====================================== =======-SET_LCD:CLR ENMOV A,#34H ;34H--扩充指令操作CALL WCOMMOV A,#30H ;30H--基本指令操作CALL WCOMMOV A,#0CH ;开显示,关光标,CALL WCOMMOV A,#01H ;清除LCM 显示屏CALL WCOMRET;====================================== ============= ;在LCM 各行显示信息字符;====================================== ============= LCD_SHOW:CJNE A,#1,LINE2 ;判断是否为第一行LINE1: MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#80H ;设置LCD 的第一行地址CALL WCOM ;写入命令JMP FILLLINE2: CJNE A,#2,LINE3 ;判断是否为第三行MOV A,#090H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#090H ;设置LCD 的第三行地址CALL WCOMJMP FILLLINE3: CJNE A,#3,LINE4 ;判断是否为第三行MOV A,#088H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#088H ;设置LCD 的第三行地址CALL WCOMJMP FILLLINE4: CJNE A,#4,LINE5 ;判断是否为第三行MOV A,#098H ;设置LCD 的第三行地址CALL WCOM ;写入命令CALL CLR_LINE ;清除该行字符数据MOV A,#098H ;设置LCD 的第三行地址CALL WCOMFILL: CLR A ;填入字符MOVC A,@A+DPTR ;由消息区取出字符CJNE A,#0,LC1 ;判断是否为结束码LINE5: RETLC1: CALL WDA TA ;写入数据INC DPTR ;指针加1JMP FILL ;继续填入字符RET;====================================== =========== ;清除该行LCM 的字符;====================================== =========== CLR_LINE:MOV R0,#16CL1: MOV A,#' 'CALL WDATADJNZ R0,CL1RET;====================================== ============ ;LCM 显示工作菜单信息;====================================== ============ MENU1:MOV DPTR,#MENU1AMOV A,#1 ;在第一行显示信息CALL LCD_SHOWRETMENU1A: DB "MUC 控制GPRS模块",0MENU2:MOV DPTR,#MENU2AMOV A,#2 ;在第二行显示信息CALL LCD_SHOWRETMENU2A: DB "TEL:139********",0MENU3:MOV DPTR,#MENU3AMOV A,#3 ;在第三行显示信息CALL LCD_SHOWRETMENU3A: DB "方案设计: 龚伟",0MENU4:MOV DPTR,#MENU4AMOV A,#4 ;在第四行显示信息CALL LCD_SHOWRETMENU4A: DB "程序编写: 靳鹏",0;====================================== ======== ; 写指令使能子程序;RS=L,RW=L,D0-D7=指令码,E=高脉冲;====================================== ======== WCOM:MOV P0,ACLR RSCLR RWSETB ENCALL DELAY0CLR ENRET;====================================== ======= ;写数据使能子程序;RS=H,RW=L,D0-D7=数据,E=高脉冲;=============================================WDATA:MOV P0,ASETB RSCLR RWSETB ENCALL DELAY0CLR ENRETDELAY0: MOV R7,#250 ;延时500微秒DJNZ R7,$RET END。

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

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上显示不同的字符。

相关文档
最新文档