1602显示源程序

合集下载

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

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

实验三 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.专业全拼+学号EXP8DISPLAY ”主程序静态显示“ My information!”四、实验原理液晶显示的原理:采用的 LCD显示屏都是由不同部分组成的分层结构,位于最后面的一层是由荧光物质组成的可以发射光线的背光层,背光层发出的光线在穿过第一层偏振过滤层之后进入包含成千上万水晶液滴的液晶层,液晶层中的水晶液滴都被包含在细小的单元格结构中,一个或多个单元格构成屏幕上的一个像素。

当 LCD中的电极产生电场时,液晶分子就会产生扭曲,从而将穿越其中的光线进行有规则的折射,然后经过第二层过滤层的过滤在屏幕上显示出来。

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

LCD1602液晶显示器

LCD1602液晶显示器

实验11:1602液晶显示屏显示(字符型液晶显示器)字符型液晶显示器用于数字、字母、符号并可显示少量自定义符号。

这类液晶显示器通常有16根接口线,下表是这16根线的定义。

字符型液晶接口说明编号符号引脚说明编号符号引脚说明1 Vss 电源地 9 D2 数据线22 Vdd 电源正 10 D3 数据线33 VL 液晶显示偏压信号 11 D4 数据线44 RS 数据/命令选择端 12 D5 数据线55 R/W 读/ 写选择端 13 D6 数据线66 E 使能信号 14 D7 数据线77 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结尾。

如果字符串的长度超过了从该列开始可显示的最多字符数,则其后字符被截断,并不在下行显示出来。

基于51单片机的红外遥控+液晶LCD1602显示程序源代码

基于51单片机的红外遥控+液晶LCD1602显示程序源代码

基于51单片机的红外遥控+液晶LCD1602显示程序源代码/*******************红外遥控+液晶LCD1602测试程序源代码******************** 单片机型号:STC15W4K56S4,内部晶振:22.1184M。

功能:红外遥控+液晶LCD1602显示功能测试。

操作说明:按下红外遥控器上的“CH-”键,液晶LCD1602上显示“CH-”。

按下红外遥控器上的“CH”键,液晶LCD1602上显示“CH”。

按下红外遥控器上的“CH+”键,液晶LCD1602上显示“CH+”。

按下红外遥控器上的“|<<”键,液晶LCD1602上显示“|<<”。

按下红外遥控器上的“>>|”键,液晶LCD1602上显示“>>|”。

按下红外遥控器上的“>||”键,液晶LCD1602上显示“>||”。

按下红外遥控器上的“-”键,液晶LCD1602上显示“-”。

按下红外遥控器上的“+”键,液晶LCD1602上显示“+”。

按下红外遥控器上的“EQ”键,液晶LCD1602上显示“EQ”。

按下红外遥控器上的“0”键,液晶LCD1602上显示“0”。

按下红外遥控器上的“100+”键,液晶LCD1602上显示“100+”。

按下红外遥控器上的“200+”键,液晶LCD1602上显示“200+”。

按下红外遥控器上的“1”键,液晶LCD1602上显示“1”。

按下红外遥控器上的“2”键,液晶LCD1602上显示“2”。

按下红外遥控器上的“3”键,液晶LCD1602上显示“3”。

按下红外遥控器上的“4”键,液晶LCD1602上显示“4”。

按下红外遥控器上的“5”键,液晶LCD1602上显示“5”。

按下红外遥控器上的“6”键,液晶LCD1602上显示“6”。

按下红外遥控器上的“7”键,液晶LCD1602上显示“7”。

按下红外遥控器上的“8”键,液晶LCD1602上显示“8”。

1602例程

1602例程

实验48.利用1602液晶显示"TJPU DIANQI"1.实验任务(就是程序的功能简介)利用AT89S51单片机的P1.0、P1.1、P1.2分别作为液晶的命令选择端、读写选择端和使能端,同时利用P0口作为数据输出端,将 "TJPU DIANQI"字符数据存入液晶DDRAM中,并在液晶中显示。

2.电路原理图图4.18.13.系统板硬件连线(注释:是否有跳线等)将1602液晶与系统板上的液晶接口对应相连即可。

4.元器件(或芯片)功能介绍1602是指显示的内容为16*2,即可以显示两行,每行16个字符。

目前市面上字符液晶绝大多数是基于HD44780液晶芯片的,控制原理是完全相同的,因此基于HD44780写的控制程序可以很方便地应用于大部分的字符型液晶。

1)、读状态:输入:RS=L,RW=H,E=H 输出:D0-D7=状态字2)、写指令:输入:RS=L,RW=L,D0-D7=指令码,E=高脉冲输出:无3)、读数据:输入:RS=H,RW=H,E=H 输出:D0-D7=数据4)、写数据:输入:RS=H,RW=L,D0-D7=数据,E=高脉冲输出:无附图:5. 程序设计方法 (介绍如何实现的,使用了那些资源。

) (1)初始化(2)显示字符由于STC89C52单片机引脚驱动能力有限,首先需通过单片机P2.2端口对锁存器锁存,以增加P0口对1602液晶显示器的驱动能力。

然后将所要显示的字符或字符串存入数组,输入液晶显示的首行地址指令0x80。

利用for循环,使地址相应加一,并依次写入所要显示的字符或字符串。

7.C语言源程序(带寄存器的语句要加注释;循环语句,条件语句整体加注释。

)#include<reg52.h>#define uchar unsigned char#define uint unsigned intsbit lcden=P1^2; //液晶使能端sbit lcdrs=P1^0; //液晶数据命令选择端sbit lcdrw=P1^1; //液晶读写选择端sbit duan=P2^2; //申明U4锁存器的锁存端void delay_ms(unsigned int z) //延时子函数{unsigned int x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void Write_command(unsigned char com){lcdrs=0; //根据规定,RS和R/W同时为低电平时,可以写入指令lcdrw=0;lcden=0; //E置低电平,根据写操作时序,写指令时E为高脉冲,即让E从0到1发送正跳变,所以应先置0P0=com; //将指令或地址送入数据口P0delay_ms(5); //延时5ms给硬件一个反应时间lcden=1; //E置高电平,产生正跳变delay_ms(5); //延时5ms给硬件一个反应时间lcden=0; //当E由高电平跳变成低电平时,LCD开始执行命令}void Write_data(unsigned char shuju){lcdrs=1; //RS为高电平,R/W为低电平时,可以写入数据lcdrw=0;lcden=0; //E置低电平,根据写操作时序,写指令时E为高脉冲,即让E从0 到1发送正跳变,所以应先置0P0=shuju; //将数据送入P0口,即将数据写入LCDdelay_ms(5); //延时5ms给硬件一个反应时间lcden=1; //E置高电平,产生正跳变delay_ms(5); //延时5ms给硬件一个反应时间lcden=0; //当E由高电平跳变成低电平时,LCD开始执行命令}/*void Write_Str(uint *s){while(*s++){Write_data(*s);delay_ms(5);}} */void Initiate(){Write_command(0x38);//设置16X2显示,5X7点阵,8位数据接口Write_command(0x0c);//设置开显示,不显示光标Write_command(0x06);//写一个字符后地址指针加01Write_command(0x01);//显示清零,数据指针清零}void Main(){uchar i;uchar S[]="TJPU DIANQI";//duan=1;P0=0x00;delay_ms(1);duan=0;Initiate();for(i=0;i<11;i++){Write_command(0x80+2+i);Write_data(S[i]);}while(1); //程序终止于此处}8,实验结果,(有波形的用示波器测波形,有现象的拍照片)。

LCD1602液晶显示实验

LCD1602液晶显示实验

LCD1602液晶显示实验1.实验原理1.1 基本原理1.1.1 1602字符型LCD简介字符型液晶显示模块是一种专门用于显示字母、数字、符号等点阵式LCD,目前常用16*1,16*2,20*2和40*2行等的模块。

1.1.2 1602LCD的基本参数及引脚功能1602LCD分为带背光和不带背光两种,基控制器大部分为HD44780,带背光的比不带背光的厚,是否带背光在应用中并无差别,两者尺寸差别如下图1-2所示:图1-2 1602LCD尺寸图1.1602LCD主要技术参数:显示容量: 16×2个字符芯片工作电压: 4.5~5.5V工作电流: 2.0mA(5.0V)模块最佳工作电压: 5.0V字符尺寸: 2.95×4.35(W×H)mm2.引脚功能说明:1602LCD采用标准的14脚(无背光)或16脚(带背光)接口,各引脚接口说明如表:表1-3引脚接口说明表编符号引脚说明编号符号引脚说明号1 VSS 电源地9 D2 数据2 VDD 电源正极10 D3 数据3 VL 液晶显示偏压11 D4 数据4 RS 数据/命令选择12 D5 数据5 R/W 读/写选择13 D6 数据6 E 使能信号14 D7 数据7 D0 数据15 BLA 背光源正极8 D1 数据16 BLK 背光源负极1.1.3 1602LCD的指令说明及时序1602液晶模块内部的控制器共有11条控制指令,如表1-4所示:表1-4 控制命令表序号指令RS R/W D7 D6 D5 D4 D3 D2 D1 D01 清显示0 0 0 0 0 0 0 0 0 12 光标返回0 0 0 0 0 0 0 0 1 *3 置输入模式0 0 0 0 0 0 0 1 I/D S4 显示开/关控制0 0 0 0 0 0 1 D C B5 光标或字符移位0 0 0 0 0 1 S/C R/L * *6 置功能0 0 0 0 1 DL N F * *7 置字符发生存贮器地址0 0 0 1 字符发生存贮器地址8 置数据存贮器地址0 0 1 显示数据存贮器地址9 读忙标志或地址0 1 BF 计数器地址10 写数到CGRAM或DDRAM)1 0 要写的数据内容11 从CGRAM或DDRAM读数1 1 读出的数据内容1602液晶模块的读写操作、屏幕和光标的操作都是通过指令编程来实现的。

52单片机源程序C语言版

52单片机源程序C语言版

IT0=0; EX0=1; wela=1; P0=0x00; wela=0; while(1) {
for(num=0;num<16;num++) {
dula=1; P0=table[num]; dula=0; delay(200); } } }
{ for(a=100;a>0;a--) for(b=225;b>0;b--);
} void main() {
k=0xfe; while(1) {
delay10ms();
beep=0; delay10ms(); beep=1; j=_crol_(k,1); k=j; P1=j; } } 五、数码管试验 #include<reg52.h> sbit dula=P2^6; sbit wela=P2^7; unsigned char num; unsigned code table[]= {0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; void delay(unsigned int y) { unsigned int a,b; for(a=y;a>0;a--) for(b=0;b<500;b++); } void main() { EA=1;
//广告灯向左移动移动函数
{
a=temp<<count;
b=temp>>(8-count);
P1=a|b; }
main() {
count=0; //初始华参数设置 temp=0xfe; P1=0xff; P1=temp; while(1) //永远循环,扫描判断按键是否按下 {

单片机课程设计——利用矩阵键盘来控制1602液晶显示器的显示设计

单片机课程设计——利用矩阵键盘来控制1602液晶显示器的显示设计

《单片机原理及应用课程设计》报告——利用矩阵键盘来控制1602液晶显示器的显示设计2011年12 月7 日目录1.课程设计的目的12.课程设计的要求3.硬件设计3.1设计思想3.2主要元器件介绍3.3.功能电路介绍3.31 1602液晶显示器3.32 3*4矩阵键盘(1)矩阵式键盘的结构与工作原理(2)矩阵式键盘的按键识别方法4.软件设计4.1设计思想4.2软件流程图4.3源程序:5.调试运行6.设计心得体会:1.课程设计目的1.1巩固和加深对单片机原理和接口技术知识的理解;1.2培养根据课题需要选学参考书籍、查阅手册和文献资料的能力;1.3学会方案论证的比较方法,拓宽知识,初步掌握工程设计的基本方法;1.4掌握常用仪器、仪表的正确使用方法,学会软、硬件的设计和调试方法;1.5能按课程设计的要求编写课程设计报告,能正确反映设计和实验成果,能用计算机绘制电路图和流程图。

2.课程设计要求2.1在3*4矩阵键盘上输入信息2.2在1602芯片上显示时间信息。

2.3显示数据的设计与变换3.硬件设计3.1设计思想在3*4矩阵键盘上输入信息,通过中央处理器处理信息,再通过1602液晶显示器显示信息。

3.2主要元器件介绍(1)电源电路(2)STC89C82RC单片机一块。

(3)1602液晶显示器一块(4)杜邦线若干。

(5)3*4矩阵键盘3.3.功能电路介绍3.31 1602液晶显示器液晶显示模块具有体积小、功耗低、显示内容丰富等特点,现在字符型液晶显示模块已经是单片机应用设计中最常用的信息显示器件了。

1602可以显示2行16个字符,有8位数据总线D0-D7,和RS、R/W、EN三个控制端口,工作电压为5V,并且带有字符对比度调节和背光。

1602外观如下图所示1602引脚说明注意事项:从该模块的正面看,引脚排列从右向左为:15脚、16脚,然后才是1-14脚(线路板上已经标明)。

VDD:电源正极,4.5-5.5V,通常使用5V电压;VL:LCD对比度调节端,电压调节范围为0-5V。

基于单片机的LCD1602液晶显示器设计

基于单片机的LCD1602液晶显示器设计
参考文献:
[1]李玺梅.基于单片机的液晶显示器设计分析[J].山东工业技术.2017
[2]许思达.基于51单片机的TFT液晶显示设计[J].电子元器件应用.2010
[3]李光飞.单片机C程序设计实例指导[M].北京:北京航空航天大学出版社.2005
图1
采用KEIL开发的89c51单片机应用程序一般需要以下步骤:
(1)在uVision集成开发环境中创建新项目(Project),扩展文件名为.UV2,并为该项目选定合适的单片机CPU器件(本设计采用ATMEL公司下的AT89C51)。
(2)用uVision的文本编辑器编写源文件,可以是汇编文件(.ASM),也可以使C语言文件(扩展名.C),并将该文件添加到项目中去。一个项目文件可以包含多个文件,除了源程序文件外,还可以是库文件、头文件或文本说明文件。
(5)单击仿真工具栏中的仿真键,观察仿真结果,可以看到“Have a nice day”字样。可以按暂停、继续、单步、等按钮,查看效果。
四、结论
本次设计结合硬件设计、软件设计和仿真调试三个方面来阐述利用单片机设计和LCD液晶显示器进行显示的任务。单片机技术在日常生活中的使用,使得生活更加的多姿多彩、智能化、操作便利化,并在日常生活中得到了广泛的应用,随着科学技术的创新与计算机技术的不断发展,单片机将朝着更高的应用水平、更多的集成部件、更强大的功能方向发展,更好地造福于人类。
基于单片机的LCD1602液晶显示器设计
摘要:在日常生活中,我们对液晶显示(LCD)并不陌生,LCD智能显示模块不但可以显示字符,汉字和图形,同时具有可编程功能,且与单片机接口比较方便,如液晶显示模块已作为很多电子产品的通用器件,如在计算器,万用表,电子表及很多家用电子产品中都可以看到,显示的主要是数字,专用符号和图形。在单片机系统中应用中用液晶显示作为输出器件有很多优点,如显示质量高,不闪烁;数字接口式,使得和单片机的接口更加简单可靠,操作方便;体积小,重量轻;而且相对而言,液晶显示器的功耗主要消耗在其内部的电极和驱动TC上,因而耗电量比其它显示器要少得多。

LCD1602动态显示按键设置数据99倒数

LCD1602动态显示按键设置数据99倒数

LCD1602动态显⽰按键设置数据99倒数⼀、程序源码:#include "reg52.h"//此⽂件中定义了单⽚机的⼀些特殊功能寄存器#define uint unsigned int //定义常⽤数据类型替代码#define uchar unsigned char#define dat P0 //定义LCD1602的数据⼝为P0sbit k0=P2^0; //定义K0按键为P20sbit k1=P2^1; //定义K0按键为P21sbit k2=P2^2; //定义K0按键为P22sbit k3=P2^3; //定义K0按键为P23sbit rs=P1^4; //定义RS⼝为P14sbit rw=P1^5; //定义RW⼝为P15sbit e=P1^6; //定义E⼝为P16uchar busy; //1602判忙标志uchar table0[16]={"0123456789"};uchar table1[16]={"Begin:"};uint i=0;uint j=0;uint temp;uchar key_mode=0;int k=99;void delay(unsigned int i){while(i--);}void delay_1ms(void) //延时程序{uchar i,j;for(i=0;i<10;i++)for(j=0;j<20;j++);}void busy_1602(void) //查询忙碌标志信号程序{do{e=0;rw=1;rs=0;e=1;busy=dat;e=0;delay_1ms();} while(busy&&0x10==1);}void com_1602(uchar a) //写指令到LCM程序{busy_1602();e=0;rw=0;rs=0;e=1;dat=a;e=0;}void dat_1602(uchar a) //写数据到LCM程序{busy_1602();e=0;rw=0;rs=1;e=1;dat=a;e=0;}void int_1602(void) //启动LCM程序{com_1602(0x38);com_1602(0x0c);com_1602(0x06);com_1602(0x01);}void displaySet(int d){uchar rev_data[16]={"-Count Reform!- "}; com_1602(0x80);//第⼀⾏for(i=0;i<16;i++){dat_1602(rev_data[i]);}com_1602(0xc0); //发送数据第⼆⾏for(i=0;i<6;i++){dat_1602(table1[i]);}com_1602(0xc6);dat_1602(table0[d/10]);dat_1602(table0[d%10]);}void displayStatic99(int d){uchar rev_data[16]={"-99 Countdown!- "}; com_1602(0x80);//第⼀⾏for(i=0;i<16;i++){dat_1602(rev_data[i]);}com_1602(0xc0); //发送数据第⼆⾏for(i=0;i<6;i++){dat_1602(table1[i]);}com_1602(0xc6);dat_1602(table0[d/10]);dat_1602(table0[d%10]);}void displayStatic00(){uchar rev_data[16]={"-99 Countdown!- "}; com_1602(0x80);//第⼀⾏for(i=0;i<16;i++){dat_1602(rev_data[i]);}com_1602(0xc0); //发送数据第⼆⾏for(i=0;i<6;i++){dat_1602(table1[i]);}com_1602(0xc6);dat_1602('0');dat_1602('0');}void displayDynamic(int d){uchar rev_data[16]={"-99 Countdown!- "}; com_1602(0x80);//第⼀⾏for(i=0;i<16;i++){dat_1602(rev_data[i]);}com_1602(0xc0); //发送数据第⼆⾏for(i=0;i<6;i++){dat_1602(table1[i]);}com_1602(0xc6);while(d>=0){dat_1602(table0[d/10]);dat_1602(table0[d%10]);delay(50000);d--;com_1602(0xc6);}}void keypros(){if(k0==0) //检测按键K1是否按下 {delay(1000); //消除抖动⼀般⼤约10msif(k0==0) //再次判断按键是否按下{key_mode=1;}while(!k0); //检测按键是否松开}if(k3==0) //检测按键K1是否按下{delay(1000); //消除抖动⼀般⼤约10msif(k3==0) //再次判断按键是否按下{key_mode=0;}while(!k3); //检测按键是否松开}if(k1==0) //检测按键K1是否按下{delay(1000); //消除抖动⼀般⼤约10msif(k1==0) //再次判断按键是否按下{key_mode=2;if(k<99){k+=1;}}while(!k1); //检测按键是否松}if(k2==0) //检测按键K1是否按下{delay(1000); //消除抖动⼀般⼤约10msif(k2==0) //再次判断按键是否按下{key_mode=2;k-=1;}while(!k2); //检测按键是否松}}/******************************************************************************* * 函数名 : main* 函数功能 : 主函数* 输⼊ : ⽆* 输出 : ⽆*******************************************************************************/ void main(){int_1602();while(1){keypros();if(key_mode==0){displayStatic99(k);}if(key_mode==1){displayDynamic(k);key_mode=3;}if(key_mode==2){displaySet(k);}if(key_mode==3){displayStatic00();}}}。

例程20-1602液晶

例程20-1602液晶

亚博科技
Arduino视频教程
lcd.setCursor(0,1); //把光标定位在第1行,第0列 lcd.print("Arduino is fun"); //显示 delay(2000); } } void loop() {}//初始化已完成显示,主循环无动作
亚博科技
Arduino视频教程
1602LCD主要技术参数 显示容量为16×2个字符; 芯片工作电压为4.5~5.5V; 工作电流为2.0mA(5.0V); 模块最佳工作电压为5.0V; 字符尺寸为2.95×4.35(W×H)mm。
亚博科技
Arduino视频教程
1602采用标准的16脚接口,其中: 第1脚:VSS为地电源 第2脚:VDD接5V正电源 第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱, 接地电源时对比度最高,对比度过高时会产生“鬼影”,使用时 可以通过一个10K的电位器调整对比度 第4脚:RS为寄存器选择,高电平时选择数据寄存器、低电平时 选择指令寄存器。 第5脚:R/W为读写信号线,高电平时进行读操作,低电平时进行 写操作。当RS和RW共同为低电平时可以写入指令或者显示地址, 当RS为低电平RW为高电平时可以读信号,当RS为高电平RW为 低电平时可以写入数据。 第6脚:E端为使能端,当E端由高电平跳变成低电平时,液晶模 块执行命令。 第7~14脚:D0~D7为8位双向数据线。 第15脚:背光电源正极 第16脚:背光电源负极
亚博科技
Arduino视频教程
在Arduino的安装目录下\libraries\LiquidCrystal可 以查看到函数的原型
LiquidCrystal()——定义你的LCD的接口:各个引脚连接的I/O口编号,格式为 LiquidCrystal(rs, enable, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d4, d5, d6, d7) LiquidCrystal(rs, enable, d0, d1, d2, d3, d4, d5, d6, d7) LiquidCrystal(rs, rw, enable, d0, d1, d2, d3, d4, d5, d6, d7) begin()——定义LCD的长宽(n列×n行),格式lcd.begin(cols, rows) clear()——清空LCD,格式lcd.clear() home()——把光标移回左上角,即从头开始输出,格式lcd.home() setCursor()——移动光标到特定位置,格式lcd.setCursor(col, row) write()——在屏幕上显示内容(必须是一个变量,如”Serial.read()”),格式 lcd.write(data) print()——在屏幕上显示内容(字母、字符串,等等),格式lcd.print(data) lcd.print(data, BASE)

LCD1602原理及显示程序

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字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。

1602cgram定义

1602cgram定义

1602cgram定义
1602cgram是指一种专门用于在液晶显示器(LCD)中实现用户自定义图形的技术。

它是一种图形RAM,可以通过LCD内部控制器编程,以显示自定义图形。

具体来说,cgram允许用户在其内存储图形或字符代码,并通过LCD内部控制器将其在屏幕上显示出来。

在实现自定义图形时,可以通过操作外部命令/数据端口或控制寄存器来实现。

通常,使用Verilog语言编写的LCD1602驱动程序可以实现基于FPGA的LCD1602驱动,也可以在编程流程中定义管脚、初始化LCD并显示字符或字符串等步骤。

作为一种点阵式液晶显示器,LCD1602由5X7或5X11等点阵字符位组成,工作电压为5V,可显示2行16个字符,共有16个引脚,其中包括8位数据总线D0-D7和3个控制端口RS、R/W、EN。

通过合理使用cgram技术,可以在LCD左上角显示字符A,也可以在任意地址显示任意字母和数字。

例如,在程序编写流程中,可以定义cgram的起始地址和数据长度,编写绘制图形的代码,并使用RS、R/W、EN等控制端口进行输出。

总的来说,1602cgram是一种非常有用的技术,它可以使LCD实现更加丰富的图形和字符显示,使得LCD更加灵活和可定制。

3.4 单片机控制液晶显示模块1602 LCD的显示

3.4 单片机控制液晶显示模块1602 LCD的显示
例如,要写字符到DDRAM的40H处,则 命令8的格式为:
80H+40H=C0H,其中80H为命令代码, 40H是要写入字符处的地址。
5.5.1 LCD 1602液晶显示模块简介
3.字符显Байду номын сангаас位置的确定
图5-17 LCD内部显示RAM的地址映射图
5.5.1 LCD 1602液晶显示模块简介
4.LCD1602的复位
例如,显示字符“A”,单片机只需将字符“A” 的ASCII码41H写入DDRAM,控制电路就会将对 应的字符库ROM(CGROM)中的字符“A”的点 阵数据找出来显示在LCD上。
模块内有80字节数据显示RAM (DDRAM), 除显示192个字符(5×7点阵)的字符库 ROM(CGROM)外,还有64字节的自定义字符 RAM(CGRAM),用户可自行定义8个5×7点阵字符。
5.5.1 LCD 1602液晶显示模块简介
2.LCD1602字符的显示及命令字
5.5.1 LCD 1602液晶显示模块简介
2.LCD1602字符的显示及命令字 表5-3中11个命令功能说明如下:
命令1:清屏,光标返回地址00H位置(显示屏的左上 方)。 命令2:光标返回到地址00H位置(显示屏的左上方)。 命令3:光标和显示模式设置。
而当写入10H~27H或50H~67H地址处时,字符不会 显示出来,该区域也称为隐藏区域。如果要显示写入到隐藏 区域的字符,需要通过字符移位命令(命令5)将它们移入 到可显示区域方可正常显示。
5.5.1 LCD 1602液晶显示模块简介
3.字符显示位置的确定
需说明的是,在向DDRAM写入字符时, 首先要设置DDRAM定位数据指针,此操作可 通过命令8完成。

51单片机控制LCD液晶1602源代码

51单片机控制LCD液晶1602源代码
void Lcd1602_Clear_Line(unsigned char line);
void Lcd1602_Clear_All(void);
void Lcd1602_Demo1(void);
void Lcd1602_Demo2(void);
void Delay_ms(unsigned char second);
if(++row==3)
return;
else
{
switch(row)//这种结构保持以后升级到多行显示液晶
_nop_();
LCD_EN=HIGH ;
_nop_();
LCD_EN=LOW;
LCD_DATA_PORT=0xFF; //prevent port is 0.
}
//===========================
case 2:Lcd1602_Write_Command(0x80+0x40);break; //将数据地址指针定位到第二行
default: break;
}
}
//==================================================
{
while(1)
{
Lcd1602_Demo1();
// Lcd1602_Demo2();
}
}
void Lcd1602_Ini(void)
{
Delay_ms(20);
Lcd1602_Write_Command_Nocheck(0x38);//设定LCD为16*2显示,5*7点阵,8位数据接口
{
Lcd1602_Write_String(row,column," ");

关于52单片机驱动74HC595控制LCD1602的程序

关于52单片机驱动74HC595控制LCD1602的程序

关于52单片机驱动74HC595控制LCD1602的程序谁能帮忙写个52单片机驱动74hc595控制LCD1602的程序#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int#define LcdBus P0sbit LED1602_RS=P2^6; //LCD端口定义sbit LED1602_RW=P2^5 ;sbit LED1602_EN=P2^4 ;void LcdIni(void);void WrOp(uchar dat);void WrDat(uchar dat);void ChkBusy(void);void print_LCD(uchar disp[],uchar num);//延时n ms子程序void delayms(unsigned int n){unsigned int i,j;for(i=0;i<n;i++)for(j=0;j<120;j++);}main(){uchar disp1[16]={'S','u','n','J','i','e',' ','m','a','d','e','','a','t',' ',' '};uchar disp2[16]={'2','0','0','8',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' ',' '};while(1){LcdIni();WrOp(0x80); //数据指针地址第一行print_LCD(disp1,16);WrOp(0xc0); //第二行print_LCD(disp2,4);delayms(3000);WrOp(0x01);}}/******************************************************************** **********************名称:led1602显示程序模块功能:驱动1602 包括数据口 P1 三个控制口编译:keil作者:孙杰时间:2008-8-9********************************************************************* **********************/void print_LCD(uchar disp[],uchar num) //显示数组disp 显示长度为num {uchar i;for(i=0;i<num;i++){WrDat(disp[i]);delayms(300);}}void LcdIni(){WrOp(0x38);WrOp(0x06); //光标加1WrOp(0x0f); //开显示光标闪烁// WrOp(0x0c); //开显示光标不闪烁}void WrOp(uchar dat){//uchar i;ChkBusy();LED1602_RS=0; //RS=0LED1602_RW=0; //RW=0LED1602_EN=0; //EN=0LcdBus=dat; //送数据LED1602_EN=1; //EN=1delayms(10); //延时LED1602_EN=0; //EN=0}void WrDat(uchar dat){//uchar i;ChkBusy();LED1602_RS=1; //rs=1LED1602_RW=0; //rw=0LED1602_EN=0; //en=0LcdBus=dat; //送数据LED1602_EN=1; //en=1delayms(10);; //延时LED1602_EN=0; //en=0}void ChkBusy(){LED1602_RS=0; //RS=0LED1602_RW=1; //RW=1LED1602_EN=1; //EN=1while(LcdBus&0x80); //送数据LED1602_EN=0; //en=0}74hc595驱动问题#define uc unsigned char#define ui unsigned int#include<iom128v.h>uc Bmp[]={/*------------------------------------------------------------------------------; 源文件 / 文字 :; 宽×高(像素): 64×8; 字模格式/大小 : 单色点阵液晶字模,横向取模,字节正序/64字节; 数据转换日期 : 2009-4-7 11:11:41------------------------------------------------------------------------------*/0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x40,0x40,0x40,0x40,0x40,0x40 ,0x40,0x40,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x10,0x10,0x10,0x10,0x10,0x10 ,0x10,0x10,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x04,0x04,0x04,0x04,0x04,0x04 ,0x04,0x04,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x01,0x01,0x01,0x01,0x01,0x01 ,0x01,0x01};uc B1[8]={0};uc B2[8]={0};void delay(ui n) //延时函数{ui j;ui i;for(i=0;i<n;i++)for(j=0;j<20;j++);}void H_B1(uc h) //十六进制转换为二进制,转换后放在数组B1中{B1[7]=h&0x01;B1[6]=h&0x02;B1[5]=h&0x04;B1[4]=h&0x08;B1[3]=h&0x10;B1[2]=h&0x20;B1[1]=h&0x40;B1[0]=h&0x80;}void H_B2(uc h) //十六进制转换为二进制,转换后放在数组B2中{B2[0]=h&0x01;B2[1]=h&0x02;B2[2]=h&0x04;B2[3]=h&0x08;B2[4]=h&0x10;B2[5]=h&0x20;B2[6]=h&0x40;B2[7]=h&0x80;}void print(void) //扫描函数{uc byte=0;uc j=0;uc row=7; //扫第一行uc column;uc bit=0;uc h=0;PORTD=row; //行数赋给PDH_B1(Bmp[0]);while(1){for(row=7;row!=0xff;row--){PORTD=row; //行数赋给PDPORTF=0X00; //给一个扫描点PORTC=0xff;PORTC=0x00;PORTF=0XFF;for(byte=0;byte<8;byte++){H_B1(Bmp[byte+j]);for(bit=0;bit<8;bit++){//delay(2000);PORTC=0xff; //时钟上升沿//delay(1000);if(B1[bit]==0) PORTE=0Xff;//如果该点不应亮则74_138输出高阻else {PORTE=0X00; delay(40);}//否则输出低电平PORTF=0XFF; //扫描点后面通通熄灭//delay(2000);PORTC=0x00; //时钟下降沿}PORTG=0Xff;//delay(2000);PORTG=0X00;//bit=0;}j+=8;byte=0;}j=0;}}void main(void){DDRC=0XFF; //PC口为时钟输出DDRD=0XFF; //PD为行选,连74_138的ABC输入端DDRF=0XFF; //PF为列选,扫描点,接74_595的DS端DDRE|=0X80; //PE7为输出,74_138使能控制,低电平有效 DDRG =0Xff;PORTG=0X00;PORTE=0XFF; delay(5000); PORTE=0X00; //开机信号//PORTE=0X00;print();}这是我刚写的一个64*8的点阵扫描程序用74HC595做行选,但是没用锁存,可以显示,但亮度很低。

1602液晶显示(年月日时分秒星期)

1602液晶显示(年月日时分秒星期)

电子钟—1602液晶显示(年月日时分秒星期)/* 以下是电子钟的c51源程序,用1602液晶显示,虽然程序很庞大,但容易看懂。

改程序花了我两三天的时间才弄好的,现在放在此分享。

*/#include<AT89X52.H>#include<intrins.h>#define uchar unsigned char#define uint unsigned int#define T 49998#define T1 64536sbit rs=P2^0;sbit rw=P2^1;sbit en=P2^2;uchar key,n,loca=0,allow=0,cout;uchar week;uchar time[6]={0,6,15,12,30,0}; //对应、月、日、时、分、秒?uint year=2009;void delay(uint ms){uint i;for(;ms>0;ms--){for(i=246;i>0;i--);}}void timer0() interrupt 1{TH0=(65536-T)/256;TL0=(65535-T)%256;n++;}void time_addsec(){if(20<=n){n=0;time[5]++; //产生秒}}uchar key_scan(){uchar i,j,key,temp;uchar code scan[]={0xfe,0xfd,0xfb,0xf7};uchar code keyb[]={0x7e,0xbe,0xde,0xee,0x7d,0xbd,0xdd,0xed,0x7b,0xbb,0xdb,0xeb,0x77,0xb7,0xd7,0xe7};for(i=0;i<4;i++){P3=scan[i];_nop_();temp=P3;if(temp!=scan[i]){for(j=0;j<16;j++){if(keyb[j]==P3){delay(50);// while(keyb[j]==P3);//松手操作// delay(20);// while(keyb[j]==P3);key=j+1;break;}if(keyb[j] != P3){key=0;}}}}return key;}bit lcd_bz()//1602检忙{bit v;rs=0;rw=1;en=1;_nop_();v=(bit)(P0&0x80);en=0;return v;}void lcd_wcmd(uchar cmd)//1602写命令{while(lcd_bz());rs=0;rw=0;en=0;_nop_();P0=cmd;_nop_();en=1;_nop_();_nop_();en=0;_nop_();rs=0;}void lcd_wdat(uchar dat)//1602写数据{while(lcd_bz());rs=1;rw=0;en=0;_nop_();P0=dat;_nop_();en=1;_nop_();;en=0;}void lcd_wstr(uchar *str)//1602写字符串{uchar i;for(i=0;str[i]!='\0';i++){lcd_wdat(str[i]);}}void lcd_pos(uchar pos)//光标定位{while(lcd_bz());lcd_wcmd(pos|0x80);}/*void lcd_cur(){switch(loca){case 0 : lcd_pos(0x46); case 1 : lcd_pos(0x49); case 2 : lcd_pos(0x05); case 3 : lcd_pos(0x08); case 4 : lcd_pos(0x0b); }}*/void lcd_rmove()//光标右移{if(1==allow){if(loca >= 0 && loca < 5) {loca++;}}}void lcd_lmove(){if(1==allow){if(loca > 0 && loca <= 5) {loca--;}}}void lcd_addtime()//调时间加{uint dat ;if(1==allow)switch(loca){case 0 :{dat=year;dat++;year=dat;delay(100);break;}case 1 :{dat=time[1];dat++;if(dat>12)dat=1;time[1]=dat;delay(100);break; }case 2 :{dat=time[2];dat++;if(dat>30)dat=1;time[2]=dat;delay(100);break; }case 3 :{dat=time[3];dat++;if(dat>24)dat=1;time[3]=dat;delay(100);break; }case 4 :{dat=time[4];dat++;if(dat>60)dat=1;time[4]=dat;delay(100);break; }case 5 :{dat=time[5];dat++;if(dat>60)dat=1;time[5]=dat;delay(100);break; }}}void lcd_detime()//调时间减{int dat ;if(1==allow)switch(loca){case 0 :{dat=year;dat--;if(dat<0)dat=2000;year=dat;delay(100);break;}case 1 :{dat=time[1];dat--;if(dat<0)dat=12;time[1]=dat;delay(100);break; }case 2 :{dat=time[2];dat--;if(dat<0)dat=30;time[2]=dat;delay(100);break; }case 3 :{dat=time[3];dat--;if(dat<0)dat=23;time[3]=dat;delay(100);break; }case 4 :{dat=time[4];dat--;if(dat<0)dat=59;time[4]=dat;delay(100);break; }case 5 :{dat=time[5];dat--;if(dat<0)dat=59;time[5]=dat;delay(100);break;}}}void function(){uchar key=key_scan();switch(key){case 5 : lcd_lmove();break;case 6 : lcd_rmove();break;case 7 : lcd_addtime();break;case 8 : lcd_detime();break;case 9 : lcd_wcmd(0x0f);allow=1;break; //显示光标case 10 : lcd_wcmd(0x0c);allow=0;break; //关闭光标}}bit year_tell() //判断是否闰年是1 否0{if((year%4 == 0 && year%100 !=0) || year%400 == 0) return 1;else return 0;}uint count1(uint year , uchar mon , uchar day)//以下count1到count3都是为了计算对应的星期{uint m;switch(mon){case 1 : m=366-day; break;case 2 : m=335-day; break;case 3 : m=306-day; break;case 4 : m=275-day; break;case 5 : m=245-day; break;case 6 : m=214-day; break;case 7 : m=184-day; break;case 8 : m=153-day; break;case 9 : m=122-day; break;case 10 : m=92-day; break;case 11 : m=61-day; break;case 12 : m=31-day; break;default : ;}if(!(year%4 == 0 && year%100 != 0 || year%400 == 0)){if(mon<=2){m=m-1;}}return(m);}uint count2(uint year , uchar mon , uchar day){uint m;if(year%4 == 0 && year%100 != 0 || year%400 == 0){m=366-count1(year , mon , day);}else{m=365-count1(year , mon , day);}return m;}uint count3(uint year1 , uint year2){uint m=0;uchar i;uint n=year2-year1;for(i=1;i<n;i++){if((year1+i)%4 == 0 && (year1+i)%100 != 0 || (year1+i)%400 == 0) {m+=366;}else{m+=365;}}return m;}uchar week_tell()//判断对应的星期{uchar w;w=(count1(1901,1,7)+count2(year,time[1],time[2])+count3(1901,year)+1)%7; if(w!=0)return w;else return 7;}void timecount()//时间计算{if(time[5]>=60) //sec{time[5]=0;time[4]++;}if(time[4]>=60)//min{time[4]=0;time[3]++;}if(time[3]>=24)//hour{time[3]=0;time[2]++; //day}switch(time[1]) //mon{case 1 : if(time[2]>=31){time[2]=0; time[1]++;}case 2 :if(1==year_tell()){if(time[2]>29){time[2]=0; time[1]++;}}else{if(time[2]>28){time[2]=0; time[1]++;}}case 3 : if(time[2]>=31){time[2]=0; time[1]++;}case 4 : if(time[2]>=30){time[2]=0; time[1]++;}case 5 : if(time[2]>=31){time[2]=0; time[1]++;}case 6 : if(time[2]>=30){time[2]=0; time[1]++;} case 7 : if(time[2]>=31){time[2]=0; time[1]++;} case 8 : if(time[2]>=31){time[2]=0; time[1]++;} case 9 : if(time[2]>=30){time[2]=0; time[1]++;} case 10 : if(time[2]>=31){time[2]=0; time[1]++;} case 11 : if(time[2]>=30){time[2]=0; time[1]++;} case 12 : if(time[2]>=31){time[2]=0; time[1]++;} }if(time[1]>12){time[1]=0;year++;}}/*void lcd_clear(){lcd_wcmd(0x01);_nop_();}*/void lcd_display(uchar p)//液晶显示{uchar i,j;uchar str_com[14];str_com[13]=year/1000;str_com[12]=(year/100)%10;str_com[11]=(year%100)/10;str_com[10]=year%10;str_com[9]=time[1]/10;str_com[8]=time[1]%10;str_com[7]=time[2]/10;str_com[6]=time[2]%10;str_com[5]=time[3]/10;str_com[4]=time[3]%10;str_com[3]=time[4]/10;str_com[2]=time[4]%10;str_com[1]=time[5]/10;str_com[0]=time[5]%10;if(0==p)//非设定状态{lcd_pos(0x07);for(i=0,j=0;i<8;i++,j++){if(2==i || 5==i){lcd_wdat(':');j--;}elselcd_wdat(str_com[j]+48);}lcd_pos(0x49);for(i=6,j=6;i<16;i++,j++){if(8==i || 11==i){lcd_wdat('-');j--;}elselcd_wdat(str_com[j]+48);}delay(1 );lcd_wcmd(0x06);lcd_pos(0x4c);switch(week_tell()){case 1 : lcd_wstr("Mon");break;case 2 : lcd_wstr("Tue");break;case 3 : lcd_wstr("Wen");break;case 4 : lcd_wstr("Thu");break;case 5 : lcd_wstr("Fri");break;case 6 : lcd_wstr("Sat");break;case 7 : lcd_wstr("Sun");break;}delay(1 );lcd_wcmd(0x04);}else if(1==p)//时间设定状态{lcd_pos(0x07);lcd_wdat(str_com[0]+48);lcd_wdat(str_com[1]+48);switch(loca) //下面是让光标定在选择位,以便光标稳定的闪烁{case 0 : lcd_pos(0x43);break; case 1 : lcd_pos(0x46);break; case 2 : lcd_pos(0x49);break; case 3 : lcd_pos(0x01);break; case 4 : lcd_pos(0x04);break; case 5 : lcd_pos(0x07);break; }}}void lcd_init()//液晶初始化{delay(15);lcd_wcmd(0x38);delay(5);lcd_wcmd(0x38);delay(5);lcd_wcmd(0x38);while(lcd_bz());lcd_wcmd(0x0e);while(lcd_bz());lcd_wcmd(0x01);}void init(){TMOD=0x11;TH0=(65536-T)/256;TL0=(65536-T)%256;TH1=T1;TL1=T1;EA=1;TR0=1;ET0=1;TR1=0;ET1=1;}main(){init();lcd_init();while(1){// delay(3);// lcd_clear();delay(1 );lcd_wcmd(0x04);time_addsec();timecount();function();lcd_display(1);cout++;if(cout>=50){cout=0;lcd_display(0);}}}//程序到此结束,估计看了有点晕,不过没关系,程序是没有错的,定时很准,经调试在几个小时之后也达到分秒不差,晶振是12M。

1602液晶显示AD程序

1602液晶显示AD程序

1602液晶显示AD程序include#define uchar unsigned char#define uint unsigned intsbit rs=P2^0;sbit en=P2^1;sbit cs=P2^3; //AD片选sbit rd=P2^4;sbit wr=P2^5;uint temp,D1,D2,D3,D4;uint shu;uint AD_read();void delay(uint z);void write_com(uchar com);void write_date(uchar date);void lcd_init();void display(uchar qian,uchar bai,uchar shi,uchar ge);void AD_init();void AD_start();void main(){write_com(0x01);//清屏lcd_init();AD_init ();while(1){AD_start();// while(INTR==1);//AD转换是否结束,结束为低电平//INTR=0;shu=AD_read();shu=shu*196;D1=shu/10000;//整数部分,0.0196v是最小变化量shu=shu%10000;D2=shu/1000;//十分位数shu=shu%1000;D3=shu/100;//百分位数shu=shu%100;D4=shu/10;//千分位数display(D1,D2,D3,D4);//显示LcD1602}}void delay(uint z){uint x,y;for(x=z;x>0;x--)for(y=110;y>0;y--);}void write_com(uchar com) //LCD液晶写入指令{ rs=0;P0=com;en=0;delay(1);en=1;delay(1);en=0;}void write_shu(uchar dat) //LCD液晶写入数据{rs=1;P0=dat;en=0;delay(1);en=1;delay(1);en=0;}void lcd_init(){en=0;write_com(0x01);//清屏write_com(0x06);//指针加减与移动write_com(0x0c);//光标write_com(0x38);//液晶初始化命令}void display(uchar qian,uchar bai,uchar shi,uchar ge) { write_com(0x80+0x02);write_shu('w');write_com(0x80+0x03);write_shu('e');write_com(0x80+0x04);write_shu('i');write_com(0x80+0x06);write_shu('d');write_com(0x80+0x07);write_shu('i');write_com(0x80+0x08);write_shu('n');write_com(0x80+0x09);write_shu('g');// write_com(0x80+0x0b);// write_shu('a');// write_com(0x80+0x0c);// write_shu('o');write_com(0x80+0x44);write_shu(0x30+qian);//0x30代表数字0 write_com(0x80+0x45);write_shu('.');write_com(0x80+0x46);write_shu(0x30+bai);write_com(0x80+0x47);write_shu(0x30+shi);write_com(0x80+0x48);write_shu(0x30+ge);write_com(0x80+0x49);write_shu('V');}void AD_init()//AD初始化函数{cs=1;wr=1;rd=1;}void AD_start()//AD启动{ P1=0xff;cs=0;//开wr=0;wr=1;//写完后关闭cs=1;}uint AD_read() {cs=0;rd=0;delay(1); temp=P1;rd=1;cs=1;return(temp); }。

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

/*--------------------
名称:LCD1602
编写:szjcdz
日期:2010.9
内容:通过标准程序静态显示字符
引脚定义如下:1-VSS 2-VDD 3-V0 4-RS 5-R/W 6-E 7-14 DB0-DB7 15-BLA 16-BLK
------------------------------------------------*/
#include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义#include<stdio.h>
#include<intrins.h>
unsigned int hour,minute,second,count;
sbit RS = P2^1;//Pin4
sbit RW = P1^5; //Pin5
sbit E = P1^6;//Pin6
#define Data P0 //数据端口
char data TimeNum[]=" ";
char data Test1[]=" ";
/******************************************************************/
/* 函数声明*/
/******************************************************************//*********** ****************************************************/
void DelayUs(unsigned char us)//delay us
{
unsigned char uscnt;
uscnt=us>>1;/* Crystal frequency in 12MHz*/
while(--uscnt);
}
/******************************************************************/
void DelayMs(unsigned char ms)//delay Ms
{
while(--ms)
{
DelayUs(250);
DelayUs(250);
DelayUs(250);
DelayUs(250);
}
}
void WriteCommand(unsigned char c)
{
DelayMs(5);//short delay before operation
E=0;
RS=0;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
}
/****************************************************************/
void WriteData(unsigned char c)
{
DelayMs(5); //short delay before operation
E=0;
RS=1;
RW=0;
_nop_();
E=1;
Data=c;
E=0;
RS=0;
}
/*********************************************************************/ void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10)
p=pos+0xb0; //是第二行则命令代码高4位为0xc
else
p=pos+0x80; //是第二行则命令代码高4位为0x8
WriteCommand (p);//write command
WriteData (c); //write data
}
/*************************************************************************/ void ShowString (unsigned char line,char *ptr)
{
unsigned char l,i;
l=line<<4;
for (i=0;i<16;i++)
ShowChar (l++,*(ptr+i));//循环显示16个字符
}
/*********************************************************************/
void InitLcd()
{
DelayMs(15);
WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x38); //display mode WriteCommand(0x06); //显示光标移动位置WriteCommand(0x0c); //显示开及光标设置WriteCommand(0x01); //显示清屏
}
///////////////////////////////////////////////////////////////// void main(void)
{
InitLcd();//器件初始化
DelayMs(15);
sprintf(Test1," ");//1 line ShowString(0,Test1);
sprintf(TimeNum,"LCM1602 Test ok!");//2 line ShowString(1,TimeNum);
while(1);
}。

相关文档
最新文档