单片机LCD1602显示字符和数字的汇编程序
LCD1602-51单片机汇编程序.
1602汇编程序,刃单片机汇编程序,仅需修改引脚定义即可。
晶振大小12M,程序测试完全正确。
内部包含写数据、写命令(包括读忙和不读忙、初始化等子函数。
调用时先给LCD_DAT赋值,给出需要写入的数据或命令,然后调用。
;端口引脚定义区LCD_RS BIT P2.4 ;1602数据命令选择端口LCD_RW BIT P2.5 ;1602 读写选择端口LCD_EN BIT P2.6 ;1602 使能端口LCD_DATA EQU P0 ;1602 数据端口;变量声明区ALL_FLAG EQU 20H ;标志位LCD_FLAG EQU AL「FLAG.7 ;1602 读忙标志位LCD_DAT EQU 30H ;1602 数据命令字DELAYED EQU 31H 涎时字广★★★****★★★★★★★*★*★★**★*★★★*★*★★★★★*★*★*★1602读命令函数,高位存至LCD_LAG中★★★★★★★★★★★★★★★★★★★★★if******************* /LCD_R_DATA:MOV LCD_DATA,#OFFHSETB L CD RWNOPSETB L CD_ENNOPMOV Acc丄CD_DATAMOV C,Acc.7MOV LCD_FLAG,CCLR LCD_ENNOPJB LCD_FLAG ,L CD_BUSYRET/★****★***★*★***********************★*★*★*1602写数据函数,数据存在LCD_DAT★ if*************************************** /LCD_W_DATA:LCALLLCD_R_DATASETB L CD_RSNOPMOV LCD_DATA丄CD_DATSETB L CD_ENNOPCLR LCD_ENRET/* 1602LCD_DAT,检测忙信号LCD_W_CMD:LCALLLCD_R_DATACLR LCD_RSCLR LCD_RWNOPMOV LCD_DATA, LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET /* 1602 与命令函数,命令存在LCD_DAT,不检测忙信号LCD CMD: 才***********才********************才才*****7写命令函数,命令存F在CLR LCD RWNOPMOV LCD_DATA, LCD_DAT SETB L CD_ENNOPCLR LCD_ENRET/***************************************** 4 QCC初始化函数★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★★*/ LCD INIT:MOV DELAYED,#30LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD_CMDMOV DELAYED,#10LCALL DELAY_MSMOV LCD_DAT,#38HLCALL LCD CMDMOV DELAYED,#®LCALL DELAY_MSMOV LCD_DAT,#038HLCALL LCD_W_CMDMOV LCD_DAT,#08HLCALL LCD_W_CMDMOV LCD_DAT,#01HLCALL LCD_W_CMDMOV LCD_DAT,#06HLCALL LCD_W_CMDMOV LCD_DAT,#OCHLCALL LCD_W_CMDRET****************************************延时函数,延时时间为DELAYEDP.5毫秒0-100毫秒的延时***************************************** /DELAY_MS:MOV R7QELAYEDD1: MOV R6,#0F8HD2: DJNZ R6,D2DJNZ R7,D1RET广****************************************延时函数,延时时间为DELAYED*2微秒0-500微秒的延时***************************************** /DELAY_US:MOV R乙ADU1:DJNZ R7,DU1RET。
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显⽰英⽂和数字LCD1602显⽰英⽂和数字; 创建变量RS、RW、E,提⾼程序的可读性RS BIT P3.3 ; RS=P3.3RW BIT P3.4 ; RW=P3.4E BIT P3.5 ; E=P3.5ORG 00H ; 起始地址00H; 主程序段,进⾏显⽰前的设置,调⽤显⽰⼦程序START:MOV P1, #01H ; 清屏CALL LOAD ; 调⽤命令装载⼦程序MOV P1, #38H ; 显⽰设定,显⽰两⾏CALL LOADMOV P1, #0FH ; 打开显⽰和光标,光标闪烁CALL LOADMOV P1, #06H ; 光标右移CALL LOADMOV P1, #80H ; 光标回到第1⾏的开头CALL LOADMOV DPTR, #TABLE1 ; DPTR指向TABLE_1的表头CALL DISPLAY ; 调⽤液晶屏显⽰⼦程序MOV P1, #0C0H ; 光标回到第2⾏的开头CALL LOADMOV DPTR, #TABLE2 ; DPTR指向TABLE_2的表头CALL DISPLAY ; 调⽤液晶屏显⽰⼦程序JMP $ ; 停机; 命令装载⼦程序,对液晶屏下命令LOAD:CLR RS ; (RS)=0,DB0~DB7上的信号作为命令使⽤CLR RW ; (RW)=0,写数据CLR E ; (E)=0,E引脚电平由1变0,DB0~DB7数据被读⼊CALL DELAY ; 延时SETB E ; E置1,屏蔽DB0~DB7的数据RET ; 返回; 显⽰⼦程序,对液晶屏进⾏数据显⽰DISPLAY:MOV R0, #00H ; 取数据表时,⽤R0为指针REFETCH:MOV A, R0 ; (A)=(R0)MOVC A, @A+DPTR ; A中装载数据表中的数据CALL SEND_DATA ; 调⽤显⽰数据发送⼦程序INC R0 ; R0增加1CJNE A, #88H, REFETCH; 如果取到88H,表明取表结束,否则跳回REFETCH RET ; 返回; 显⽰数据发送⼦程序SEND_DATA:MOV P1, A ; 显⽰数据从P1⼝送出SETB RS ; (RS)=1, DB0~DB7上的信号作显⽰为数据使⽤CLR RW ; (RW)=0,写数据CLR E ; (E)=0,E引脚电平由1变0,DB0~DB7数据被读⼊CALL DELAY ; 延时SETB E ; E置1,屏蔽DB0~DB7的数据RET ; 返回DELAY:MOV R1, #10 ; 延时⼦程序D1:MOV R2, #248DJNZ R2, $DJNZ R1, D1RETTABLE1:DB 'I MISS YOU,AND I', 88H ; 数据表——第1⾏数据TABLE2:DB 'LOVE THE WORLD!', 88H ; 数据表——第2⾏数据END ; 结束。
LCD1602显示的程序
WriteOneChar(0xbe);//发温度转换命令
readtemp[0]=ReadOneChar();//读取相应的温度值低位
readtemp[1]=ReadOneChar();//读取相应的温度值高位
sflag[h]=0;
delayy(20);
}
//18B20读一个字节
ReadOneChar(void)
{
unsigned char i="0";
unsigned char dat = 0;
for (i=8;i>0;i--)
{
DQ = 0; // 给脉冲信号
dat>>=1;
DQ = 1; // 给脉冲信号
}
}
readtemp[1]=readtemp[1]<<4;//将高低温度和为一个字节,本方法避免了*0。0625,很简单,很准确
readtemp[1]=readtemp[1] & 0x70;
xx="readtemp"[0];
{
displaybuf[k+1]= fentemp%10;
fentemp= fentemp/10;
}
displaybuf[k]= fentemp;
k+=2;
xx="xx">>4;
xx="xx"& 0x0f;
readtemp[1]=readtemp[1] | xx;
temp[h]=readtemp[1];
fentempபைடு நூலகம்"temp"[h];//拆分两路温度值送入显示单元
LCD1602显示~~C程序
1、关于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的电气参数,在允许的条件下,直接使用电阻弱上拉也可以。
2、硬件连接1602液晶可以使用4位或8位通信模式,通信可以是双向的或单向的,双向通信主要是为了读取LCD忙标志和AC地址寄存器和DDRAM和CGRAM中的值,一般用处不大,因为1602不支持点阵绘图功能。
在连接时,注意4位通信方式下,LCD只使用DB7~DB4,一般情况下会使用MCU 某端口的高4位或低4位与之连接,注意写驱动时在必要的情况下对端口的其它几位要保护,防止破坏其数据;当然如果没有使用其它4位时则不必要保护(奇怪,不使用其它4位干嘛用4位通信方式嘛?)。
还要注意的是,如果需要双向通信,则必须选择既能做输入又能做输出的IO口,特别是对于RS、RW和E这三条控制线,若能选择支持位寻址的IO口则可以方便编程。
3、底层驱动问题通用1602液晶的时序如图:(1)、写时序(2)、读时序总的说来,按照这个时序图来编写驱动程序是不会出什么问题的,只是要深刻理解时序图中各参数的涵义。
编程中要特别关注E这根控制线。
写操作的时序应该是:①、RS=0(写指令寄存器)或RS=1(写数据寄存器);②、RW=0(写操作);③、将数据写到数据线上;④、E=1;⑤、E=0 。
单片机LCD1602显示字符和数字的汇编程序
单片机LCD1602显示字符和数字的汇编程序1,单片机和LCD1602的连线,和程序结果显示如下图:2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。
程序如下:RS EQU P2.4RW EQU P2.5E EQU P2.6ORG 0000HAJMP MAINORG 0030HMAIN: 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取码?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(动态显示频率、幅度核心程序设计思想:可以利用如下程序)MOV40H,#01HMOV41H,#02HMOV42H,#03H)MOV R1,#40H;显示table中的值MOV A,R1;到table取码MOVC A,@A+DPTRMOV P0,AINC R1LJMP LOOPDELAY: PUSH ACCMOV A,R4MOV R4,#05D1: MOV R5,#0FFHDJNZ R5,$DJNZ R4,D1MOV R4,APOP ACCRETPPP: MOV 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 ",00H TAB: DB 30H, 31H, 32H, 33HDB 34H, 35H, 36H, 37HDB 38H, 39HEND。
我的51单片机之 液晶1602 的C语言和汇编编程
//三次显示模式设置,不检测忙信号
//显示模式设置,开始要求每次检测忙信号 //关闭显示 //显示清屏 // 显示光标移动设置 // 显示开及光标设置
//按指定位置显示一个字符
void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData)
#include<reg51.h>
#include<intrins.h>
#define DBPort P1 //液晶数据口
sbit RW=P0^1; //寄存器选择,高电平时选择数据寄存器、低电平时选择指令寄存器
sbit RS=P0^0; //读写信号线,高电平时进行读操作,低电平时进行写操作。
sbit E=P0^2;
void main(void) {
Delay400Ms(); Init(); //LCM 初始化 DisplayListChar(0, 1, uctech); DisplayListChar(0, 0, net); while(1); }
//第二行第一列开始 //第一行第一列开始
//写数据 void WriteData(unsigned char WD) {
ReadStatus(); //检测忙 DBPort = WD; RS = 1; RW = 0; E = 0; //可加小延时 delay(); E = 1; }
//写指令 void WriteCommand(unsigned char WC,BuysC) {
if (BuysC) ReadStatus(); DBPort = WC; RS = 0; RW = 0; E = 0; E = 1; }
LCD1602的简单显示程序
/*========================================================= 1602液晶显示的实验例子-------------------------------------------------| DB4-----P0.4 | RW-------P2.1| DB5-----P0.5 | RS-------P2.2| DB6-----P0.6 | E--------P2.0| DB7-----P0.7 |---------------------------------------------------LCD1602的简简单显示=========================================================*/ #include#include#define LCM_RW P2_1 //定义引脚#define LCM_RS P2_2#define LCM_E P2_0#define LCM_Data P0#define Busy 0x80 //用于检测LCM状态字中的Busy标识/*------------------------------------------子函数声明------------------------------------------*/void Write_Data_LCM(unsigned char WDLCM);void Write_Command_LCM(unsigned char WCLCM,BuysC);void Read_Status_LCM(void);void LCM_Init(void);void Set_xy_LCM(unsigned char x, unsigned char y);void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s);void main(void){LCM_Init(); //LCM初始化delay_nms(5);//延时片刻(可不要)while(1){Display_List_Char(0, 0, "");Display_List_Char(1, 0, "Robot-AT89S52");}}/*=====================================函数名:Read_Status_LCM()功能:忙检测函数======================================*/void Read_Status_LCM(void){unsigned char read=0;LCM_RW = 1;LCM_RS = 0;LCM_E = 1;LCM_Data = 0xff;do{read = LCM_Data;}while(read & Busy);LCM_E = 0;}/*------------------------------------------- 函数名:Write_Data_LCM ( )功能:对LCD 1602写数据--------------------------------------------*/ void Write_Data_LCM(unsigned char WDLCM){Read_Status_LCM(); //检测忙LCM_RS = 1;LCM_RW = 0;LCM_Data &= 0x0f;LCM_Data |= WDLCM&0xf0;LCM_E = 1; //若晶振速度太高可以在这后加小的延时LCM_E = 1; //延时LCM_E = 0;WDLCM = WDLCM<<4;LCM_Data &= 0x0f;LCM_Data |= WDLCM&0xf0;LCM_E = 1;LCM_E = 1; //延时LCM_E = 0;}/*-------------------------------------------函数名:Write_Command_ LCM ( )功能:对LCD 1602写指令--------------------------------------------*/void Write_Command_LCM(unsigned char WCLCM,BuysC) //BuysC为0时忽略忙检测{if (BuysC)Read_Status_LCM(); //根据需要检测忙LCM_RS = 0;LCM_RW = 0;LCM_Data &= 0x0f;LCM_Data |= WCLCM&0xf0;//传输高四位LCM_E = 1;LCM_E = 1;LCM_E = 0;WCLCM = WCLCM<<4; //传输低四位LCM_Data &= 0x0f;LCM_Data |= WCLCM&0xf0;LCM_E = 1;LCM_E = 1;LCM_E = 0;}/*-------------------------------------------函数名:LCM_Init()功能:对LCD 1602初始化--------------------------------------------*/void LCM_Init(void) //LCM初始化{LCM_Data = 0;Write_Command_LCM(0x28,0); //三次显示模式设置,不检测忙信号delay_nms(15);Write_Command_LCM(0x28,0);delay_nms(15);Write_Command_LCM(0x28,0);delay_nms(15);Write_Command_LCM(0x28,1); //显示模式设置,开始要求每次检测忙信号Write_Command_LCM(0x08,1); //关闭显示Write_Command_LCM(0x01,1); //显示清屏Write_Command_LCM(0x06,1); //显示光标移动设置Write_Command_LCM(0x0C,1); //显示开及光标设置}/*-------------------------------------------函数名:Set_xy_LCM ()功能:设定显示坐标位置--------------------------------------------*/void Set_xy_LCM(unsigned char x, unsigned char y){unsigned char address;if( x == 0 )address = 0x80+y;elseaddress = 0xc0+y;Write_Command_LCM(address,1);}/*-------------------------------------------函数名:Display_List_Char()功能:按指定位置显示一串字符--------------------------------------------*/void Display_List_Char(unsigned char x, unsigned char y, unsigned char *s){Set_xy_LCM(x,y);while(*s){LCM_Data = *s;Write_Data_LCM(*s);s++;}}datasheet搜索: 。
LCD1602原理及显示程序
在日常生活中,我们对液晶显示器并不陌生。
液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表与很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。
在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。
发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。
在单片机系统中应用晶液显示器作为输出器件有以下几个优点:显示质量高由于液晶显示器每一个点在收到信号后就一直保持那种色彩和亮度,恒定发光,而不像阴极射线管显示器(CRT)那样需要不断刷新新亮点。
因此,液晶显示器画质高且不会闪烁。
数字式接口液晶显示器都是数字式的,和单片机系统的接口更加简单可靠,操作更加方便。
体积小、重量轻液晶显示器通过显示屏上的电极控制液晶分子状态来达到显示的目的,在重量上比一样显示面积的传统显示器要轻得多。
功耗低相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动IC上,因而耗电量比其它显示器要少得多。
10.8.1 液晶显示简介①液晶显示原理液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。
液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。
②液晶显示器的分类液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。
除了黑白显示外,液晶显示器还有多灰度有彩色显示等。
如果根据驱动方式来分,可以分为静态驱动(Static)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(Active Matrix)三种。
③液晶显示器各种图形的显示原理:线段的显示点阵图形式液晶由M×N个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共16×8=128个点组成,屏上64×16个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。
LCD1602液晶显示字符_源程序
C语言源程序//******** 小波电子工作室All rights reserved******//******** 个人主页:/niejinbo **//******** 文件名:lcd_0712.c **************//******** 功能概要:LCD液晶显示字符*********** //******** MCU: STC89C52 晶振:11.0592Mhz *********** //******** 设计者:聂金波************//******** 完成日期:2008-07-12 ************//******** 当前版本:0712_1 ************//******** 改进说明:暂无************//**********头文件区************#include<reg52.h>#include<math.h>#include<absacc.h>#include<intrins.h>//*********宏定义方便使用*******#define uchar unsigned char#define uint unsigned int//*********定义变量区***********sbit dula=P2^6; //数码管段选sbit wela=P2^7; //数码管位选sbit lcden=P3^4; //LCD使能信号sbit lcdrs=P3^5; //LCD数据/命令选择信号uchar code tab_nie[]="Nie Jinbo";uchar code tab_index[]="";//*********函数声明区***********void lcd_dis(); //lcd显示函数void lcd_init(); //LCD初始化函数void write_com(uchar); //写命令函数void write_data(uchar); //写数据函数void delay(uint); //延时函数//*********主函数开始***********void main(){lcd_dis();while(1);}//*********lcd显示函数开始******void lcd_dis(){uchar n;lcd_init();write_com(1);write_com(0x80+4); //设置光标位置for(n=0;n<9;n++){write_data(tab_nie[n]);delay(2);}write_com(0x80+0x40); // 设置光标位置for(n=0;n<15;n++){write_data(tab_index[n]);delay(2);}}//*********LCD初始化函数开始****void lcd_init(){dula=0;wela=0; // 关闭数码管显示lcden=0;write_com(0x38); //设置显示模式:16X2,5X7,8位数据接口write_com(0x0f); //开显示,显示光标,光标闪烁write_com(0x06); //读写一个字符后,地址指针及光标加一,且光标加一整屏显示不移动write_com(0x80); //设置光标指针}//*********写命令函数开始*******void write_com(uchar com){lcdrs=0; //低电平写命令P0=com; //写入命令delay(3); //延时约3mslcden=1; //LCD使能端置高电平delay(5); //延时约5mslcden=0; //LCD使能端拉低电平}//*********写数据函数开始******* void write_data(uchar dat){lcdrs=1; //低电平写数据P0=dat; //写入命令delay(3); //延时约3mslcden=1; //LCD使能端置高电平delay(5); //延时约5mslcden=0; //LCD使能端拉低电平}//*********延时函数开始********* void delay(uint k){uint i,j;for(i=k;i>0;i--)for(j=110;j>0;j--);}Proteus 仿真图C语言源代码/******************************************************************************** ******摘要: LCD1602显示程序头文件,到时在主程序里包含这个头文件后,就可以直接调用里面的函数了版本: V1.0完成日期: 2008.5.5作者: ZHOUSFE******************************************************************************* ******修改日期:版本:******************************************************************************* *******/#i nclude "delay.h"#define uchar unsigned char#define uint unsigned int#define Port P0 //数据端口/*定义端口*********************************************************/sbit Rs = P1^0;sbit Rw = P1^1;sbit En = P1^2;/*定义LCD控制字*****************************************************///清屏及光标归位#define LCD_CLEAR 0x01 // 清屏#define LCD_HOMING 0x02 // 光标返回左上角//显示开关控制指令#define LCD_SCREEN_ON 0x0C //显示开#define LCD_SCREEN_OFF 0x08 //显示关#define LCD_CURSOR_ON 0x0A //显示光标#define LCD_CURSOR_OFF 0x08 //无光标#define LCD_C_FLASH_ON 0x09 //光标闪动#define LCD_C_FLASH_OFF 0x08 //光标不闪动//进入模式设置指令#define LCD_AC_UP 0x06 //新数据后光标右移#define LCD_AC_DOWN 0x04 //新数据后光标左移#define LCD_S_MOVE_ON 0x05 // 画面可平移#define LCD_S_MOVE_OFF 0x04 //画面不可平移//设定显示屏或光标移动方向指令#define LCD_C_LEFT 0x10 //光标左移1格,且AC值减1#define LCD_C_RIGHT 0x11 //光标右移1格,且AC值加1#define LCD_CHAR_LEFT 0x18 //显示器上字符全部左移一格,但光标不动#define LCD_CHAR_RIGHT 0x1C //显示器上字符全部右移一格,但光标不动uchar code number[10]={"0123456789"};/*所有函数声明*********************************************************/ void LCD_init(void);void LCD_wdata(uchar wdata);void LCD_wcommand(uchar lcd_cmd,busy_f);void LCD_gotoxy(uchar x,uchar y);void Disp_char(uchar *str);void Disp_number(unsigned int num);uchar Rstatus(void);uchar LCD_rdata(void);/*********************************************************************函数名称:LCD_wcommand()功能描述:LCD写指令入口参数:uchar lcd_cmd:命令字,uchar busy_f:忙检测标志位返回值:无*********************************************************************/void LCD_wcommand(uchar lcd_cmd,busy_f){if (busy_f) Rstatus(); //不忙才执行下个程序Port = lcd_cmd;Rs = 0;Rw = 0;En = 0;En = 0;En = 1;}/********************************************************************* 函数名称:LCD_wdata()功能描述:LCD写数据入口参数:uchar wdata:所写数据返回值:无*********************************************************************/ void LCD_wdata(uchar wdata){Port = wdata;Rs = 1;Rw = 0;En = 0; //若晶振速度太高可以在这后加小的延时En = 0; //延时En = 1;}/********************************************************************* 函数名称: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);}/*********************************************************************函数名称:Disp_char()功能描述:显示字符或字符串入口参数:字符或字符串返回值:无**********************************************************************/void Disp_char(uchar *str){while(*str!='\0'){LCD_wdata(*str);str++;}}/*********************************************************************函数名称:Disp_number()功能描述:显示四数字入口参数:num:显示的数字n:数字位数返回值:无************************************************************************/ void Disp_number(uint num,uchar n){uchar a; //个位uchar b; //十位uchar c; //百位uchar d; //千位// uchar e; //万位switch(n){case 1:LCD_wdata(num);break;case 2:b=num/10;a=num%10;LCD_wdata(number[a]);LCD_wdata(number[b]);break;case 3:c=num/100;b=num%100/10;a=num%10;LCD_wdata(number[a]);LCD_wdata(number[b]);LCD_wdata(number[c]);break;case 4:d=num/1000;c=num%1000/100;b=num%1000%100/10;a=num%10;LCD_wdata(number[a]);LCD_wdata(number[b]);LCD_wdata(number[c]);LCD_wdata(number[d]);break;}。
lcd1602程序 汇编版本
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字符液晶滚动演示程序专业班级:姓名:学号:时间:指导教师:2012年 05月 23日LCD1602字符液晶滚动演示程序摘要:本设计以单片机作为LCD液晶显示系统控制器为主线,基于单片机89C51,采用的液晶显示器是LCD1602,主要用来显示字母、数字、符号,滚屏、左右移动以及实时控制功能。
同时也对部分芯片和外围电路进行了介绍和设计,并附以系统结构框图加以说明,着重介绍了本系统应用的各硬件接口技术和各个接口模块的功能及工作过程。
本设计还介绍了显示原理、硬件电路和软件部分的设计原理。
关键词:1602液晶显示器 89C51单片机并行通信1 引言:液晶显示器(LCD)具有功耗低、体积小、重量轻、超薄等许多其它显示器无法相比的优点。
近几年来被广泛用于单片机控制的智能仪器、仪表和低功耗电子产品中。
液晶显示器分为字符型LCD显示模块和点阵型LCD显示模块。
字符型LCD是一种用5×7点阵图形来显示字符的液晶显示器。
点阵型液晶可显示用户自定义的任意符号和图形,并可卷动显示,它作为便携式单片机系统人机交互界面的重要组成部分被广泛应用于实时检测和显示的仪器仪表中。
支持汉字显示的点阵型液晶在现代单片机应用系统中是一种十分常用的显示设备,汉字BP机、手机上的显示屏就是点阵型LCD。
点阵型LCD是现代单片机应用系统中最常用的人机交互界面之利用单片机控制液晶显示系统的原理,完成单片机液晶显示系统的设计,我希望能够触类旁通,灵活应用其他型号的液晶显示控制器。
将来如果有机会从事这方面的工作,要运用的液晶显示控制器不一定是KS0108,但这次毕业设计中学到的东西为此打下了良好的基础,相信自己能做好这方面的工作。
2 总体设计方案2.1 设计思路2.1.1 本设计主要是通过控制89C51单片同的引脚来控制LCD1602显示给定的符号、字母、数字,以及控制显示内容的垂直移动和水平移动。
LCD1602汇编显示程序
RSBIT P 2.0;定义RS为P2.0RWBIT P2.1;定义RW为P2.1EBIT P2.2;定义E为P2.2ORG 00HSJMP STARTORG0030HSTART:LCALL LCDINITMAIN:MOV A,#80H;显示开及光标设置LCALL BUSYLCALL WRTCMOVR2,#04HMOVDPTR,#TAB1LCALL DELAYMOV A,#0C0H;显示开及光标设置LCALL BUSYLCALL WRTCMOVR2,#04HMOVDPTR,#TAB2LCALL DELAYLCALL WRTDLCALL DELAY1LCALL DELAY1MOV A,#01H;清屏LCALL BUSYLCALL WRTCMOV A,#80H;显示开及光标设置LCALL BUSYLCALL WRTCMOVR2,#0FHMOVDPTR,#TAB4LCALL DELAYLCALL WRTDLCALL DELAY1MOV A,#01H;清屏LCALL BUSYLCALL WRTCLJMP MAIN;***************初始化***************** LCDINIT:LCALLDELAY;xx15msLCALLDELAYLCALLDELAYMOVA,#38H;显示模式设置(8位数据线,16*2 5*7点阵) LCALL WRTCLCALL DELAY;xx5msMOVA,#38HLCALL WRTCLCALL DELAY;xx5msMOVA,#38HLCALL WRTCLCALL DELAY;xx5msMOVA,#38HLCALL BUSYMOVA,#08HLCALL BUSYLCALL WRTCMOV A,#01H;清屏LCALL BUSYLCALL WRTCMOVA,#06H;显示光标移动设置LCALL BUSYLCALL WRTCMOV A,#0CH;示开关控制,显示开,无光标,不闪烁。
基于51单片机的液晶LCD1602显示程序源代码(带LCD1602液晶接口电路))
液晶LCD1602显示字符和数字程序源代码/***********************液晶LCD1602测试程序源代码*************************单片机型号:STC15W4K56S4,内部晶振:22.1184M。
功能:液晶LCD1602显示功能测试。
操作说明:液晶LCD1602显示字符和倒计时。
**************************************************************************/#include "stc15.h" //包含头文件stc15.h#include <intrins.h> //包含头文件intrins.h#define Busy 0x80 //LCD忙sbit LCD_D0 = P0^0; //LCD_D0对应P0.0sbit LCD_D1 = P0^1; //LCD_D1对应P0.1sbit LCD_D2 = P0^2; //LCD_D2对应P0.2sbit LCD_D3 = P0^3; //LCD_D3对应P0.3sbit LCD_D4 = P0^4; //LCD_D4对应P0.4sbit LCD_D5 = P0^5; //LCD_D5对应P0.5sbit LCD_D6 = P0^6; //LCD_D6对应P0.6sbit LCD_D7 = P0^7; //LCD_D7对应P0.7sbit LCD_RS = P1^0; //LCD_RS对应P1.0sbit LCD_RW = P1^1; //LCD_RW对应P1.1sbit LCD_EN = P3^4; //LCD_EN对应P3.4void delay(unsigned int t); //delay延时函数void delay_us(unsigned int t); //delay_us延时函数void delay_ms(unsigned int t); //delay_ms延时函数void Delay5Ms(void); //5Ms延时函数void GPIO_1602_Configuration(void); //LCD1602液晶IO口初始化void WriteDataLCD(unsigned char WDLCD); //LCD写数据函数void WriteCommandLCD(unsigned char WCLCD,BuysC); //LCD写命令函数unsigned char ReadDataLCD(void); //LCD读数据函数unsigned char ReadStatusLCD(void); //LCD读状态函数void LCDInit(void); //LCD初始化void DisplayOneChar(unsigned char X, unsigned char Y, unsigned char DData);//LCD显示一个字符void DisplayListChar(unsigned char X, unsigned char Y, unsigned char code *DData);//LCD显示一个字符串unsigned char code welcome[] = {"Hello My Friends"};//液晶LCD1602显示Hello My Friendsunsigned char code countdown[] = {"CountDown: S"};//液晶LCD1602显示CountDown: Svoid delay(unsigned int t) //delay延时函数{while(t--);}void delay_us(unsigned int t) //delay_us延时函数{unsigned char i;while(t--){i=3;while(i--)delay(1);}}void delay_ms(unsigned int t) //delay_ms延时函数{while(t--){delay_us(t);}}void Delay5Ms(void) //5ms延时函数{unsigned int TempCyc = 3552;while(TempCyc--);}void GPIO_1602_Configuration(void) //LCD1602液晶IO口初始化{P0M1 = P3M1&0x00;P0M0 = P3M0&0x00;P1M1 = P3M1&0xfc;P1M0 = P3M0&0xfc;P3M1 = P4M1&0xef;P3M0 = P4M0&0xef;}unsigned char ReadStatusLCD(void) //测试LCD忙碌状态{LCD_D7 = 1; //LCD的D7置1LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 1; //LCD管脚RW设置成高电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 0; //LCD管脚E设置成低电平LCD_EN = 1; //LCD管脚E设置成高电平while(LCD_D7); //检测忙信号return(Busy); //表示当前忙}void WriteCommandLCD(unsigned char WCLCD,BuysC) //BuysC为0时忽略忙检测{if(BuysC) ReadStatusLCD(); //根据需要检测忙LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 0; //LCD管脚RS设置成低电平LCD_RW = 0; //LCD管脚RW设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时P0 = WCLCD; //将数据送入P0口,即写入指令或地址_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void WriteDataLCD(unsigned char WDLCD) //LCD写数据函数{ReadStatusLCD(); //读取LCD状态LCD_EN = 0; //LCD管脚E设置成低电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_RS = 1; //LCD管脚RS设置成高电平LCD_RW = 0; //LCD管脚RW设置成低电平P0 = WDLCD;//将数据送入P0口,即将数据写入液晶模块_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 1; //E置高电平_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时_nop_(); //空操作,延时LCD_EN = 0;//当E由高电平跳变成低电平时,液晶模块开始执行命令}void LCDInit(void) //LCD初始化{WriteCommandLCD(0x38,0); //三次显示模式设置,不检测忙信号Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);Delay5Ms();WriteCommandLCD(0x38,0);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不能大于1 if (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不能大于1 while (DData[ListLength]>=0x20) //若到达字串尾则退出{if (X <= 0xF) //X坐标应小于0xF{DisplayOneChar(X, Y, DData[ListLength]); //显示单个字符ListLength++;X++;}}}void main(void){GPIO_1602_Configuration(); //LCD1602液晶IO口初始化delay_ms(10); //延时LCDInit(); //LCD1602初始化delay_ms(10); //延时DisplayListChar(0,0,welcome); //LCD1602显示Hello My Friends delay_ms(10); //延时DisplayListChar(0,1,countdown); //LCD1602显示CountDown: S delay_ms(10); //延时DisplayOneChar(14,1,0x39); //LCD1602显示9delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x38); //LCD1602显示8delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x37); //LCD1602显示7delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x36); //LCD1602显示6delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x35); //LCD1602显示5delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x34); //LCD1602显示4delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x33); //LCD1602显示3delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x32); //LCD1602显示2delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x31); //LCD1602显示1delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时DisplayOneChar(14,1,0x30); //LCD1602显示0delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200);delay_ms(200); //延时while(1){;}}程序源代码是编译通过并在电路板上测试过参考液晶LCD1602接口电路图该程序的实际运行效果。
LCD1602液晶显示实验实验报告及程序
实验三 LCD1602液晶显示实验姓名专业学号成绩一、实验目的1.掌握Keil C51软件与proteus软件联合仿真调试的方法;2.掌握LCD1602液晶模块显示西文的原理及使用方法;3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;4.掌握用LCM1602液晶模块显示数字的C语言编程方法。
二、实验仪器与设备1.微机一台 C51集成开发环境仿真软件三、实验内容1.用Proteus设计一LCD1602液晶显示接口电路。
要求利用P0口接LCD1602液晶的数据端,~做LCD1602液晶的控制信号输入端。
~口扩展3个功能键K1~K3。
参考电路见后面。
2.编写程序,实现字符的静态和动态显示。
显示字符为第一行:“1.姓名全拼”,第二行:“2.专业全拼+学号”。
3.编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。
显示字符为:“1.姓名全拼 2.专业全拼+学号 EXP8 DISPLAY ”主程序静态显示“My information!”四、实验原理液晶显示的原理:采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。
当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。
1.LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各引脚接口说明如表:2.1602液晶模块内部的控制器共有11条控制指令,如表所示:3.芯片时序表:4.1602LCD的一般初始化(复位)过程(1) 延时15ms。
(2) 写指令38H(不检测忙信号)。
(3) 延时5ms。
(4) 写指令38H(不检测忙信号)。
(5) 延时5ms。
(整理)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、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机LCD1602显示字符和数字的汇编程序
1,单片机和LCD1602的连线,和程序结果显示如下图:
2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。
程序如下:
RS EQU P2.4
RW EQU P2.5
E EQU P2.6
ORG 0000H
AJMP MAIN
ORG 0030H
MAIN: MOV SP,#60H
MOV 40H,#01H
MOV 41H,#02H
MOV 42H,#03H
MOV 43H,#04H
MOV 44H,#05H
MOV 45H,#06H
MOV 46H,#07H
ACALL DD1 ;DD1是LCD初始化
MOV DPTR,#TABLE1
ACALL DD2;DD2是LCD第一行显示TABLE1
ACALL PPP ;PPP是LCD第二行显示RAM中40H到46H中的数据SJMP $
DD1: MOV p0,#01H ;清屏
CALL ENABLE
MOV p0,#38H ;显示功能
CALL ENABLE
MOV p0,#0FH ;显示开关控制
CALL ENABLE
MOV p0,#06H ;显示光标右移加1
CALL ENABLE
RET
DD2: MOV p0,#80H;第一行的开始位置
cALL ENABLE
CALL WRITE1;到TABLE1取码?
RET
ENABLE: CLR RS ;送命令
CLR RW
CLR E
CALL DELAY
SETB E
RET
WRITE1: MOV R1,#00H ;显示table中的值
A1: MOV A,R1;到table取码
MOVC A,@A+DPTR
call wRITE2 ;显示到lcd
INC R1
CJNE A,#00H,A1 ;是否到00h
RET
WRITE2:MOV p0,A ;显示
SETB RS
CLR RW
CLR E
CALL DELAY
SETB E
RET
(动态显示频率、幅度核心程序设计思想:可以利用如下程序)MOV40H,#01H
MOV41H,#02H
MOV42H,#03H)
MOV R1,#40H;显示table中的值
MOV A,R1;到table取码
MOVC A,@A+DPTR
MOV P0,A
INC R1
LJMP LOOP
DELAY: PUSH ACC
MOV A,R4
MOV R4,#05
D1: MOV R5,#0FFH
DJNZ R5,$
DJNZ R4,D1
MOV R4,A
POP ACC
RET
PPP: MOV p0,#0C0H;第二行的位置
CALL ENABLE
MOV DPTR,#TAB;显示
CALL WRITE3;到TABLE2 取码
RET
WRITE3: MOV R1,#40H ;显示table中的值MOV R7,#07H
A2: MOV A,@R1;到table取码
MOVC A,@A+DPTR
call wRITE2 ;显示到lcd
INC R1
DJNZ R7,A2 ;是否到00h
RET
table1: db"XIAORENGUANG ",00H TAB: DB 30H, 31H, 32H, 33H
DB 34H, 35H, 36H, 37H
DB 38H, 39H
END。