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

合集下载

1602资料和程序电路图-文档

1602资料和程序电路图-文档

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地电路图和程序

LCD1602地电路图和程序

实用标准文档文案大全MS基于1602字符型液晶显示器的显示系统姓名:杨越班级:电子11-1学号:110400104一、实习目的(1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。

(2)了解LCD1602的基本原理及用法。

(3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载程序。

(4)能够熟练焊接电路板。

二、实验设备与器件CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器,三、实验内容内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。

(1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。

R/W为读写选择,高电平进行读操作,低电平进行写操作。

E端为使能端,后面和时序联系在一起。

除此外,D0~D7分别为8位双向数据线。

操作时序:注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。

(即后面的读忙子程序)指令集:LCD_1602 初始化指令小结:0x38设置16*2显示,5*7点阵,8位数据接口0x01清屏0x0F开显示,显示光标,光标闪烁0x08只开显示0x0e开显示,显示光标,光标不闪烁0x0c开显示,不显示光标0x06地址加1,当写入数据的时候光标右移0x02地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM中断内容不变0x18光标和显示一起向左移动(2)飞思卡尔单片机的功能及特点:MC9S12XS128是 16 位单片机,由 16 位中央处理单元(CPU12X)、128KB 程序、Flash(P-lash)、8KB RAM、8KB 数据Flash(D-lash)组成片内存储器。

LCD1602引脚图功能详解,附原理图接线图

LCD1602引脚图功能详解,附原理图接线图

LCD1602引脚图功能详解,附原理图接线图LCD1602引脚图
1602采用标准的16脚接口,其中:
第1脚:VSS为电源地
第2脚:VCC接5V电源正极
第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。

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

第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。

第6脚:E(或EN)端为使能(enable)端,高电平(1)时读取信息,负跳变时执行指令。

第7~14脚:D0~D7为8位双向数据端。

第15~16脚:空脚或背灯电源。

15脚背光正极,16脚背光负极。

----------------------------------------------------------------------
从上图看,从左到右引脚分别为1~16.
在原理图中如何表示,见下图。

特别声明:在焊接的时候通常焊接16P的单排针母座,等焊接完后将液晶插在上面,这样如果液晶烧坏可以方便的进行更换而不需要重新焊接,并且在插反的时候在发现也能够及时的更换回来。

如果直接焊接在上面那么焊错就得重新焊接了。

1602液晶显示屏模块资料--附程序

1602液晶显示屏模块资料--附程序

1602液晶显⽰屏模块资料--附程序液晶显⽰屏模块说明⼀.功能说明:该模块可以通过单⽚机控制并⾏⼝数据16字×2⾏的字符型液晶模块的显⽰。

⼆.硬件设计:核⼼控制:Freescale MC9S12D64 单⽚机系统板执⾏部分:16字X2⾏的字符型液晶模块操作部分:通过USBDM将已写好的程序刷⼊单⽚机指⽰部分:单⽚机上的发光⼆极管电源部分:提供给电机5V的直流稳压电源硬件说明:⼀.液晶显⽰屏引脚的定义:1602采⽤标准的16脚接⼝,其中:(模块背⾯有标注)。

1脚VSS:接地;2脚Vdd:接+5V电源;3脚VO:对⽐度调整端,LCD驱动电压范围为Vdd~VO。

当VO接地时,对⽐度最强;4脚RS:寄存器选择端,RS为0时,选择命令寄存器IR;RS为1时,选择数据寄存器DR;5脚:读写控制端,为1时,选择读出;为0时,则选择写⼊;6脚Enable:使能控制端,Enable为1时,使能;Enable 为0,禁⽌;7脚~14脚D0~D7:数据总线;15脚LED+:背景光源,接+5V;16脚LED-:背景光源,接地。

1602液晶模块内部的字符发⽣存储器(CGROM)已经存储了不同的点阵字符图形,这些字符有,阿拉伯数字、英⽂字母的⼤⼩写、常⽤的符号、和⽇⽂假名等,每⼀个字符都有⼀个固定的代码,其中数字与字母同ASCII码兼容。

其内部还有⾃定义字符(CGRAM),可⽤业存储⾃已定义的字符。

指令1:清显⽰屏;指令2:光标复位;指令3:光标和显⽰模式设置 I/D:光标移动⽅向,⾼电平右移,低电平左移,S:屏幕上所有⽂字是否左移或者右移。

⾼电平表⽰有效,低电平则⽆效。

指令4:显⽰开关控制。

D:控制整体显⽰的开与关,⾼电平表⽰开显⽰,低电平表⽰关显⽰ C:控制光标的开与关,⾼电平表⽰有光标,低电平表⽰⽆光标 B:控制光标是否闪烁,⾼电平闪烁,低电平不闪烁。

指令5:光标或显⽰移位 S/C:⾼电平时移动显⽰的⽂字,低电平时移动光标。

1602液晶显示计算器00.

1602液晶显示计算器00.

1602液晶显示计算器院系:机械工程学院班级:测控1003姓名:金飞完成时间:2012年11月18日摘要本设计由51单片机作为核心,4*4矩阵键盘作为输入,将数据输入到单片机内部处理,并通过1602液晶显示出来运算及其结果。

本设计具有成本低廉,操作简单。

可作为日常简单计算使用。

关键词:51单片机、矩阵键盘、1602液晶。

一、外观介绍:二、电路仿真:P0.0~P0.7引脚接lcd的D0-D7,P3口接矩阵键盘。

单片机的P2.4、P2.0、P2.3脚分别接到LCD的RS、R/W、E管。

三、显示电路,LCD1602A的引脚详细介绍:采用LCD1602A来显示,要求能显示两行。

它的D—7D引脚分别接到单片机的P0.0~P0.7引脚;RS、R/W、E管脚分别接到单片机的P2.4、P2.0、P2.3 。

具体连接见后面的电路图。

以下是1602的16进制ASCII码表三、矩阵键盘扫描电路P3口的P3.0,P3.1,P3.2和P3.3四根线作为按键的行输出线,用P3.4,P3.5,P3.6和P3.7作为按键的列输入线。

依次给某一行低电平,再判断哪一列是低电平。

于是就判断出哪行和哪列导通。

对于不同的组合可以确定所有按键位置,将位置赋值到一个变量中,以供使用。

具体来说:假如按下的是数字5键(编号6——位于第二行第二列),首先置第一行为低电平其他7位为高电平P0=0xfe,再检测高四位的电平(P0=P&0xf0 ),因为列没有一条与第一行相导通,所以P0的高位还是高电平的。

然后再换第二行P0=0xfd,同理检测高四位(P0=P&0xf0 )得出P0=0xd0,则5键所在位置为第二行第二列,然后num赋值为6。

四、程序分析可知共分为七个模块:键盘扫描部分,定义各个位置上的键值部分,延迟部分,存贮部分,液晶显示部分,运算部分,动态显示部分。

主程序流程图如下:否判断是否有键按下五、程序#include<reg51.h>#define uint unsigned int#define uchar unsigned charsbit lcden=P2^3;sbit rs=P2^4;sbit rw=P2^0;sbit busy=P0^7;char i,j,temp,num,num_1;long a,b,c;float a_c,b_c;uchar flag,fuhao;uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0};uchar code table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30}; void delay(uchar z){uchar y;for(z;z>0;z--)for(y=0;y<110;y++);}void check(){do{P0=0xFF;rs=0;rw=1;lcden=0;delay(1);lcden=1;}while(busy==1);}void write_com(uchar com){P0=com;rs=0;rw=0;lcden=0;check();lcden=1;}void write_date(uchar date) {P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}void init(){num=-1;lcden=1;write_com(0x01);write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x80);write_com(0x01);num_1=0;i=0;j=0;a=0;b=0;c=0;flag=0;fuhao=0;}void keyscan(){P3=0xfe;if(P3!=0xfe){delay(20);if(P3!=0xfe){temp=P3&0xf0;{case 0xe0:num=0;break;case 0xd0:num=1;break;case 0xb0:num=2;break;case 0x70:num=3;break;}}while(P3!=0xfe);if(num==0||num==1||num==2){if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}Else{b=b*10+table[num];}}else{flag=1;fuhao=4;}i=table1[num];write_date(0x30+i);}P3=0xfd;if(P3!=0xfd){delay(5);if(P3!=0xfd){temp=P3&0xf0;{case 0xe0:num=4;break;case 0xd0:num=5;break;case 0xb0:num=6;break;case 0x70:num=7;break;}}while(P3!=0xfd);if(num==4||num==5||num==6&&num!=7) {if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}else{b=b*10+table[num];}}Else{flag=1;fuhao=3;}i=table1[num];write_date(0x30+i);}P3=0xfb;if(P3!=0xfb){delay(5);if(P3!=0xfb){temp=P3&0xf0;{case 0xe0:num=8;break;case 0xd0:num=9;break;case 0xb0:num=10;break;case 0x70:num=11;break;}}while(P3!=0xfb);if(num==8||num==9||num==10) {if(j!=0){write_com(0x01);j=0;}if(flag==0){a=a*10+table[num];}Else{b=b*10+table[num];}}else if(num==11){flag=1;fuhao=2;}i=table1[num];write_date(0x30+i);}P3=0xf7;if(P3!=0xf7){delay(5);if(P3!=0xf7){switch(temp){case 0xe0:num=12;break;case 0xd0:num=13;break;case 0xb0:num=14;break;case 0x70:num=15;break;}}while(P3!=0xf7);switch(num){case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;} break;case 13:{if(flag==0){a=a*10;write_date(0x30);P1=0;}else if(flag==1){b=b*10;write_date(0x30);}}break;case 14:{j=1;if(fuhao==1){write_com(0x80+0x4f);write_com(0x04);c=a+b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==2){write_com(0x80+0x4f);write_com(0x04);if(a-b>0)c=a-b;elsec=b-a;while(c!=0){write_date(0x30+c%10);c=c/10;}if(a-b<0)write_date(0x2d);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==3){write_com(0x80+0x4f);write_com(0x04);c=a*b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==4){write_com(0x80+0x4f);write_com(0x04);i=0;c=(long)(((float)a/b)*1000);while(c!=0){write_date(0x30+c%10);c=c/10;i++;if(i==3)write_date(0x2e);}if(a/b<=0)write_date(0x30);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;}break;}}}main(){init();while(1){keyscan();}}以下程序才对#include<reg52.h> //头文件#define uint unsigned int //#define uchar unsigned charsbit lcden=P2^5; //定义引脚sbit rs=P2^4;sbit rw=P2^0;sbit busy=P0^7;char chufa=0;char chenfa=0;char jiafa=0;char jianfa=0;/***sbit dula=P2^6;sbit wela=P2^7;***/uchar code table2[]="overflow";char i,j,temp,num,num_1;long a,b,c; //a,第一个数b,第二个数c,得数long a_c,b_c; //floatuchar flag,fuhao;//flag表示是否有符号键按下,fuhao表征按下的是哪个符号uchar code table[]={7,8,9,0,4,5,6,0,1,2,3,0,0,0,0,0};uchar code table1[]={7,8,9,0x2f-0x30,4,5,6,0x2a-0x30,1,2,3,0x2d-0x30,0x01-0x30,0,0x3d-0x30,0x2b-0x30};void delay(uchar z) // 延迟函数{uchar y;for(z;z>0;z--)for(y=0;y<110;y++);}void check() // 判断忙或空闲{do{P0=0xFF;rs=0; //指令rw=1; //读lcden=0; //禁止读写delay(1); //等待,液晶显示器处理数据lcden=1; //允许读写}while(busy==1); //判断是否为空闲,1为忙,0为空闲}void write_com(uchar com) // 写指令函数{P0=com; //com指令付给P0口rs=0;rw=0;lcden=0;check();lcden=1;}void write_date(uchar date) // 写数据函数{P0=date;rs=1;rw=0;lcden=0;check();lcden=1;}void init() //初始化{num=-1;/***dula=0;wela=0;***/lcden=1; //使能信号为高电平write_com(0x38); //8位,2行write_com(0x0c); //显示开,光标关,不闪烁*/write_com(0x06); //增量方式不移位write_com(0x80); //检测忙信号write_com(0x01); //显示开,光标关,不闪烁num_1=0;i=0;j=0;a=0; //第一个参与运算的数b=0; //第二个参与运算的数c=0;flag=0; //flag表示是否有符号键按下,fuhao=0; // fuhao表征按下的是哪个符号}void keyscan() // 键盘扫描程序{P3=0xfe;if(P3!=0xfe){delay(20); //延迟20msif(P3!=0xfe){temp=P3&0xf0;switch(temp){case 0xe0:num=0;break;case 0xd0:num=1;break;case 0xb0:num=2;break;case 0x70:num=3;break;}}while(P3!=0xfe);if(num==0||num==1||num==2)//如果按下的是'7','8'或'9if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{a=a*10+table[num];}else//如果按过符号键{b=b*10+table[num];}}else//如果按下的是'/'{flag=1;fuhao=4;//4表示除号已按chufa++;if (chufa == 2){write_com(0x80);for(num=0;num<8;num++){write_date(table2[num]);delay(5);}//write_date(0x21);chufa = 0;}/*** chenfa++;if(chenfa==1){write_date(0x21);chenfa=0;}***/}i=table1[num];write_date(0x30+i);}if(P3!=0xfd){delay(5);if(P3!=0xfd){temp=P3&0xf0;switch(temp){case 0xe0:num=4;break;case 0xd0:num=5;break;case 0xb0:num=6;break;case 0x70:num=7;break;}}while(P3!=0xfd);if(num==4||num==5||num==6)//如果按下的是'4','5'或'6' {if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{a=a*10+table[num];}else//如果按过符号键{b=b*10+table[num];}}else//如果按下的是'/'{flag=1;fuhao=3;//3表示乘号已按chenfa++;if (chenfa == 2){write_com(0x80);for(num=0;num<8;num++){write_date(table2[num]);delay(5);}//write_date(0x21);chenfa = 0;}}i=table1[num];write_date(0x30+i);}P3=0xfb;if(P3!=0xfb){delay(5);if(P3!=0xfb){temp=P3&0xf0;switch(temp){case 0xe0:num=8;break;case 0xd0:num=9;break;case 0xb0:num=10;break;case 0x70:num=11;break;}}while(P3!=0xfb);if(num==8||num==9||num==10)//如果按下的是'1','2'或'3' {if(j!=0){write_com(0x01);j=0;}if(flag==0)//没有按过符号键{a=a*10+table[num];}else//如果按过符号键{b=b*10+table[num];}}else if(num==11)//如果按下的是'-' {flag=1;fuhao=2;//2表示减号已按jianfa++;if (jianfa == 2){write_com(0x80);for(num=0;num<8;num++){write_date(table2[num]);delay(5);}//write_date(0x21);jianfa = 0;}}i=table1[num];write_date(0x30+i);}P3=0xf7;if(P3!=0xf7){delay(5);if(P3!=0xf7){temp=P3&0xf0;switch(temp){case 0xe0:num=12;break;case 0xd0:num=13;case 0xb0:num=14;break;case 0x70:num=15;break;}}while(P3!=0xf7);switch(num){case 12:{write_com(0x01);a=0;b=0;flag=0;fuhao=0;}//按下的是"清零"break;case 13:{ //按下的是"0"if(flag==0)//没有按过符号键{a=a*10;write_date(0x30);P1=0;}else if(flag==1)//如果按过符号键{b=b*10;write_date(0x30);}}break;case 14:{j=1;rw=0;rs=0;if(fuhao==1){write_com(0x0f);//按下等于键,光标前进至第二行最后一个显示处0x80+0x4fwrite_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格c=a+b;delay(10);while(c!=0){write_date(0x30+c%10);//c=c/10;write_date(0x3d); //再写"="a=0;b=0;flag=0;fuhao=0;}else if(fuhao==2){write_com(0x0f);//光标前进至第二行最后一个显示处0x80+0x4fwrite_com(0x04); //设置从后住前写数据,每写完一个数据,光标后退一格if(a-b>0)c=a-b;elsec=b-a;while(c!=0){write_date(0x30+c%10);c=c/10;}if(a-b<0)write_date(0x2d);write_date(0x3d); //再写"="a=0;b=0;flag=0;fuhao=0;}else if(fuhao==3){write_com(0x0f); //0x80+0x4fwrite_com(0x04);c=a*b;while(c!=0){write_date(0x30+c%10);c=c/10;}write_date(0x3d);//write_date(0x30);a=0;b=0;flag=0;fuhao=0;}else if(fuhao==4){write_com(0x40+0x4f); //0x80+0x4fwrite_com(0x04);i=0;c=(long)(((float)a/b)*1000);while(c!=0){write_date(0x30+c%10);c=c/10;if(i==3)write_date(0x2e);}if(a/b<=0)write_date(0x30);write_date(0x3d);a=0;b=0;flag=0;fuhao=0;}}break;case 15:{write_date(0x30+table1[num]);flag=1;fuhao=1;jiafa++;if (jiafa == 2){write_com(0x80);for(num=0;num<8;num++){write_date(table2[num]);delay(5);}//write_date(0x21);jiafa = 0;}}break;}}}/*void key(){P3=0xfe;if(P3!=0xfe){delay(5);if(P3!=oxfe){temp=P3&0xf0;}}}*/main(){init();while(1) {keyscan(); }}。

自制液晶(1602A)显示模块(图,电路)

自制液晶(1602A)显示模块(图,电路)

自制液晶(1602A)显示模块(图,电路)(2009-04-26 13:42:54)转载标签:分类:电子科技液晶显示器1602电路板焊接89c52单片机c程序it这个是显示效果,呵呵,还不错LOVE U FOREVERMADE BY CC 由于手机拍,效果不太好,液晶显示的效果是很好的此液晶模块采用的是1602a,最普遍的一种小型显示器,16*2这个是它的元件,市场价格17左右电路板焊接材料大致是,单片机89c52rc一块7元,电容若干,电阻若干,导线若干,电位器一个(调节对比度),其他led,开关等等印制板一块2.5元总价格在35元内很实惠哦焊接效果图,此电路板很小,花费了不少时间布线,很紧凑,空间利用率高,本人比较满意充分在上下层里外走线了,费电精力,但很好看这个可以编写程序使其作为日期,时间显示放在桌上,既是实用,也能彰显出个性,裸露的电路板及元器件,很好,复古,无包装尤其是此电路与我的仙人掌搁在一起,技术与艺术的相结合,放在桌子的角落,并没有隐藏去它的魅力,而是交相辉映,彼此衬托,很好很强大~~此电路是CMOS电路为主,最大的优势就是省电,4.5v到5.5v电均可工作可用变压器,得到低压交流电,经过整流滤波后,加稳压模块7805,得到5v 很方便,功耗低,实则走亲访友之上佳礼品,本人极力推荐附上部分程序:#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]="LOVE U FOREVER"; uchar code table1[]="MADE BY CC";sbit lcden=P2^2; //使能信号sbit RorW=P2^1; //读或者写选择,低时写sbit lcdrs=P2^0; //高时写数据uchar num;void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com)//写命令{lcdrs=0;P0=com;//8位数据口delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date){lcdrs=1;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void init(){RorW=0;lcden=0;write_com(0x38);//显示模式设置write_com(0x0c);//开显示,有光标,不闪烁 write_com(0x06);write_com(0x01);write_com(0x80);//数据指针设置0x80h+}void main(){init();for(num=0;num<16;num++){write_data(table[num]);delay(20);}write_com(0x80+0x41);for(num=0;num<14;num++){write_data(table1[num]);delay(20);}while(1);}本人郑重声明:此博客文章电子制作文章禁止转载,请尊重个人劳动成果。

lcd1602程序流程图

lcd1602程序流程图

lcd1602程序流程图lcd1602程序流程图1、引脚3(对⽐调整电压)接正电源时对⽐度最低,接地时对⽐度最⾼,通常通过⼀个10k的电位器相连后接地,上电后需要对电位器进⾏调整以显⽰出相应的字符(就像调节电视的对⽐度使图像清晰,这⾥是使字符清晰)2、D0~D7为8为数据总线,⽤于与单⽚机之间的数据传送了解了引脚功能后,我们再来看其内置芯⽚关于HD44780HD44780内部含有DDRAM,CGROM,CGRAM下⾯我来简单介绍⼀下这三个存储器DDRAM是⽤于寄存待显⽰字符代码的,其内部带有80字节的RAM 缓冲区,与LCD屏幕的位置⼀⼀对应。

通常我们只使⽤前16个地址(两⾏32个),这样⼀来,我们便可以将这32个地址当作是我们的坐标,⽐如要在DDRAM的02H 地址(对应的是屏幕第⼀⾏第三个)显⽰字符“A”,我们就可以分两步⾛,⾸先⽤程序先找到“坐标点”,也就是将地址转到02H(具体如何不做详细说明),然后在这个位置写⼊“A”,写⼊地址和数据都是通过D0~D7实现的,详细的程序在⽂章的后⾯举例说明。

CGROM与CGRAM是LCD内部固化的字模存储器,这相当于芯⽚内部划出的⼀块区域,CGROM⾥⾯存放着我们⽇常所使⽤的⼀些字符(192个),⽽CGRAM则允许⽤户⾃定义⼀些字符(8个)。

具体对应关系如下,0x00~0x0F就是⽤户⾃定义的CGRAM区。

再回到之前的问题,在DDRAM的02H地址显⽰字符“A”,⾸先通过程序找到地址02H,然后在该地址写⼊41H,从图中也可看出该位置对应的字符就是“A”。

我们再来理⼀理这个过程,有关字符显⽰,⾸先便是找到DDRAM 中我们所要显⽰位置对应的地址,接着便是在这个地址写⼊⼀个地址(单⽚机中的间接寻址),LCD根据这个地址在CGROM中找到对应的字符,然后在02H这个位置显⽰出来,这个过程也到此结束。

由于CGROM中的字符代码与PC中的字符代码基本⼀致,通常我们也直接在02H地址直接写⼊“A”,简化了程序设计。

lcd1602流程图

lcd1602流程图

lcd1602流程图LCD1602流程图是指在液晶显示屏模块上显示特定信息的流程图。

下面我们将介绍一个简单的LCD1602流程图,包括初始化液晶模块、设置显示模式、输入要显示的内容等步骤。

首先,我们需要准备一个Arduino开发板和一个LCD1602模块。

将LCD模块的VCC和GND引脚分别连接到Arduino的3.3V和GND引脚上,将SDA和SCL引脚连接到Arduino的A4和A5引脚上。

然后,编写以下步骤来实现流程图。

第一步,初始化液晶模块。

在Arduino开发环境中,我们需要包含LiquidCrystal_I2C.h库文件,然后创建一个LiquidCrystal_I2C对象。

使用begin()函数初始化LCD模块,并设置显示模式和光标的闪烁。

第二步,设置显示模式。

使用setCursor()函数将光标移动到特定位置,并使用print()函数输入要显示的内容。

根据需要可以设置一到两行进行显示。

第三步,设置滚动显示。

使用scrollDisplayLeft()或scrollDisplayRight()函数在屏幕上滚动显示内容。

第四步,设置光标显示状态。

使用noCursor()函数关闭光标显示,使用cursor()函数开启光标显示。

第五步,设置光标闪烁状态。

使用noBlink()函数关闭光标闪烁,使用blink()函数开启光标闪烁。

第六步,设置显示打开/关闭状态。

使用noDisplay()函数关闭显示,使用display()函数开启显示。

第七步,设置自定义字符。

使用createChar()函数在CGRAM (字符生成RAM)中自定义字符,并使用write()函数在屏幕上显示。

第八步,清除屏幕。

使用clear()函数清除屏幕上的内容。

第九步,设置屏幕显示次数。

使用blinkDisplay()函数设置屏幕的显示次数,并使用count()函数检测屏幕的显示次数。

第十步,控制光标位置。

使用setCursor()函数将光标移动到特定位置。

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

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

#include 〈reg51.h>#include 〈intrins。

h〉#include <stdio。

h〉#include 〈stdlib。

h〉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〈n;i++)delay1ms();}/************************************函数功能:判断液晶模块的忙碌状态返回值:result。

result=1,忙碌;result=0,不忙。

************************************/bit BusyTest(void){bit result;RS=0; //根据规定,RS为低电平、RW为高电平时,可以读状态RW=1;E=1;//E=1,才允许读/写_nop_();_nop_();_nop_();_nop_();result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate**************************************/void WriteInstruction(unsigned char dictate){while(BusyTest()==1); //如果忙就等待RS=0;//根据规定,RS和R/W同为低电平时,可以写入指令RW=0;E=0;_nop_();_nop_();P0=dictate;//将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_();E=1; //E置高电平_nop_();_nop_();_nop_();_nop_();E=0;}/*****************************************函数功能:指定字符显示的实际地址入口参数:x,y*****************************************/void WriteAddress(unsigned char x,unsigned char y){unsigned char temp;if(x==0){switch(y){case 0:temp=0x00; break;case 1:temp=0x01;break;case 2:temp=0x02;break;case 3:temp=0x03;break;case 4:temp=0x04;break;case 5:temp=0x05;break;case 6:temp=0x06;break;case 7:temp=0x07;break;case 8:temp=0x08;break;case 9:temp=0x09;break;case 10:temp=0x0a;break;case 11:temp=0x0b;break;case 12:temp=0x0c;break;case 13:temp=0x0d;break;case 14:temp=0x0e;break;case 15:temp=0x0f;break;}}if(x==1){switch(y){case 0:temp=0x40;break;case 1:temp=0x41;break;case 2:temp=0x42;break;case 3:temp=0x43;break;case 4:temp=0x44;break;case 5:temp=0x45;break;case 6:temp=0x46;break;case 7:temp=0x47;break;case 8:temp=0x48;break;case 9:temp=0x49;break;case 10:temp=0x4a;break;case 11:temp=0x4b;break;case 12:temp=0x4c;break;case 13:temp=0x4d;break;case 14:temp=0x4e;break;case 15:temp=0x4f;break;}}WriteInstruction(temp|0x80); //显示位置的确定方法规定为“80H+地址码x”}/*****************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y*****************************************/void WriteData (unsigned char y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0;P0=y;//将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_();E=1;_nop_();_nop_();_nop_();_nop_();E=0;//当E由高电平跳变成低电平时,液晶模块开始执行指令}/*****************************************函数功能:对LCD的显示模式进行初始化设置*****************************************/void LcdInitiate(void){delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38); //显示模式设置delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x0c);//显示模式设置:显示开,无光标,光标不闪烁delaynms(5);WriteInstruction(0x06);//显示模式设置:光标右移,字符不移delaynms(5);WriteInstruction(0x01);//清屏幕指令,将以前的显示内容清除delaynms(5);}/***************************************函数功能:显示字符串***************************************/void display_error(){unsigned char i;WriteAddress(0,0);i=0;while(Error[i]!='\0'){WriteData(Error[i]);i++;delaynms(100);}}void display_systemerror(){unsigned char i;WriteAddress(0,0);i=0;while(Systemerror[i]!='\0’){WriteData(Systemerror[i]);i++;delaynms(100);}}void display_lcd(){unsigned char i;WriteAddress(0,0);i=0;while(Lcd[i]!='\0'){WriteData(Lcd[i]);i++;delaynms(100);}}/*************************** 函数功能:按键判断**************************/ bit judge(){unsigned char keycode;P1=0x0f;keycode=P1;if(keycode==0x0f)return(0);elsereturn(1);}/*****************************函数功能:键盘扫描*****************************/unsigned char scan(){unsigned char keycode,keyscan;keyscan=0xef;while(keyscan!=0xff){P1=keyscan;keycode=P1;if((keycode&0x0f)!=0x0f)break;keyscan=(keycode〈<1)|0x0f;}keycode=~keycode;return(keycode);}/*******************************函数功能:扫描键盘返回值******************************/ unsigned char Key_Num(){unsigned char keycode;unsigned char yong;if(judge()){delaynms(20);if(judge()){keycode=scan();while(judge());switch(keycode){case 0x11:yong='7';break;case 0x12:yong='4’;break;case 0x14:yong=’1';break;case 0x18:yong=0;break;case 0x21:yong=’8’;break;case 0x22:yong=’5’;break;case 0x24:yong='2';break;case 0x28:yong='0’;break;case 0x41:yong=’9';break;case 0x42:yong='6';break;case 0x44:yong='3’;break;case 0x48:yong='=';break;case 0x81:yong=’/';break;case 0x82:yong=’*’;break;case 0x84:yong=’-';break;case 0x88:yong=’+’;break;default:display_systemerror();}return(yong);}}elsereturn(0xff);}/**************************************itoa函数定义*********************************/unsigned char itoa(long int num){unsigned char i,j,L;unsigned char temp[16];for(i=0;num!=0;i++){temp[i]=num%10+48;num=num/10;}L=i;if(i>16){display_systemerror();}for(j=0;j〈=L;j++){str[j]=temp[i];i——;}return(L);}/*****************************************函数功能:主函数****************************************/void main(){long int a;long int b;unsigned char flag;unsigned char sign;unsigned char i,j,s,x;unsigned char num;unsigned char fgh;unsigned char temp[16];LcdInitiate();display_lcd();delaynms(20);WriteInstruction(0x01);flag=1;while(1){num=Key_Num();if(num!=0xff){if(fgh==1){WriteInstruction(0x01);fgh=0;}if((num!=’+')&&(num!='—')&&(num!='*’)&&(num!='/')&&(num!='。

1602液晶显示屏模块资料--附程序

1602液晶显示屏模块资料--附程序

液晶显示屏模块说明一.功能说明:该模块可以通过单片机控制并行口数据16字×2行的字符型液晶模块的显示。

二.硬件设计:核心控制:Freescale MC9S12D64 单片机系统板执行部分:16字X2行的字符型液晶模块操作部分:通过USBDM将已写好的程序刷入单片机指示部分:单片机上的发光二极管电源部分:提供给电机5V的直流稳压电源硬件说明:一.液晶显示屏引脚的定义:1602采用标准的16脚接口,其中:(模块背面有标注)。

1脚VSS:接地;2脚Vdd:接+5V电源;3脚VO:对比度调整端,LCD驱动电压范围为Vdd~VO。

当VO接地时,对比度最强;4脚RS:寄存器选择端,RS为0时,选择命令寄存器IR;RS为1时,选择数据寄存器DR;5脚:读写控制端,为1时,选择读出;为0时,则选择写入;6脚Enable:使能控制端,Enable为1时,使能;Enable 为0,禁止;7脚~14脚D0~D7:数据总线;15脚LED+:背景光源,接+5V;16脚LED-:背景光源,接地。

1602液晶模块内部的字符发生存储器(CGROM)已经存储了不同的点阵字符图形,这些字符有,阿拉伯数字、英文字母的大小写、常用的符号、和日文假名等,每一个字符都有一个固定的代码,其中数字与字母同ASCII码兼容。

其内部还有自定义字符(CGRAM),可用业存储自已定义的字符。

指令说明:指令1:清显示屏;指令2:光标复位;指令3:光标和显示模式设置 I/D:光标移动方向,高电平右移,低电平左移,S:屏幕上所有文字是否左移或者右移。

高电平表示有效,低电平则无效。

指令4:显示开关控制。

D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示 C:控制光标的开与关,高电平表示有光标,低电平表示无光标 B:控制光标是否闪烁,高电平闪烁,低电平不闪烁。

指令5:光标或显示移位 S/C:高电平时移动显示的文字,低电平时移动光标。

R/L,高向左,低向右。

项目六 1602液晶显示计数器制作

项目六 1602液晶显示计数器制作

void disp_one(uchar x, uchar y,uchar dispbuf);//到指定位置显示单个字符 的函数声明 void disp_mul(uchar x, uchar y,uchar code *dispbuf);//到指定的位置显示 多个字符的函数声明
高等教育出版社
Higher Education Press
高等教育出版社
Higher Education Press
任务一 1602液晶显示字符
2.1602液晶显示模块知识
(3)模块的使用——驱动函数
/******到指定的位置显示多个字符****************/ void disp_mul(uchar x, uchar y,uchar code *dispbuf) { uchar len, i; len=strlen(dispbuf); //计算要显示的字符串长度 y&=0x01; //限制X,Y位置 x&=0x0F; if(x<=0x0F) //X坐标小于一行执行显示 { for (i=0;i<len;i++) { disp_one(x,y,dispbuf[i]); //显示单个字符 x++; } } 等教育出版社 } 高 Higher Education Press
Higher Education Press
E
DB0-DB7 LEDA LEDK
输入
输入/输出
使能信号,下降沿触发
数据总线从低位到高位 背光电源正端(+5V) 背光电源负端(0V)
1602液晶引脚及其功能
任务一 1602液晶显示字符
2.1602液晶显示模块知识
(2)模块显示字符原理

单片机液晶显示(以1602为例)

单片机液晶显示(以1602为例)

液晶显示(所有程序都经过测试合格)一、基础部分。

(以1602与12864介绍)本部分以液晶1602为主,来引出关于单片机操作液晶的基本知识。

为以后液晶的高级应用打好基础。

Ⅰ、本程序最终目的为:显示一个双行数字,并实现整屏移动。

总的原理图及源程序如下:原理图:液晶电路图\液晶显示.ddb源程序:液晶例程\液晶显示.c#include<reg52.h>#define uchar unsigned char#define uint unsigned intuchar code table[]="I LIKE MCU!";uchar code table1[]="";sbit lcdwr=P2^5;//R/S命令选择端,H/L;sbit lcden=P2^7;//使能端sbit lcdrs=P2^6;//RS数据/命令选择端。

H/L;//sbit dula=P2^6;//sbit wela=P2^7;uchar num;void delay(uint z)//延时程序,z的数是几就是几ms{uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com)//写命令函数,{lcdrs=0;//写入命令初始化,设置为低电平表示命令选择端。

P0=com; //由时序图可知,在使能en触发时,早就有数据写入。

delay(5); //并且有一段延时,此处设置为5毫秒lcden=1; //使能端开始拉高delay(5); //由时序图,使能端拉低一段时间thD2后,数据传输?lcden=0; //然后将使能端拉低}void write_data(uchar date){lcdrs=1;P0=date;delay(5);//此处延时,是为了对应数据中:在E拉高之前,有数据的一段准备时间。

基于51单片机的lcd1602液晶显示的计算器

基于51单片机的lcd1602液晶显示的计算器

基于51单片机的lcd 1602液晶显示的计算器/**************************************************************** 阿斌独家制作:计算器,1602液晶显示可计算10以下数加减乘除可连续运算,最大显示结果数值65536*****************************************************************/ 键盘设置:液晶初始显示:运算显示:主程序:#include<reg52.h>#include <intrins.h> #define uint unsigned int #define uchar unsigned char sbit lcden=P2^2;sbit lcdrw=P2^1;sbit lcdrs=P2^0;uchar num,temp,jia=0,jian=0,cheng=0,chu=0,qing=0;uint key,key1,shu;uchar fuhao,flag1,flag=0; uchar table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x0}; void delay(uint z) {uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--); }bit lcd_bz(){bit result;lcdrs=0;lcdrw=1;lcden=1;_nop_();_nop_();_nop_();_nop_();result=(bit)(P0&0x80);lcden=0;return result; }void write_com(uchar com){while(lcd_bz());lcdrs=0;lcden=0;lcdrw=0;P0=com;delay(5);lcden=1;delay(5);lcden=0; }void write_date(uchar date) {while(lcd_bz());lcdrs=1;lcden=0;lcdrw=0;P0=date;delay(5);lcden=1;delay(5);lcden=0;}void lcd_init() {lcden=0;write_com(0x38);write_com(0x0c);write_com(0x06);write_com(0x01); }void keyscan() {P3=0xfe;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xee:key=1;num=0;break; case 0xde:key=2;num=0;break; case 0xbe:key=3;num=0;break; case 0x7e:num=1;break; //加号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfd;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xed:key=4;num=0;break; case 0xdd:key=5;num=0;break; case 0xbd:key=6;num=0;break; case 0x7d:num=2;break; //减号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xfb;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xeb:key=7;num=0;break; case 0xdb:key=8;num=0;break; case 0xbb:key=9;num=0;break; case 0x7b:num=3;break; //乘号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}P3=0xf7;temp=P3;temp=temp&0xf0;while(temp!=0xf0){delay(5);temp=P3;temp=temp&0xf0;while(temp!=0xf0){temp=P3;switch(temp){case 0xe7:key=0;num=0;break; case 0xd7:num=6;break; //清除case 0xb7:num=5;break; //等于号case 0x77:num=4;break; //除号}while(temp!=0xf0){temp=P3;temp=temp&0xf0;}}}}void display0(uint shu) { uint ge;ge=shu;write_date(0x30+ge); } void display1(uint shu) { uint shi,ge;shi=shu/10;ge=shu%10;write_date(0x30+shi); write_date(0x30+ge); } void display2(uint shu) { uint bai,shi,ge;bai=shu/100;shi=shu%100/10;ge=shu%10;write_date(0x30+bai); write_date(0x30+shi); write_date(0x30+ge); } void display3(uint shu) {uint qian,bai,shi,ge;qian=shu/1000;bai=shu%1000/100;shi=shu%100/10;ge=shu%10;write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge); }void display4(uint shu) {uint wan,qian,bai,shi,ge;wan=shu/10000;qian=shu%10000/1000;bai=shu%1000/100;shi=shu%100/10;ge=shu%10;write_date(0x30+wan);write_date(0x30+qian);write_date(0x30+bai);write_date(0x30+shi);write_date(0x30+ge); }void display_key1(uint result) {if(flag1==1){write_com(0x01);flag1=0;}shu=result;write_com(0x80);if(result<10)display0(result);if(result>=10&&result<100) display1(result);if(result>=100&&result<1000) display2(result);if(result>=1000&&result<10000) display3(result);if(result>=10000)display4(result);}void dis_key(result){if(result<10)display0(result);if(result>=10&&result<100) display1(result);if(result>=100&&result<1000)display2(result);if(result>=1000&&result<10000) display3(result);if(result>=10000)display4(result);}void display_key(uint result) { if(shu<10){write_com(0x80+2);dis_key(result);}if(shu>=10&&shu<100){write_com(0x80+3);dis_key(result);}if(shu>=100&&shu<1000){write_com(0x80+4);dis_key(result);}if(shu>=1000&&shu<10000){write_com(0x80+5);dis_key(result);}if(shu>=10000){write_com(0x80+6);dis_key(result);}}void display_fuhao(){switch(fuhao){case 1: write_date(0x2b);break; case 2: write_date(0x2d);break; case 3: write_date(0x2a);break; case 4: write_date(0x2f);break; }fuhao=0;}void fuhao_pan(){if(flag1==1){flag1=0;write_com(0x01);write_com(0x80+1); display_fuhao();}if(shu<10)write_com(0x80+1);if(shu>=10&&shu<100) write_com(0x80+2);if(shu>=100&&shu<1000) write_com(0x80+3);if(shu>=1000&&shu<10000) write_com(0x80+4);if(shu>=10000)write_com(0x80+5); display_fuhao();flag=1;}void fuhao_deng(){write_com(0x80+0x40); write_date(0x3d);flag1=1;flag=0;}void display_result(uint result) {write_com(0x80+0x40+1);if(result<10)display0(result);if(result>=10&&result<100) display1(result);if(result>=100&&result<1000) display2(result);if(result>=1000&&result<10000) display3(result);if(result>=10000)display4(result); }void jia1(){jia=1;jian=cheng=chu=qing=0;key1=key;fuhao=1;fuhao_pan();}void jian1(){jian=1;jia=cheng=chu=qing=0; key1=key;fuhao=2;fuhao_pan(); }void cheng1() {cheng=1;jia=jian=chu=qing=0; key1=key;fuhao=3;fuhao_pan(); }void chu1() {chu=1;jia=jian=cheng=qing=0; key1=key;fuhao=4;fuhao_pan();}void qing1() {qing=1;jia=jian=cheng=chu=0; key1=key=0; }void deng1() {if(jia)key=key1+key;if(jian)key=key1-key;if(cheng)key=key1*key;if(chu)key=key1/key;fuhao_deng();display_result(key);jia=jian=cheng=chu=qing=0;}void deal(){switch(num){case 0:{switch(flag){case 0: display_key1(key);break; case 1: display_key(key);break; }} break;case 1: jia1();break;case 2: jian1();break; case 3: cheng1();break; case 4: chu1();break; case 5: deng1();break; case 6: qing1();break; }}void main(){lcd_init();while(1){keyscan();deal();}}。

LCD1602的电路图和程序

LCD1602的电路图和程序

LCD1602的电路图和程序————————————————————————————————作者:————————————————————————————————日期:MS基于1602字符型液晶显示器的显示系统姓名:杨越班级:电子11-1学号:110400104一、实习目的(1)了解飞思卡尔单片机的基本原理,掌握其基本的工作流程。

(2)了解LCD1602的基本原理及用法。

(3)能够熟练使用CodeWarrior软件编写C语言程序,使用BDM仿真器下载程序。

(4)能够熟练焊接电路板。

二、实验设备与器件CodeWarrior软件,BDM仿真器,万用电路板,飞思卡尔单片机,LCD1602液晶显示器,三、实验内容内容:利用飞思卡尔单片机制作基于1602字符液晶显示器的显示系统要求:用四个按键控制,按下第一个按键显示1,按下第二个按键显示2,以此类推。

(1)LCD1602液晶显示器的原理:1602共16个管脚,但是编程用到的主要管脚不过三个,分别为:RS(数据命令选择端),R/W(读写选择端),E(使能信号);以后编程便主要围绕这三个管脚展开进行初始化,写命令,写数据。

以下具体阐述这三个管脚:RS为寄存器选择,高电平选择数据寄存器,低电平选择指令寄存器。

R/W为读写选择,高电平进行读操作,低电平进行写操作。

E端为使能端,后面和时序联系在一起。

除此外,D0~D7分别为8位双向数据线。

操作时序:RS R/W 操作说明0 0 写入指令码D0~D70 1 读取输出的D0~D7状态字1 0 写入数据D0~D71 1 从D0~D7读取数据注:关于E=H脉冲——开始时初始化E为0,然后置E为1,再清0.读取状态字时,注意D7位,D7=1,禁止读写操作;D7=0,允许读写操作;所以对控制器每次进行读写操作前,必须进行读写检测。

(即后面的读忙子程序)指令集:LCD_1602 初始化指令小结:0x38 设置16*2显示,5*7点阵,8位数据接口0x01 清屏0x0F 开显示,显示光标,光标闪烁0x08 只开显示0x0e 开显示,显示光标,光标不闪烁0x0c 开显示,不显示光标0x06 地址加1,当写入数据的时候光标右移0x02 地址计数器AC=0;(此时地址为0x80)光标归原点,但是DDRAM 中断内容不变0x18 光标和显示一起向左移动(2)飞思卡尔单片机的功能及特点:MC9S12XS128是 16 位单片机,由 16 位中央处理单元(CPU12X)、128KB 程序、Flash(P-lash)、8KB RAM、8KB 数据 Flash(D-lash)组成片内存储器。

1602显示实验报告

1602显示实验报告

一、1602显示二、实验项目:1602显示三、实验地点:四、五、实验时间:2014年7月9日~2014年7月23日六、实验要求:1、在单片机最小系统中加入LCD1602显示屏。

2、能进行数字和字符的显示3、扩展功能一:将实验四中的“单片机时钟”改为1602显示。

4、用Protel99SE绘制实验原理图并完成实验报告。

七、实验具体内容:1、在单片机最小系统中加入LCD1602显示屏。

(1)实验电路图:(2)实验原理:1602显示屏采用标准的16引脚(有背光),其各个引脚接线及作用说明如下:(3)实验中遇到的问题:在电路接线工作完成以后,上电实验时LCD只有背光,无任何显示。

问题原因分析:在接线过程中,我最为关注的是RS、R/W、E三个端口的接线,忽视了D0~D7的接线顺序,从而使D7~D0的方向接反。

因此1602内部的11条指令码都会对应不上,例如清屏指令是0x01,而我则需要写成0x20。

所以按照正常程序指令,在初始化之后,屏幕会一直没有显示。

(4)实验小结:在完成电路图之后觉得本次的接线相对来说比较简单。

心想只要接好RS、R/W、E正负极不反接,就没什么问题。

结果却出乎我的意料,看是简单的D0~D7八个端口的顺序同样起着关键的作用。

因自己的忽视,使我在完成接线之后长时间找不到问题原因之所在。

这次的接线也很好的提醒了我,看似简单的工作,可千万不敢再掉意轻心。

2、能进行数字和字符的显示并将实验四中的“单片机时钟”改为1602显示。

(1) 实验原理:LCD6102的显示方式是先从DDRAM写入要显示地址,在往DDRAM写入要显示的字符码。

控制其操作的有11条LCD1602的内部指令,具体如下:指令1:清显示;指令2:光标复位,光标复位到地址00H;指令3:光标和显示模式设置;I/D:光标移动方向,高电平左移,低电平右移S:屏幕上所有文字是否左移或者右移(高电平有效,低电平无效)指令4:显示开关控制;D:控制整体显示开关,高电平表示开,低电平表示关C:控制光标的开关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标显示移位;S/C:高电平时移动显示文字,低电平时移动显示光标指令6:功能设置命令;DL:高电平时为四位总线,低电平时为八位总线N:低电平时为单行显示,高电平时为双行显示F:低电平时为5x7点阵字符,高电平时为5x10点阵字符指令7:字符发生器存储器地址:指令8:DDRAM地址设置指令9:读忙信号和光标地址BF为忙标志高电平表示忙,此时模块不能接收命令或者数据,低电平表示不忙指令10:写数据指令11:读数据时序控制:读状态:输入RS=0 R/W=1 E=1 输出:D0~D7=状态字写指令:输入RS=0 R/W=1 D0~D7=指令码E=高脉冲输出:无读数据:输入RS=1 R/W=1 E=1 输出:D0~D7=数据写数据:输入RS=1 R/W=0 D0~D7=数据E=高脉冲输出:无(2)程序流程图如下所示:(3)实验中遇到的问题按下4#键时钟显示减1,当显示为00后,继续减1,会出现ASCLL在0之后的码。

实验八 LCM1602液晶显示实验

实验八 LCM1602液晶显示实验

实验九 LCM1602液晶显示实验一、实验目的1.掌握keil C51软件与protues软件联合仿真调试的方法;2.掌握LCM1602液晶模块显示西文的原理及使用方法;3.掌握用8位数据模式驱动LCM1602液晶的C语言编程方法;二、实验仪器与设备1、微机一台 2 keilC51集成开发环境 3 Protues仿真软件三、实验内容1.用protues设计一LCM1602液晶显示接口电路。

要求利用P0接LCM1602液晶的数据端,P2.0~P2.2做LCM1602液晶的控制信号输入端。

P3.0~P3.4口扩展4个功能键K1~K4,电路如下2.编写程序,实现字符的静态和动态显示,字符为第一行“姓名全拼”第二行“专业全拼+学号”。

液晶的初始化,字符显示程序可参考官网的程序文件。

3.编写程序,利用功能键实现字符的纵向滚动和横向滚动等效果显示,显示字符如下:1.姓名全拼2.专业全拼+学号3.MCS-51 EXP84.LCD DISPLAY 主程序静态显示“My Informatiom”5.实验源程序见附录。

6.实验电路图:四、实验说明液晶显示的原理:采用的LCDxianshiping都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背景层,背景层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元产生扭曲,从而经穿过其中的光线进行有规则的折射,然后经过第二层过滤在屏幕生显示出来。

1、LCM1602采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接第二脚:VDD接5V正电源。

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

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

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

#include <reg51.h>#include <intrins.h>#include <stdio.h>#include <stdlib.h>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<n;i++)delay1ms();}/************************************函数功能:判断液晶模块的忙碌状态返回值:result。

result=1,忙碌;result=0,不忙。

************************************/bit BusyTest(void){bit result;RS=0; //根据规定,RS为低电平、RW为高电平时,可以读状态RW=1;E=1; //E=1,才允许读/写_nop_();_nop_();_nop_();_nop_();result=BF; //将忙碌标志电平赋给resultE=0;return result;}/*************************************函数功能:将模式设置指令或显示地址写入液晶模块入口参数:dictate**************************************/void WriteInstruction(unsigned char dictate){while(BusyTest()==1); //如果忙就等待RS=0; //根据规定,RS和R/W同为低电平时,可以写入指令RW=0;E=0;_nop_();_nop_();P0=dictate; //将数据送入P0口,即写入指令或地址_nop_();_nop_();_nop_();_nop_();E=1; //E置高电平_nop_();_nop_();_nop_();_nop_();E=0;}/*****************************************函数功能:指定字符显示的实际地址入口参数:x,y*****************************************/void WriteAddress(unsigned char x,unsigned char y){unsigned char temp;if(x==0){switch(y){case 0:temp=0x00; break;case 1:temp=0x01; break;case 2:temp=0x02;break;case 3:temp=0x03;break;case 4:temp=0x04;break;case 5:temp=0x05;break;case 6:temp=0x06;break;case 7:temp=0x07;break;case 8:temp=0x08;break;case 9:temp=0x09;break;case 10:temp=0x0a;break;case 11:temp=0x0b;break;case 12:temp=0x0c;break;case 13:temp=0x0d;break;case 14:temp=0x0e;break;case 15:temp=0x0f;break;}}if(x==1){switch(y){case 0:temp=0x40;break;case 1:temp=0x41;break;case 2:temp=0x42;break;case 3:temp=0x43;break;case 4:temp=0x44;break;case 5:temp=0x45;break;case 6:temp=0x46;break;case 7:temp=0x47;break;case 8:temp=0x48;break;case 9:temp=0x49;break;case 10:temp=0x4a;break;case 11:temp=0x4b;break;case 12:temp=0x4c;break;case 13:temp=0x4d;break;case 14:temp=0x4e;break;case 15:temp=0x4f;break;}}WriteInstruction(temp|0x80); //显示位置的确定方法规定为“80H+地址码x”}/*****************************************函数功能:将数据(字符的标准ASCII码)写入液晶模块入口参数:y*****************************************/void WriteData (unsigned char y){while(BusyTest()==1);RS=1; //RS为高电平,RW为低电平时,可以写入数据RW=0;E=0;P0=y; //将数据送入P0口,即将数据写入液晶模块_nop_();_nop_();_nop_();_nop_();E=1;_nop_();_nop_();_nop_();_nop_();E=0; //当E由高电平跳变成低电平时,液晶模块开始执行指令}/*****************************************函数功能:对LCD的显示模式进行初始化设置*****************************************/void LcdInitiate(void){delaynms(15); //延时15ms,首次写指令时应给LCD一段较长的反应时间WriteInstruction(0x38); //显示模式设置delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x38);delaynms(5);WriteInstruction(0x0c); //显示模式设置:显示开,无光标,光标不闪烁delaynms(5);WriteInstruction(0x06); //显示模式设置:光标右移,字符不移delaynms(5);WriteInstruction(0x01); //清屏幕指令,将以前的显示内容清除delaynms(5);}/***************************************函数功能:显示字符串***************************************/void display_error(){unsigned char i;WriteAddress(0,0);i=0;while(Error[i]!='\0'){WriteData(Error[i]);i++;delaynms(100);}}void display_systemerror(){unsigned char i;WriteAddress(0,0);i=0;while(Systemerror[i]!='\0'){WriteData(Systemerror[i]);i++;delaynms(100);}}void display_lcd(){unsigned char i;WriteAddress(0,0);i=0;while(Lcd[i]!='\0'){WriteData(Lcd[i]);i++;delaynms(100);}}/*************************** 函数功能:按键判断**************************/bit judge(){unsigned char keycode;P1=0x0f;keycode=P1;if(keycode==0x0f)return(0);elsereturn(1);}/*****************************函数功能:键盘扫描*****************************/ unsigned char scan(){unsigned char keycode,keyscan;keyscan=0xef;while(keyscan!=0xff){P1=keyscan;keycode=P1;if((keycode&0x0f)!=0x0f)break;keyscan=(keycode<<1)|0x0f;}keycode=~keycode;return(keycode);}/*******************************函数功能:扫描键盘返回值******************************/ unsigned char Key_Num(){unsigned char keycode;unsigned char yong;if(judge()){delaynms(20);if(judge()){keycode=scan();while(judge());switch(keycode){case 0x11:yong='7';break;case 0x12:yong='4';break;case 0x14:yong='1';break;case 0x18:yong=0;break;case 0x21:yong='8';break;case 0x22:yong='5';break;case 0x24:yong='2';break;case 0x28:yong='0';break;case 0x41:yong='9';break;case 0x42:yong='6';break;case 0x44:yong='3';break;case 0x48:yong='=';break;case 0x81:yong='/';break;case 0x82:yong='*';break;case 0x84:yong='-';break;case 0x88:yong='+';break;default:display_systemerror() ;}return(yong);}}elsereturn(0xff);}/************************************** itoa函数定义*********************************/ unsigned char itoa(long int num){unsigned char i,j,L;unsigned char temp[16];for(i=0;num!=0;i++){temp[i]=num%10+48;num=num/10;}L=i;if(i>16){display_systemerror();}for(j=0;j<=L;j++){str[j]=temp[i];i--;}return(L);}/*****************************************函数功能:主函数****************************************/void main(){long int a;long int b;unsigned char flag;unsigned char sign;unsigned char i,j,s,x;unsigned char num;unsigned char fgh;unsigned char temp[16];LcdInitiate();display_lcd();delaynms(20);WriteInstruction(0x01);flag=1;while(1){num=Key_Num();if(num!=0xff){if(fgh==1){WriteInstruction(0x01);fgh=0;}if((num!='+')&&(num!='-')&&(num!='*')&&(num!='/')&&(num!='.')&&(num!='=')){if(flag==1){a=a*10+num-48;}else{b=num-48+b*10;}}if(num==0){i=0;flag=1;a=0;b=0;WriteInstruction(0x01);}if((num=='+')||(num=='-')||(num=='*')||(num=='/')){flag=0;switch(sign){case '+':a=a+b;break;case '-':a=a-b;break;case '*':a=a*b;break;case '/': {if(b!=0){ a=a/b;break; }else{WriteInstruction(0x01);flag=1;WriteAddress(0,1);display_error();delaynms(40);WriteInstruction(0x01);break;}}default:break;}sign=num;b=0;}if(num=='='){flag=1;switch(sign){case '+':a=a+b;break;case '-':a=a-b;break;case '*':a=a*b;break;case '/':a=a/b;break;default:break;}temp[i]=num;WriteAddress(0,i);WriteData(num);for(s=0;s<16;s++)temp[s]=0;s=0;//WriteAddress(1,8);//WriteData(a+48);x=itoa(a); //函数转换WriteAddress(1,1);while(s<=x){WriteData(str[s]);s++;delaynms(100);}sign=0;a=b=0;j=0;for(s=0;s<16;s++)str[s]=0;s=0;fgh=1;i=0;}if(i<16){if(num!='='){if((i==1)&& (temp[0]=='0') )//如果第一个字符是0,判读第二个字符{temp[0]=num; //如果是1-9数字,说明0没有用,则直接替换第一位0WriteAddress(0,0);//输出数据WriteData(num);}else{temp[i]=num;WriteAddress(0,i);//输出数据WriteData(num);i++; //输入数值累加}}}else{i=0;WriteInstruction(0x01);}}}}枯藤老树昏鸦,小桥流水人家,古道西风瘦马。

相关文档
最新文档