文档视界 最新最全的文档下载
当前位置:文档视界 › 基于52单片机控制的1602液晶电子时钟显示程序(精心整理)

基于52单片机控制的1602液晶电子时钟显示程序(精心整理)

基于52单片机控制的1602液晶电子时钟显示程序(精心整理)
基于52单片机控制的1602液晶电子时钟显示程序(精心整理)

基于52单片机控制的1602液晶电子时钟显示程序

关于利用52单片机制作1602液晶电子时钟显示的程序,网上也有很多资料,不过个人感觉还是挺乱的。曾经我也是一名初学者,看过很多别人的资料,查找过很多书籍,一个个程序的摸索,经常被弄得头昏脑涨,深受其苦。今天,我自己精心的整理了一份“基于52单片机控制的1602液晶电子时钟显示程序”的资料,程序每个点几乎都有注释,适合初学者学习,供有兴趣的朋友参考。也算作为自己一直以来在网上搜索那么多资料而给大家的一点点回报吧。

这程序简单易懂,也有一些可改善的地方,比如写命令和写数据的函数可以合并等等。大家可根据自己的爱好进行修改,多动手多尝试,相信你很快就能学会。

值得注意的是,1,此程序是利用52单片机控制,如果你的是51单片机,需要改动一下头文件#include 的。2,关于引脚,大家需要根据实际情况定义具体的引脚,不同的学习板,或者你自己焊接的板子,引脚都可能不一样。3,本程序的日期是固定的,自己可以编写函数进行年月日显示。

由于本作者水平有限,错误疏漏之处在所难免,欢迎读者指正。

#include

#define uchar unsigned char

#define uint unsigned int

sbit lcden=P3^4; //1602使能信号

sbit lcdrs=P3^5; //1602命令(0)/数据(1)选择端

sbit wr=P3^6; //1602读写选择端,一般为低电平(0)

sbit key1=P3^7; //定义功能按键,可根据实际情况改变

sbit key2=P2^0; //数字增加按键,也可根据实际情况改变

sbit dula=P2^6; //关闭实验板上数码管的段选,这两句可根据实际情况注释掉sbit wela=P2^7; //关闭实验板上数码管的段选

uchar temp,num,shi,fen,miao;

uchar code tabe[]="2013-07-20"; //固定日期,可扩展为动态

void delay(uint z) //延时1ms程序

{

uint i,j;

for(i=z;i>0;i--)

for(j=110;j>0;j--);

}

void write_com(uchar com) //写命令

{

lcdrs=0; //rs为低电平写命令

P0=com;

delay(5);

lcden=1; //高脉冲使能

delay(5);

lcden=0;

}

void write_data(uchar dat) //写数据

{

lcdrs=1; //rs为高电平写数据

P0=dat;

delay(5);

lcden=1;

delay(5);

lcden=0;

}

void init() //初始化

{

EA=1; //开总中断

ET1=1; //开定时器1中断

TMOD=0x10; //设置TMOD参数

TH1=(65536-50000)/256; //给寄存器装初值

TL1=(65536-50000)%256;

TR1=1; //开启定时器1

num=0;

shi=0;

fen=0;

miao=0;

lcden=0;

dula=0;

wela=0;

wr=0; //写,低电平有效

write_com(0x38); //设置16*2显示,5*7点阵,8位数据接口

write_com(0x0C); //开显示,这里上下四句话需参考厂家提供的1602参数设置write_com(0x06); //写一个字符后地址指针加1,且光标加1,写一个字符时,整屏不动

write_com(0x01); //显示清屏,数据指针清0

}

void d1602(uchar add,uchar date) //给1602发送地址与数据

{

uchar date2,date1; //拆分个位与十位

date2=date/10;

date1=date%10;

write_com(0x80+0x40+add); //写指令,地址

write_data(date2+0x30);delay(5); //写数据,十位

write_data(date1+0x30);delay(5); //写数据,个位

}

void key() //按键函数

{

if(key1==0)

{

delay(5); //去抖延时

if(key1==0)

{

num++; //功能键按下次数

while(!key1); //松手判断

if(num==1) //第一次按下

{

TR1=0; //关定时器1,时钟暂停

write_com(0x8b+0x40); //地址写到显示秒位置

write_com(0x0f); //控制显示光标,光标闪烁

}

if(num==2) //第二次按下

{

write_com(0x88+0x40); //地址写到显示分位置

}

if(num==3) //第三次按下

{

write_com(0x85+0x40); //地址写到显示时位置

}

if(num==4) //第四次按下

{

num=0;

write_com(0x0c); //开显示,不显示光标,光标也不闪烁

TR1=1; //开启定时器1,时钟继续运行}

}

}

if(num!=0) //当有功能按键按下,才进入下面操作

{

if(key2==0) //增加按键按下,增加时或分或秒

{

delay(10); //去抖

if(key2==0)

{

while(!key2); //松手判断

if(num==1) //当功能键按下的次数是一次

{

miao++;

if(miao==60)

miao=0;

d1602(0x0a,miao); //改变一次,给1602送一次数据

write_com(0x10); //因为上面操作一次,光标加1,

} //这里是光标左移,保证闪烁位置不变

if(num==2)

{

fen++;

if(fen==60)

fen=0;

d1602(0x07,fen);

write_com(0x10);

}

if(num==3)

{

shi++;

if(shi==24)

shi=0;

d1602(0x04,shi);

write_com(0x10);

}

}

}

}

if(num==0) //当功能键没用被按下

{

d1602(0x04,shi); //一直送‘时’数据到相应位置

d1602(0x07,fen); //一直送‘分’数据到相应位置

d1602(0x0a,miao); //一直送‘秒’数据到相应位置}

}

void main() //主函数

{

uchar ctr;

init();

write_com(0x83); //第一行首地址

for(ctr=0;ctr<10;ctr++) //固定不变的日期显示,1602的第一行

{

write_data(tabe[ctr]);

delay(5);

}

write_com(0x86+0x40); //具体地址,写数据‘:’

write_data(':');delay(5);

write_com(0x89+0x40);

write_data(':');delay(5);

while(1)

{

key(); //不断的扫描按键

}

}

void timer() interrupt 3 //中断

{

TH1=(65536-50000)/256; //重装初值

TL1=(65536-50000)%256;

temp++; //累加计数,每次计数为50ms if(temp==20) //20次为1s

{

temp=0; //清零,一定别忘记

miao++; //秒

if(miao==60)

{

miao=0;

fen++; //分

if(fen==60)

{

fen=0;

shi++; //时

if(shi==24)

{

shi=0;

}

}

}

}

}

lcd1602按键显示程序

#include<> #include<> //包含_nop_()函数定义的头文件 typedef unsigned int uint ; typedef unsigned char uchar ; sbit RS=P2^0; //寄存器选择位,将RS位定义为引脚 sbit RW=P2^1; //读写选择位,将RW位定义为引脚 sbit E=P2^2; //使能信号位,将E位定义为引脚 sbit BF=P0^7; //忙碌标志位,,将BF位定义为引脚 " uchar keyscan(); void delay1ms(); void delay(unsigned char n); unsigned char BusyTest(void); void WriteInstruction (unsigned char dictate); void WriteAddress(unsigned char x); … void WriteData(unsigned char y); void LcdInitiate(void); void delay1ms() { unsigned char i,j; for(i=0;i<10;i++) for(j=0;j<33;j++); } ! void delay(unsigned char n) { unsigned char i; for(i=0;i

LCD1602液晶显示器

实验11:1602液晶显示屏显示(字符型液晶显示器) 字符型液晶显示器用于数字、字母、符号并可显示少量自定义符号。这类液晶显示器通常 有16根接口线,下表是这16根线的定义。 字符型液晶接口说明 编号符号引脚说明编号符号引脚说明 1 Vss 电源地 9 D 2 数据线2 2 Vdd 电源正 10 D 3 数据线3 3 VL 液晶显示偏压信号 11 D 4 数据线4 4 RS 数据/命令选择端 12 D 5 数据线5 5 R/W 读/ 写选择端 13 D 6 数据线6 6 E 使能信号 14 D 7 数据线7 7 D0 数据线0 15 BLA 背光源正极 8 D1 数据线1 16 BLK 背光源负极(本学习板配的 内部已经接地) 下图是字符型液晶显示器与单片机的接线图。这用了P0口的8根线作为液晶显示器的数据 线,用P20、P21、P22做为3根控制线。

字符型液晶显示器与单片机的接线图 字符型液晶显示器的使用,字符型液晶显示器一般采用HD44780芯片做为控制器的。 1.字符型液晶显示器的驱动程序 这个驱动程序适用于1602型字符液晶显示器, 1) 初始化液晶显示器命令(RSTLCD) 设置控制器的工作模式,在程序开始时调用。 参数:无。 2) 清屏命令(CLRLCD) 清除屏幕显示的所有内容 参数:无 3) 光标控制命令(SETCUR) 用来控制光标是否显示及是否闪烁 参数:1个,用于设定显示器的开关、光标的开关及是否闪烁。 4) 写字符命令(WRITECHAR) 在指定位置(行和列)显示指定的字符。

参数:共有3个,即行值、列值及待显示字符,分别存放在XPOS、YPOS和A中。其中行值与列值均从0开始计数,A中可直接写入字符的符号,编译程序自动转化为该字符的ASCII 值。 5) 字符串命令(WRITESTRING) 在指定位置显示指定的一串字符。 参数:共有3个,即行值、列值和R0指向待显示字符串的内存首地址,字符串须以0结尾。如果字符串的长度超过了从该列开始可显示的最多字符数,则其后字符被截断,并不在下 行显示出来。 以下是驱动源程序 ;************************************************** ;连线图: ; DB0---DPROT.0 DB4---DPROT.4 RS-------------P2.0 ; DB1---DPROT.1 DB5---DPROT.5 RW-------------P2.1 ; DB2---DPROT.2 DB6---DPROT.6 E--------------P2.2 ; DB3---DPROT.3 DB7---DPROT.7 VLCD接1K电阻到GND* ;系统晶振为11.0592 ;************************************************** RS BIT P2.0 RW BIT P2.1 E BIT P2.2 DPORT EQU P0 XPOS EQU R1 ;列方向地址指针 YPOS EQU R2 ;行方向地址指针 CUR EQU R3 ;设定光标参数 NoDisp EQU 0 ;无显示 NoCur EQU 1 ;有显示无光标 CurNoFlash EQU 2 ;有光标但不闪烁 CurFlash EQU 3 ;有光标且闪烁

LCD1602汇编显示程序

;1602显示ABC LCD_RS EQU P2.5 LCD_RW EQU P2.6 LCD_EN EQU P2.7 LCD_DATA EQU P3 ;----------------- ORG0000H JMP START ORG0030H ;----------------- LCD: CALL LCD_INIT MOV A, #80H CALL LCD_WCMD MOV A, #'A' CALL LCD_WDATA MOV A, #'B' CALL LCD_WDATA MOV A, #'C' CALL LCD_WDATA AJMP$ ;---------------- DELAY5MS: MOV R6, #10 DL1:DJNZ R7, $ DJNZ R6, DL1 RET ;---------------- LCD_INIT: CALL DELAY5MS MOV A, #38H CALL LCD_WCMD CALL DELAY5MS

CALL DELAY5MS MOV A, #06H CALL LCD_WCMD MOV A, #01H CALL LCD_WCMD MOV A, #0CH CALL LCD_WCMD RET ;===================================== LCD_WCMD: CALL CHECKBUSY CLR LCD_RS JMP W_LCD ;---------------- LCD_WDATA: CALL CHECKBUSY SETB LCD_RS W_LCD: CLR LCD_RW MOV LCD_DATA, A SETB LCD_EN NOP CLR LCD_EN RET ;---------------- CHECKBUSY: PUSH ACC MOV LCD_DATA, #255 CLR LCD_RS SETB LCD_RW BUSYLOOP: SETB LCD_EN NOP MOV A, LCD_DATA CLR LCD_EN JB ACC.7, BUSYLOOP POP ACC RET

lcd1602显示程序

lcd1602显示程序 液晶显示简介①液晶显示原理 液晶显示的原理是利用液晶的物理特性,通过电压对其显示区域进行控制,有电就有显示,这样即可以显示出图形。液晶显示器具有厚度薄、适用于大规模集成电路直接驱动、易于实现全彩色显示的特点,目前已经被广泛应用在便携式电脑、数字摄像机、PDA移动通信工具等众多领域。 ②液晶显示器的分类 液晶显示的分类方法有很多种,通常可按其显示方式分为段式、字符式、点阵式等。除了黑白显示外,液晶显示器还有多灰度有彩色显示等。如果根据驱动方式来分,可以分为静态驱动(StaTIc)、单纯矩阵驱动(Simple Matrix)和主动矩阵驱动(AcTIve Matrix)三种。 ③液晶显示器各种图形的显示原理: 线段的显示 点阵图形式液晶由MN个显示单元组成,假设LCD显示屏有64行,每行有128列,每8列对应1字节的8位,即每行由16字节,共168=128个点组成,屏上6416个显示单元与显示RAM区1024字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。例如屏的第一行的亮暗由RAM区的000H00FH的16字节的内容决定,当(000H)=FFH时,则屏幕的左上角显示一条短亮线,长度为8个点;当(3FFH)=FFH时,则屏幕的右下角显示一条短亮线;当(000H)=FFH,(001H)=00H,(002H)=00H,(00EH)=00H,(00FH)=00H时,则在屏幕的顶部显示一条由8段亮线和8条暗线组成的虚线。这就是LCD显示的基本原理。 字符的显示 用LCD显示一个字符时比较复杂,因为一个字符由68或88点阵组成,既要找到和显示屏幕上某几个位置对应的显示RAM区的8字节,还要使每字节的不同位为1,其它的为0,为1的点亮,为0的不亮。这样一来就组成某个字符。但由于内带字符发生器的控制器来说,显示字符就比较简单了,可以让控制器工作在文本方式,根据在LCD上开始显

1602字符型液晶显示器

1602字符型液晶显示器 在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、LED数码管、液晶显示器。发光管和LED数码管比较常用,软硬件都比较简单,在前面章节已经介绍过,在此不作介绍,本章重点介绍字符型液晶显示器的应用。在日常生活中,我们对液晶显示器并不陌生。液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。 1602字符型LCD简介: 字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。下面以长沙太阳人电子有限公司的1602字符型液晶显示器为例,介绍其用法。一般1602字符型液晶显示器实物如图10-53: 图10-53 1602字符型液晶显示器实物图 1602LCD的基本参数及引脚功能: 1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图10-54所示:

图10-55 读操作时序 图10-56 写操作时序 1602LCD的RAM地址映射及标准字库表: 液晶显示模块是一个慢显示器件,所以在执行每条指令之前一定要确认模块的忙标志为低电平,表示不忙,否则此指令失效。要显示字符时要先输入显示字符地址,也就是告诉模块在哪里显示字符,图10-57是1602的内部显示地址。

图10-57 1602LCD内部显示地址 例如第二行第一个字符的地址是40H,那么是否直接写入40H就可以将光标定位在第二行第一个字符的位置呢?这样不行,因为写入显示地址时要求最高位D7恒定为高电平1所以实际写入的数据应该是01000000B(40H)+10000000B(80H)=11000000B(C0H)。 在对液晶模块的初始化中要先设置其显示模式,在液晶模块显示字符时光标是自动右移的,无需人工干预。每次输入指令前都要判断液晶模块是否处于忙的状态。 1602液晶模块内部的字符发生存储器(CGROM)已经存储了160个不同的点阵字符图形,如图10-58所示,这些字符有:阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,比如大写的英文字母“A”的代码是01000001B (41H),显示时模块把地址41H中的点阵字符图形显示出来,我们就能看到字母“A” 图10-58 字符代码与图形对应图

LCD1602液晶显示器设计

LCD1602液晶显示课程设计 第一章绪论 1.1课题背景 当今时候是一个信息化的时代,信息的重要性不言而喻的,获取手段显得尤其重要。人们所接受的信息有70%来自于人的视觉,无论用何种方式获取的信息最终需要有某种显示方式来表示。在当代显示技术中,主流的有LED显示屏和LCD液晶显示,而在这些显示技术中,尤其以液晶显示器LCD(Liquid crystal display)为代表的平板显示器发展最快,应用最广。LCD是典型的发光器件,它一材料科学为基础,综合利用了精密机械,光电及计算机技术,并正在微机械,微光学,纤维光学等前沿领域研究基础上,向高集成化,智能化方向发展。 液晶显示技术发展迅猛,市场预测表明,液晶显示平均年销售呈增长10%~13%,不久的将来有可能取代CRT,成为电子信息产品的主要显示器件,另外,液晶显示器对空间电磁辐射的干扰不敏感,且在紧凑的仪器空间不需要专门的屏蔽保护,因而课大大简化仪器的结构和制造成本,在各种便携式仪器,仪表将会越来越广泛的应用。特别是在电池供电的单片机产品中,液晶显示更是必选的显示器件。 1.2课题设计目标 本设计是基于AT89C51芯片单片机为主控芯片,结合1602液晶显示模板等外围电路,通过软件程序,来实现液晶显示英文字母。本次设计的目的在于利用单片机和IIC技术来显示英文字母。 1.3课程设计的主要工作 (1)对系统的各个模块的各个功能进行深入分析和研究,在对课题所采用的方案进行可行详细的研究后设计具体功能电路。 (2)熟悉所选芯片的功能并完成具体电路设计。

(3)对系统的最终指标进行测试,针对系统的不足,进行分析并提出一些改正方法。 1.4 设计要求 (1)运行IIC总线技术。 (2)循环显示字母。 第二章硬件设计 2.1 LCD1602简介 2.1.1 LCD1602引脚功能 LCD1602引脚如图2.1所示 图2.1 LCD1602引脚图 引脚图的功能如表2—1所示

已经采用过-LCD1602显示字符和(RAM)数字的汇编程序

单片机LCD1602显示字符和数字的汇编程序(无聊原创) 1,单片机和LCD1602的连线,和程序结果显示如下图: 2,LCD第一行显示字符XIAORENGUANG第二行显示RAM中40H到46H中的数字。程序如下: ORG 0000H AJMP MAIN RS EQU P2.4 RW EQU P2.5 E EQU P2.6 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 DD3: MOV p0,#0C0H;第二行的位置 CALL ENABLE CALL WRITE1;到TABLE2 取码 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

手机拨号矩阵键盘控制lcd1602

手机拨号矩阵键盘控制lcd1602 #include #include #define uint unsigned int #define uchar unsigned char sbit RS=P2^0; sbit RW=P2^1; sbit EP=P2^2; uchar num[12]={"0123456789*#"}; void delay(uint ms) { uint i,j; for(i=ms;i>0;i--) for(j=115;j>0;j--); } uchar busy_check()//忙碌 { uchar result; RS=0; RW=1; EP=1; _nop_(); _nop_(); _nop_(); result=P0&0x80;

EP=0; return result; } void cmd(uchar x)//指令{ while(busy_check()); RS=0; RW=0; EP=0; _nop_(); _nop_(); _nop_(); P0=x; _nop_(); _nop_(); _nop_(); EP=1; _nop_(); _nop_(); _nop_(); EP=0; } void date(uchar y)//数据{ while(busy_check()); RS=1; RW=0; EP=0; _nop_(); _nop_(); _nop_(); P0=y; _nop_(); _nop_(); _nop_(); EP=1; _nop_(); _nop_(); _nop_(); EP=0; } void init()//初始化 {

51单片机控制1602LCD显示程序

LCD显示电路 #include sbit RS=P3^7; //寄存器选择位,将RS位定义为P2.0引脚 sbit RW=P3^6; //读写选择位,将RW位定义为P2.1引脚 sbit E=P2^7; //使能信号位,将E位定义为P2.2引脚 sbit BF=P0^7; //忙碌标志位,将BF位定义为P0.7引脚 #define Lcd_Data P0 #include #include //包含_nop_()函数定义的头文件 unsigned char code string1[ ]= {0x77,0x75,0x20,0x79,0x61,0x6E,0x67,0x20,0x79,0x61,0x6E,0x67,0x20,0x20,0x20,0x20}; //第一行显示的字符 void Lcd_delay1ms() // 函数功能:延时1ms //注:不同单片机不同晶振需要对此函数进行修改 { unsigned char i,j; for(i=0;i<90;i++) for(j=0;j<33;j++); } void Lcd_delay(unsigned int n) // 函数功能:延时若干毫秒,入口参数:n { unsigned int i; for(i=0;i

1602液晶显示计算器电路图及程序

#include #include #include #include unsigned char code Error[]={"error"}; unsigned char code Systemerror[]={"system error"}; unsigned char code Lcd[]={"lcd calculate"}; char str[16]; sbit RS=P2^0; sbit RW=P2^1; sbit E=P2^2; sbit BF=P0^7; /*********************** 函数功能:延时1ms ***********************/ void delay1ms() { unsigned char i,j; for (i=0;i<10;i++) for (j=0;j<33;j++) ; } /************************ 函数功能:延时n毫秒 入口参数:n ************************/ void delaynms(unsigned char n) { unsigned char i; for (i=0;i

LCD1602按键盘输入显示

名称:LCD1602 论坛:https://www.docsj.com/doc/0b10183095.html, 编写:shifang 日期:2009.5 修改:无 内容:通过矩阵键盘输入,依次显示0-F16中字符 引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include sbit RS = P2^4; //定义端口 sbit RW = P2^5; sbit EN = P2^6; #define RS_CLR RS=0 #define RS_SET RS=1 #define RW_CLR RW=0 #define RW_SET RW=1 #define EN_CLR EN=0 #define EN_SET EN=1 #define DataPort P0 #define KeyPort P1 unsigned char code dofly_code[]={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};//转换成液晶显示的字符 /*------------------------------------------------ uS延时函数,含有输入参数unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编,大致延时 长度如下T=tx2+5 uS ------------------------------------------------*/ void DelayUs2x(unsigned char t) { while(--t); } /*------------------------------------------------ mS延时函数,含有输入参数unsigned char t,无返回值 unsigned char 是定义无符号字符变量,其值的范围是 0~255 这里使用晶振12M,精确延时请使用汇编

51单片机驱动1602液晶汇编语言程序

51单片机驱动1602液晶汇编语言程序 LCMRS EQU P2.4LCMRW EQU P2.5LCMEN EQU P2.6LCMDATA EQU P0ORG 0000HLJMP MAINORG 0030HMAIN:MOV SP,#60HLCALL LCMSETLCALL LCMCLRMOV A,#80HLCALL LCMWR0MOV DPTR,#TAB0LCALL LCMWR2MOV A,#0C0HLCALL LCMWR0MOV DPTR,#TAB1LCALL LCMWR2SJMP $TAB0: DB “I AM YUAN MING”,00HTAB1:DB “NICE TO MEET YOU”,00HLCMLAY: ;读忙程序,用于判断d7 是否为0PUSH ACCLOOP:CLR LCMENCLR LCMRSSETB LCMRWSETB LCMENMOV A,LCMDATACLR LCMENJB ACC.7,LOOPPOP ACCLCALL DELAYRETLCMWR0: ;写入指令LCALL LCMLAYCLR LCMENCLR LCMRSCLR LCMRWSETB LCMENMOV LCMDATA,ACLR LCMENRETLCMWR1: ;写入数据LCALL LCMLAYCLR LCMENSETB LCMRSCLR LCMRWSETB LCMENMOV LCMDATA,ACLR LCMENRETLCMWR2: 写入字符串(字符串属于数据)PUSH ACCLOOP1:CLR AMOVC A,@A+DPTRJZ LOOP2LCALL LCMWR1INC DPTRLJMP LOOP1LOOP2:POP ACCRETLCMSET: ;程序初始化MOV A,#38HLCALL LCMWR0MOV A,#08HLCALL LCMWR0MOV A,#01HLCALL LCMWR0MOV A,#06HLCALL LCMWR0MOV A,#0CHLCALL LCMWR0RETLCMCLR: ;清屏MOV A,#01HLCALL LCMWR0RETDELAY:MOV R6,#5 ;2.7MS 延时子程 序(作用尚不知)D1: MOV R7,#248DJNZ R7,$DJNZ R6,D1RETENDtips:感谢大家的阅读,本文由我司收集整编。仅供参阅!

单片机课程设计--1602LCD显示电话拨号键盘按键

单片机课程设计--1602LCD显示电话拨号键盘按键琼州学院电子信息工程学院 课程设计报告 课程名称: 单片机课程设计 设计题目:1602LCD显示电话拨号键盘按键 专业: 通信工程 班级: 2010级1班 学生姓名: *** 学号: 起止日期: 2013年4月,2013年6月 指导教师: 指导教师评语: 最终成绩: 指导教师签名: 年月日成项目权重成绩 绩1、设计过程中的学习态度 0.2 评2、课程设计的质量及答辩 0.5 定 3、设计报告书规范程度 0.3 4、总成绩 目录 1.设计目的 ..................................................... 2 2.设计要求 ..................................................... 2 3.设计方案 .. (2) 3.1单片机最小系统 (2) 3.2输入按键系统 (3) 3.3 1602LCD显示系统 (3)

3.4设计原理图 ............................................... 6 4. 分析与编程 (7) 4.1系统流程图 (7) 4.2 LCD显示程序流程图 (7) 4.3 设计程序 ................................................ 8 5.仿真 ........................................................ 14 6.在实现过程中遇到的问题及排除措施 ............................ 15 7.设计心得体会 ................................................ 16 参考文 献 (16) 1602LCD显示电话拨号键盘按键 摘要:本设计以89C51单片机为核心,设计1602LCD显示电话拨号键盘按键, 对按键输入系统,LCD1602的引脚功能、控制命令、读写时序进行了分析。在keil 中进行编程,在proteus软件中进行了仿真。 关键字:单片机;1602LCD显示屏;键盘系统 1 1.设计目的 单片机原理与应用课程设计是单片机原理与应用专业课程的实践性教学环节,通过该教学环节,要求达到以下目的: (1)培养学生工程设计能力和综合分析问题、解决问题的能力,能根据工程需求,利用Proteus环境等构建原理图,利用Keil等环境编写调试单片机功能程序,最终构建工程的硬件平台和软件平台,达到预定功能,实现单片机具体应用; (2)熟悉在Proteus环境中的ISIS模块原理图绘制,掌握仿真的基本方法; (3)掌握Keil C编程及C51编程语言和汇编语言开发; (4)掌握单片机片内资源编程,能熟练应用相关片内资源合理配置相关寄存器;

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/R M063蓝白可调电阻。见图3。 图3 4. RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当R S为高电平时,选择数据。 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):

LM1602液晶显示程序

#include #define uchar unsigned char #define uint unsigned int unsigned char code tab1[16]=" Now time is: "; unsigned char tab2[16]=" 00:00:00 "; uchar second = 30; uchar minite = 11; uchar hour = 15; sbit RS = P2^5; sbit RW = P2^6; sbit E = P2^7; void delay() { int i,j; for(i=0; i<=100; i++) for(j=0; j<=20; j++); } void Write_Command(uchar command) { P0 = command; RS = 0; RW = 0; E = 1; delay(); E = 0; } void Write_Data(uchar Data) { P0 = Data; RS = 1; RW = 0; E = 1; delay(); E = 0; } void LCD_Init(void)//初始化 { Write_Command(0x01); Write_Command(0x38);

Write_Command(0x0c); Write_Command(0x06); } void LCD_Printfc(uchar hang,uchar lie,uchar sign) { uchar a; if(hang == 1) a = 0x80; if(hang == 2) a = 0xc0; a = a + lie; Write_Command(a); Write_Data(sign); } void LCD_Display(uchar *tab1) { uchar i; Write_Command(0x80); for(i=0; i<16; i++) { Write_Data(tab1[i]); delay(); } /* Write_Command(0xc0); for(i=0; i<16; i++) { Write_Data(tab2[i]); delay(); }*/ } void time_view(void) { if(second == 60) { minite ++; second = 0; } if(minite == 60) { hour++; minite = 0; } if(hour == 24)

单片机设计 按键顺序控制加减计数(1602 液晶显示) 程序

#include #include #define uchar unsigned char #define uint unsigned int #define LCD_IO P2 sbit KK1 = P3^2; //按键输入; sbit KK2 = P3^3; //按键输入; sbit LCD_RS = P3^5; sbit LCD_RW = P3^6; sbit LCD_EN = P3^7; uchar code LCD_line1[] = " The Counter"; int idata mydata=0; /************************************************************** * 名称: Delay_1ms() * 功能: 延时子程序,延时时间为1ms * x * 输入: x (延时一毫秒的个数) * 输出: 无 ***************************************************************/ void Delay_1ms(uint x) { uchar i, j; for(i = 0; i < x; i++) for(j = 0; j <= 148; j++); } /************************************************************** * 名称: lcd_bz( ) * 功能: 测试忙碌子程序 * 输入: 无 * 输出: result ***************************************************************/ bit lcd_bz() { bit result; LCD_RS = 0; LCD_RW = 0; LCD_EN = 0; _nop_(); _nop_(); _nop_(); _nop_(); result=(bit)(P3&0x80); LCD_EN = 0; return result; }

LCD1602液晶显示实验实验报告及程序

实验三 LCD1602液晶显示实验 姓名专业学号成绩 实验目的 掌握Keil C51软件与proteus软件联合仿真调试的方法; 掌握LCD1602液晶模块显示西文的原理及使用方法; 掌握用8位数据模式驱动LCM1602液晶的C语言编程方法; 掌握用LCM1602液晶模块显示数字的C语言编程方法。 实验仪器与设备 1.微机一台C51集成开发环境仿真软件 实验内容 用Proteus设计一LCD1602液晶显示接口电路。要求利用P0口接LCD1602液晶的数据端,~做LCD1602液晶的控制信号输入端。~口扩展3个功能键K1~K3。参考电路见后面。 编写程序,实现字符的静态和动态显示。显示字符为 第一行:“1.姓名全拼”,第二行:“2.专业全拼+学号”。 编写程序,利用功能键实现字符的垂直滚动和水平滚动等效果显示。显示字符为: “1.姓名全拼 2.专业全拼+学号EXP8 DISPLAY ” 主程序静态显示“My information!” 实验原理 液晶显示的原理:采用的LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。当LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。 LCD1602采用标准的14引脚(无背光)或16引脚(带背光)接口,各引脚接口说明如表:

编号符号引脚说明编号符号引脚说明 1VSS电源地9D2数据 2VDD电源正极10D3数据 3VL液晶显示偏压11D4数据 4RS数据/命令选择12D5数据 5R/W读/写选择13D6数据 6E使能信号14D7数据 7D0数据15BLA背光源正极 8D1数据16BLK背光源负极1602液晶模块内部的控制器共有11条控制指令,如表所示: 芯片时序表: 4.1602LCD的一般初始化(复位)过程

LCD1602-51单片机汇编程序.

1602汇编程序, 51单片机汇编程序,仅需修改引脚定义即可。晶振大小 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 ALL_FLAG.7 ;1602读忙标志位 LCD_DAT EQU 30H ;1602数据命令字 DELAYED EQU 31H ; 延时字 /***************************************** 1602读命令函数,高位存至 LCD_LAG中 *****************************************/ LCD_R_DATA: MOV LCD_DATA,#0FFH LCD_BUSY: CLR LCD_RS

SETB L CD_RW NOP SETB L CD_EN NOP MOV Acc,LCD_DATA MOV C,Acc.7 MOV LCD_FLAG,C CLR LCD_EN NOP JB LCD_FLAG,LCD_BUSY RET /***************************************** 1602写数据函数,数据存在 LCD_DAT *****************************************/ LCD_W_DATA: LCALL LCD_R_DATA SETB L CD_RS CLR LCD_RW NOP

LCD1602字符测试显示程序与仿真

#include "reg51.h" #include "intrins.h" #define uchar unsigned char #define uint unsigned int uchar code table1 []={" WELCOME "}; //欢迎显示,包括空格在内<=16 uchar code table2 []={"Name: "};//欢迎显示,包括空格在内<=16 //************管脚定义************************ sbit lcd_rs = P3^0; //液晶数据命令选择端 sbit lcd_en = P3^1; //液晶使能 //************参数定义************************ uint tvalue;//温度值 uchar tflag;//温度正负标志 uchar data disdata[5]; //************子函数定义************************ void delay(uchar z); //delay延时子程序 void init_lcd(); //LCD1602初始化函数 void write_com(uchar com); //LCD1602写指令函数 void write_data(uchar date); //LCD1602写数据函数 void lcd1602_display(uchar *q,uchar *p);//LCD1602显示函数 void welcome_1(); //LCD1602显示欢迎函数1 //************主函数************************ void main() { welcome_1(); delay(200); while(1); } //************delay延时子程序************************ void delay(uchar z)

51单片机的电子钟以及lcd1602显示器的工作原理

51单片机的电子钟以及lcd1602显示器的工作原理 基于51单片机的电子钟C语言程序 #include #include #define uchar unsigned char #define uint unsigned int /*七段共阴管显示定义*/ uchar code dispcode[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0xBF,0x86,0xCB,0xCF,0xEF,0xED,0xFD,0x87,0xFF, 0xDF}; /*定义并初始化变量*/ uchar seconde=0; uchar minite=0; uchar hour=12; uchar mstcnt=0; sbit P1_0=P1^0; // second 调整定义 sbit P1_1=P1^1; //minite调整定义 sbit P1_2=P1^2; //hour调整定义 /*函数声明*/ void delay(uchar k ); //延时子程序 void time_pro( ); //时间处理子程序 void display( ); //显示子程序 void keyscan( ); //键盘扫描子程序 /*****************************/ /*延时子程序*/ /****************************/ void delay (uchar k) { uchar j; while((k--)!=0) { for(j=0;j<125;j++) {;} } } /**************************/ /*时间处理子程序*/ /**************************/ void time_pro( void) {

相关文档