LCD1602a 51全功能驱动(12M晶振)

合集下载

51单片机驱动LCM1602

51单片机驱动LCM1602

功能;驱动LCM1602,LCM1602为深圳誉信公司的16*2液晶字符型显示模块,程序使用读写方式控制LCM1602,地址分别为:写指令口:80H; 读忙检查口:81H;写数据口:82H; 读数据口:83H;;子程序1:写控制指令子程序;子程序2:写CGRAM数据子程序;子程序3:写DDRAM子程序;子程序4:写数据子程序;子程序5:读忙子程序RG_DLY EQU 2HORG 0000HAJMP MAIORG 0030HMAI: MOV SP,#60HLP_MAI: NOPLCALL SB_WRIN;调用写控制指令子程序LCALL SB_WRCG;调用写CGRAMLP2_MAI:NOPLCALL SB_WRDR;调用写DDRAMRT_MAI: AJMP LP2_MAI;---------------------------------------------------------;---------子程序---开始------------------------------------;-1------写控制指令子程序----------SB_WRIN:PUSH ACCMOV R0,#80H ;写指令口MOV A,#01H ;(INSTR.1)LCALL SB_WAT ;清屏MOVX @R0,AMOV A,#02H ;(INSTR.2)LCALL SB_WAT ;A光标归位MOVX @R0,AMOV A,#06H ;(INSTR.3)LCALL SB_WAT ;AC自动加一,画面不动;MOVX @R0,AMOV A,#0CH ;(INSTR.4)0FH:显示开,关标开,闪烁开LCALL SB_WAT ;0CH 显示开,关标、闪烁关 MOVX @R0,A;MOV A,#18H ;(INSTR.5);LCALL SB_WAT ;光标或画面平移指令;MOVX @R0,AMOV A,#38H ;(INSTR.6)LCALL SB_WAT ;8位数据,2行显示,5-7点阵MOVX @R0,APOP ACCRET;-2----写CGRAM数据子程序------SB_WRCG:PUSH ACCMOV DPTR,#CGRMOV R1,#40H;=CGRAM的首地址MOV R2,#4;=4个字符LP_WG0: MOV R3,#8;=每个字符有8位数据即8行LP_WG1: MOV R0,#80HMOV A,R1LCALL SB_WATMOVX @R0,ACLR AMOVC A,@A+DPTRLCALL SB_WRTDINC R1INC DPTRDJNZ R3,LP_WG1DJNZ R2,LP_WG0NOPPOP ACCRET;-3-----写DDRAM子程序--------SB_WRDR:PUSH ACCMOV R0,#80HMOV A,#80H ; 写第一行DDRAM数据LCALL SB_WATMOVX @R0,AMOV A,#49H ; ILCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#4CH ; LLCALL SB_WRTDMOV A,#4FH ; OLCALL SB_WRTDMOV A,#56H ; VLCALL SB_WRTDMOV A,#45H ; ELCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#4DH ; MLCALL SB_WRTDMOV A,#59H ; YLCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#42H ; BLCALL SB_WRTDMOV A,#41H ; ALCALL SB_WRTDMOV A,#42H ; BLCALL SB_WRTDMOV A,#59H ; YLCALL SB_WRTDMOV A,#20H ; EMPTYLCALL SB_WRTDMOV A,#20H ; EMPTYLCALL SB_WRTDMOV R0,#80HMOV A,#0C0H ;写第二行DDRAM LCALL SB_WATMOVX @R0,AMOV A,#49H ; ILCALL SB_WRTDMOV A,#20H ; SPACE LCALL SB_WRTDMOV A,#41H ; ALCALL SB_WRTDMOV A,#4CH ; LLCALL SB_WRTDMOV A,#53H ; SLCALL SB_WRTDMOV A,#4FH ; OLCALL SB_WRTDMOV A,#20H ; SPACELCALL SB_WRTDMOV A,#4DH ; MLCALL SB_WRTDMOV A,#49H ; ILCALL SB_WRTDMOV A,#53H ; SLCALL SB_WRTDMOV A,#53H ; SLCALL SB_WRTDMOV A,#20H ; SPACE LCALL SB_WRTDMOV A,#59H ; YLCALL SB_WRTDMOV A,#4FH ; OLCALL SB_WRTDMOV A,#55H ; ULCALL SB_WRTDMOV R2,#50 ;延时229ms ACALL SB_DLYPOP ACCRET;-4---写数据子程序---------SB_WRTD:MOV R0,#82H ; LCALL SB_WATMOVX @R0,A ;RET;-5---读忙子程序-----------SB_WAT: PUSH ACCPUSH 00HMOV R0,#81HLP_WAT: MOVX A,@R0RLC AJC LP_WATPOP 00HPOP ACCRET;---------子程序----结束----------------------------------- ;---------------------------------------------------------;------延时子程序-----------SB_DLY: PUSH RG_DLY ;LP1_DLY:PUSH RG_DLYLP2_DLY:PUSH RG_DLYDJNZ R2,$POP RG_DLYDJNZ R2,LP2_DLYPOP RG_DLYDJNZ R2,LP1_DLYPOP RG_DLYDJNZ R2,SB_DLYRET;----------CGRAM区---------- CGR:...................;(用户自编码字符区)END。

单片机课程设计 数据采集及LCD1602显示,保留小数点后面两位

单片机课程设计  数据采集及LCD1602显示,保留小数点后面两位
XTAL2:接外部晶体的另一端。在单片机内部,接至上述振荡器的反 相放大器的输出端,振荡器的频率是晶体振荡器频率。有采用外部时 钟电路时,对于 HMOS 单片机,该引脚输入外部时钟脉冲;对于 CHMOS 单片机,此引脚应该悬空。 (3)信号引脚 RST/Vpd
RST/Vpd:复位/备用电源输入端。单片机上电后,只要在该引脚上输 入 24 个振荡周期(2 个机器周期)宽度以上的高电平就会使单片机 复位;有在 RST 与 VCC 之间接一个 10uf 的电容,而在 RST 于 GND 之 间接一个 8.2 千欧的下拉电阻,则可实现单片机上电自动复位。
图 1 STC89C51RC 引脚分布
分引脚具有第二功能 面就被系统用到的引脚分别说明这些引脚的名称和功能。
(1)主电源引脚 VCC 和 GND
第 4 页 共 20 页
广西 科 技 大 学
VCC:接+5V 电源 GND:接电源地 (2)中电路引脚 XTAL1 和 XTAL2 XTAL1:接外部晶体的一端。在单片机内部,它是反相放大器的输入端, 该放大器构成了内震荡器。在采用外部时钟电路时,对于 HMOS 单片 机,此引脚必须接地;对于 CHMOS 单片机,此引脚作为驱动端。
#define DataPort P0
uchar table[]="0123456789"; /*-----------------------------------------------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,精确延时请使用汇编 ------------------------------------------------*/ void DelayMs(unsigned char t) {

c的简易计算器(已通过实测)初学者参考

c的简易计算器(已通过实测)初学者参考

void LCD_init(void);//初始化函数
void delay_nms(unsigned int n);//延时函数
void LCD_write_command(unsigned char command);//写入指令函数
void LCD_write_dat(unsigned char dat);//写入数据函数
产生原因:液晶根本就没有进行初始化操作,需要检查连线或者程序。运气不好的情况 下就是整块 LCD 是坏的。 状态 2 屏上显示两排灰格
产生原因:程序中对液晶初始化不正常,应是部分初始化指令没有正常接收,建议按照 标准初始化步骤调整程序,或者调整指令之间的延时(加大一些试试)----补充:也有 可能是对比度太大,建议优先调整对比度电阻 状态 3 显示乱码
/*********************************




************************************/
void inter0() interrupt 0
{
unsigned char n;
delay_10ms();//延时
if(INT0==0)//没键按下
数量 1 17 1 9 1 1 1 2 1
--
--
2.3 硬件设计电路图 将 4*4 的键盘直接接在 P1 口上,用 P0 口作为 LCD 的显示输出,
P3.2 口的 INT0 作为外部中断位。
LCD1
LM016L
D0 D1 D2 D3 D4 D5 D6 D7
RS RW E
VSS VDD VEE
7 控制电路
微控制电路就是以AT89C51为核心的控制核心,主要注意晶振电路的接法和复

51单片机lcd1602工作原理

51单片机lcd1602工作原理

51单片机lcd1602工作原理一、概述1、单片机简介51单片机是一种广泛应用于嵌入式系统的微型计算机,具有周期定时器、数据存储器和输入输出等功能。

其体积小,功耗低,适用于各种微型控制系统。

2、LCD1602简介LCD1602是一种常见的字符型液晶显示器模块,具有16x2的字符显示区域,可以显示16个字符x2行。

它具有低功耗、高对比度、显示清晰等特点,广泛应用于各种电子产品中。

二、LCD1602的原理1、LCD1602的工作原理概述LCD1602的工作原理是利用触电效应,通过控制电场来改变液晶分子的排列方向,从而实现显示功能。

其原理涉及液晶材料、电极、控制信号等方面。

2、液晶材料液晶材料是LCD1602的显示主体,主要由有机分子组成,能够对电场敏感。

当电场变化时,液晶分子会发生排列变化,从而改变光的透射情况。

3、电极LCD1602的电极主要由透明的ITO材料组成,用于施加电场。

通过不同的电压信号,可以改变液晶分子的排列方向,进而控制显示状态。

4、控制信号51单片机通过控制LCD1602的数据口和控制口,向其发送控制信号和数据信号,从而控制液晶显示的内容和状态。

具体的控制信号包括使能信号、读写信号、数据信号等。

三、LCD1602的工作原理分析1、初始化在使用LCD1602之前,首先需要对其进行初始化。

初始化过程主要包括设置显示模式、清屏、光标设置等操作。

通过向LCD1602发送特定的指令,可以实现初始化操作。

2、数据传输51单片机通过并行方式向LCD1602发送数据,数据主要包括要显示的字符、控制信息等。

在发送数据时,需要依次发送高四位和低四位数据,并通过控制信号进行确认。

3、显示控制LCD1602支持多种显示模式和显示控制功能,可以实现光标显示、字符闪烁、显示移动等功能。

通过向LCD1602发送相应的指令,可以实现这些显示控制功能。

四、LCD1602的应用1、嵌入式系统LCD1602广泛应用于各种嵌入式系统中,用于显示系统状态、调试信息、用户交互界面等。

LCD1602函数集

LCD1602函数集

LCD1602函数集LCD1602A函数集在这废话就不讲了,要知道LCD1602怎么使⽤,⾃⼰看数据⼿册去,在此本⼈仅写出⼀些函数集,望学习单⽚机的童鞋参考参考,在这⾥,我就以51单⽚机为例,对了,晶振为12M或11.0592M的情况下的参考程序,主要是注意延时问题,晶振不同相同的延时函数,延时不同,好了废话完毕;下⾯进⼊程序讲解:在这,我总结出了⼏个函数如下:延时函数static void delay01(unsigned char x)//延时函数{ unsigned char i,j;for(i=0;ifor(j=0;j<12;j++);}//LCD写指令函数:功能:向LCD写⼊⽤户指令;传⼊参数为CMD.void WR_CMD(unsigned char CMD)//LCD写命令函数{RS=0;RW=0;EAB=1;delay01(100);TPORT=CMD;delay01(100);EAB=0;}//LCD写数据函数:功能:向LCD写⼊⽤户指令;传⼊参数为DA T.void WR_DAT(unsigned char DA T)//LCD写数据函数{RS=1;RW=0;EAB=1;delay01(100);TPORT=DAT;delay01(100);EAB=0;}//LCD初始化函数:功能:初始化LCD;顺便说下,必须初始化成功后才可以使⽤液晶显⽰void LCD_init(void)//LCD初始化函数{WR_CMD(0x30);WR_CMD(0X30);WR_CMD(0x30);WR_CMD(0x38);WR_CMD(0x08);WR_CMD(0x01);WR_CMD(0x06);WR_CMD(0x0e);}//LCD在指定的位置写数据函数:功能:吧想要显⽰的数据输出到显⽰屏void WR_DATA(unsigned char line,unsigned char location,unsigned char DA TA)//LCD定位写数据函数{ static unsigned char i;delay01(100);if(line==0){ i=0x80+location;WR_CMD(i);}else{ i=0x80+0x40+location;WR_CMD(i);}delay01(100);WR_DAT(DA TA);i=0;}//指定在第⼏⾏第⼏列开始写数据:功能:指定从第⼏⾏第⼏列开始写数据void WR_str(unsigned char linex,unsigned char locationy,unsigned char *stri)//LCD定位写字符{ static unsigned char i; delay01(100);if(linex==0){ i=0x80+locationy;}else{ i=0x80+0x40+locationy;}delay01(100);while(*stri){WR_CMD(i);WR_DAT(*stri);i++;stri++;}i=0;}//创建⾃定义字符函数:功能:把点阵数据写⼊CGROM中void WRTE_SELF(unsigned char *s,unsigned char datcount)//s是字符表格⼀维数组;datcount 是字符个数写⼊⾃建字符最多8个{ unsigned char loc,i=0;loc=0x40;while(++i!=8*datcount){WR_CMD(loc);WR_DAT(*s);s++;loc++;}}//在指定的位置写你定义的第⼏个字符函数:功能:在你指定的位置显⽰出你的⾃定义字符//Selfaddr为第⼏个字数值为0~7,void WR_SELSTRING(unsigned char loca,unsigned char selfaddr,unsigned char lines)//在指定的位置写⾃定义字符{ unsigned char lao=0x80;if(lines==1){lao=loca+lao+0x40;}else if(lines==0){lao+=loca;}WR_CMD(lao);WR_DAT(selfaddr);}//在LCD写⼊字符串函数:与上⾯指定在第⼏⾏第⼏列开始写数据不同的是,该函数是从//每⾏的第⼀个位置开始显⽰字符void WR_STRINGS(unsigned char *str,unsigned char lin ){unsigned char l=0x80;if(lin==1){l=l+0x40;}else{l=0x80;}WR_CMD(l);while(*str){WR_DAT(*str);str++;l++;}}以上函数经本⼈验证绝对可以使⽤。

51单片机实验报告

51单片机实验报告

51单片机实验报告51单片机是一款非常流行的单片机芯片,被广泛应用于各种电子产品中。

在这篇文章中,我们来探讨一下51单片机的一些实验,以及对于这些实验的理解和体会。

第一部分:实验内容我们进行的51单片机实验主要包括以下几个方面:1. 闪烁LED灯实验:这个实验是入门级别的,主要是为了熟悉51单片机的基本操作和编程方法。

在这个实验中,我们使用了一块51单片机开发板和几个LED灯,通过控制单片机的IO口信号来实现LED灯的闪烁。

2. 按键控制LED实验:这个实验是在闪烁LED实验的基础上进一步延伸的,主要是为了了解如何通过外部按键来控制单片机的输出。

在这个实验中,我们运用了单片机的外部中断和定时器等功能,实现了按键控制LED灯的亮灭。

3. LCD1602显示屏实验:这个实验是为了让我们熟悉如何在51单片机中使用LCD1602液晶显示屏。

在这个实验中,我们使用了I2C总线来与LCD1602进行通信,通过向LCD1602发送命令和数据来实现字符的显示。

4. 电机驱动实验:这个实验是让我们了解如何使用51单片机来控制电机的运转。

在这个实验中,我们运用了单片机的PWM控制功能,通过改变PWM波的占空比来控制电机的转速和方向。

第二部分:实验体会通过这些实验,我对于51单片机有了更深刻的理解和体会。

在这里,我想分享一下我的一些体会。

首先,我认为51单片机具有非常强大的控制能力和灵活性。

通过编写程序,我们可以控制单片机的各种IO口、定时器、PWM输出等功能,从而实现各种复杂的控制任务。

同时,由于其能够直接操作硬件,所以可以快速响应各种外部事件,对实时性要求较高的应用场景有很好的适应性。

其次,我发现在51单片机开发中,良好的软硬件结合非常重要。

由于51单片机具有丰富的外部中断、定时器等功能,因此我们可以很好地利用这些硬件资源来实现各种功能。

同时,在编写程序时,我们也需要充分发挥51单片机的硬件优势,例如使用定时器来完成计时任务,使用外部中断来完成输入检测等等。

51单片机LCD1602液晶显示的接法

51单片机LCD1602液晶显示的接法

51单片机综合学习之1602字符型液晶显示篇在日常生活中,我们对液晶显示器并不陌生。

液晶显示模块已作为很多电子产品的通过器件,如在计算器、万用表、电子表及很多家用电子产品中都可以看到,显示的主要是数字、专用符号和图形。

在单片机的人机交流界面中,一般的输出方式有以下几种:发光管、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字节相对应,每一字节的内容和显示屏上相应位置的亮暗对应。

1602a

1602a

1602a
简介
1602a是一种基于液晶显示技术的16x2字符LCD模块。

它提供了16个字符宽度和2行的可见区域,可以同时显示32个字符。

这个模块可以通过Arduino等单片机进行控制,非常适合于显示简单的文本和数字。

功能特点
•16x2字符显示
•可通过Arduino等单片机进行控制
•蓝色背光灯
•5V供电
•提供液晶显示的简单接口
•具备液晶显示常见功能,如光标控制、清除屏幕等
接口介绍
1602a模块具有16个引脚,其中8个用于数据传输,另外8个用于控制。

以下是每个引脚的功能:
•VSS: 地线
•VDD: 5V电源
•V0: 液晶对比度控制
•RS: 指令/数据选择,高电平选择数据,低电平选择指令
•R/W: 读/写选择,高电平读取数据,低电平写入数据
•E: 使能引脚,当对E进行高电平脉冲时,数据被写入液晶显示器
•D0-D7: 数据引脚,用于传输指令和数据
•LED+: 背光正极
•LED-: 背光负极
Arduino控制示例
以下是一个简单的Arduino控制1602a模块的示例代码:```arduino #include <LiquidCrystal.h>
// 初始化液晶对象 LiquidCrystal lcd(12, 11, 5, 4, 3, 2);
void setup() { // 设置液晶的列数和行数 lcd.begin(16, 2); // 打印初始文本 lcd.print(。

(完整word版)LCD1602的单片机驱动详解

(完整word版)LCD1602的单片机驱动详解

LCD1602的单片机驱动详解一.接口LCD1602是很多单片机爱好者较早接触的字符型液晶显示器,它的主控芯片是HD44780或者其它兼容芯片.刚开始接触它的大多是单片机的初学者。

由于对它的不了解,不能随心所欲地对它进行驱动。

经过一段时间的学习,我对它的驱动有了一点点心得,今天把它记录在这里,以备以后查阅。

与此相仿的是LCD12864液晶显示器,它是一种图形点阵显示器,能显示的内容比LCD1602要丰富得多,除了普通字符外,还可以显示点阵图案,带有汉字库的还可以显示汉字,它的并行驱动方式与LCD1602相差无几,所以,在这里花点时间是值得的。

一般来说,LCD1602有16条引脚,据说还有14条引脚的,与16脚的相比缺少了背光电源A(15脚)和地线K(16脚)。

我手里这块LCD1602的型号是HJ1602A,是绘晶科技公司的产品,它有16条引脚.如图1所示:图1再来一张它的背面的,如图2所示:图2它的16条引脚定义如下:引脚号符号引脚说明引脚号符号引脚说明1VSS电源地9D2数据端口2VDD电源正极10D3数据端口3VO偏压信号11D4数据端口4RS命令/数据12D5数据端口5RW读/写13D6数据端口6E使能14D7数据端口7D0数据端口15A背光正极8D1数据端口16K背光负极对这个表的说明:1。

VSS接电源地。

2. VDD接+5V.3. VO是液晶显示的偏压信号,可接10K的3296精密电位器。

或同样阻值的RM065/RM063蓝白可调电阻。

见图3。

图34。

RS是命令/数据选择引脚,接单片机的一个I/O,当RS为低电平时,选择命令;当RS为高电平时,选择数据。

5. RW是读/写选择引脚,接单片机的一个I/O,当RW为低电平时,向LCD1602写入命令或数据;当RW为高电平时,从LCD1602读取状态或数据.如果不需要进行读取操作,可以直接将其接VSS。

6. E,执行命令的使能引脚,接单片机的一个I/O。

LCD1602_CGRAM

LCD1602_CGRAM

1602字符液晶(2009-04-29 15:12:37)标签:杂谈1602字符液晶在实际的产品中运用的也比较多了,最近发现自动售水机就是采用的1602液晶进行显示的。

而且对于单片机的学习而言,掌握1602的用法是每一个学习者必然要经历的过程。

在此,我将使用1602过程中遇到的问题以及感受记录下来,希望能够给像我一样的初学者带来一点指导,少走一点弯路。

呵呵呵简单的总结所谓1602是指显示的内容为16*2,即可以显示两行,每行16个字符。

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

1602液晶的正面(绿色背光,黑色字体)1602液晶背面(绿色背光,黑色字体)另一种1602液晶模块,显示屏是蓝色背光白色字体字符型LCD1602通常有14条引脚线或16条引脚线的LCD,多出来的2条线是背光电源线VCC(15脚)和地线GND(16脚),其控制原理与14脚的LCD完全一样,引脚定义如下表所示:HD44780内置了DDRAM、CGROM和CGRAM。

DDRAM就是显示数据RAM,用来寄存待显示的字符代码。

共80个字节,其地址和屏幕的对应关系如下表:也就是说想要在LCD1602屏幕的第一行第一列显示一个"A"字,就要向DDRAM 的00H地址写入“A”字的代码就行了。

但具体的写入是要按LCD模块的指令格式来进行的,后面我会说到的。

那么一行可有40个地址呀?是的,在1602中我们就用前16个就行了。

第二行也一样用前16个地址。

对应如下:DDRAM地址与显示位置的对应关系(事实上我们往DDRAM里的00H地址处送一个数据,譬如0x31(数字1的代码)并不能显示1出来。

这是一个令初学者很容易出错的地方,原因就是如果你要想在DDRAM 的00H地址处显示数据,则必须将00H加上80H,即80H,若要在DDRAM的01H处显示数据,则必须将01H加上80H即81H。

AVR单片机学习笔记–LCD1602模块

AVR单片机学习笔记–LCD1602模块

AVR 单片机学习笔记–LCD1602模块学完51单片机再来学AVR,感觉很容易上手,LCD1602在学51的时候学过,所以可以直接修改相关的IO口操作即可。

现在顺便也复习一下。

1602可以显示两行字符,每行可以显示16个字符,可惜的是不能显示中文,在我调试的时候它帮我不少的忙。

一、主要技术参数:显示容量:16X2个字符(两行,每行16个字符)模块工作电源:4.5~5.5V模块工作电流:2.0mA (5.0V)模块最佳工作电源:5.0V字符尺寸:2.95X4.35(WXH)mm二、IO引脚功能LCD1602A模块引脚功能编号符号引脚说明编号符号引脚说明1VSS电源地(模块供电)9D2Data I/O2VDD电源正极(模块供电) 10D3Data I/OVL接在滑动电阻可以调节对比度 11D4Data I/O4RS数据/命令选择端 (H/L)12D5Data I/O5R/W读/写选择端 (H/L)13D6Data I/O6E使能信号(通知芯片读取数据) 14Data I/O7D0Data I/O15BLA模块背光灯正极8D1Data I/O16BLK模块背光灯负极三、基本操作时序:读状态:输入:RS=L、RW=H、E=H模块输出:状态字=D0~D7写指令:输入:RS=L、RW=L、D0~D7=指令码、E=H 模块输出:无读数据:输入:RS=H、RW=H、E=H模块输出:数据=D0~D7写数据:输入:RS=H、RW=L、D0~D7=数据、E=H 模块输出:无状态字说明(因为单片机的速度可能快过1602,所以需要判断当1602是否在忙,或者延时。

)STA7STA6STA5STA4STA3STA2STA1STA0D7D6D5D4D3D2D1D0STA0-6:当前数据地址指针的数值STA7主要用来检查1602模块的是否可以写入或读出操作 1:禁止 0:允许四、指令说明(这指令是用来设置1602显示的方式)显示模式设置指令码功能111设置16X2显示,5X7点阵,8位数据接口显示开/关及光标设置指令码功能1DCBD=1 开显示D=0 关显示C=1 显示光标C=0 不显示光标B=1 光标闪烁B=0 光标不闪烁1NSN=1 当读或写一个字符后地址指针加1,且光标加1(即从左往右显示)N=0 当读或写一个字符后地址指针减1,且光标减1(即从右往左显示)S=1 当写一个字符,中国男排显示左移(N=1)五、时序图写操作(写指令、写数据)时序图时序参数写指令时序,RS拉低表示写指令,R/W拉低表示写操作,给DB0-DB7赋值指令数据并保持>;40ns时间,将E 拉高表示数据已经准备好保持>;150ns让1602读取,将E 拉低,并延时>;10ns一次写操作完毕。

液晶LCD1602使用介绍

液晶LCD1602使用介绍

液晶LCD1602使用介绍液晶LCD1602简介LCD1602液晶也叫1602字符型液晶模块,LCD1602液晶是一种专门用来显示字母、数字、符号的点阵型液晶模块。

LCD1602液晶是由若干个5x7点阵字符位组成,每个点阵字符位都可以显示一个字符(包括字母、数字、符号),一共可以显示16x2个字符。

LCD1602液晶的每位之间都有一个点距的间隔,每行之间也都有间隔,起到字符间距和行间距的作用。

LCD1602液晶只能显示字符(包括字母、数字、符号),不能显示图片。

LCD1602液晶模块具有体积小,功耗低等优点。

在各种工业设备、家用电子产品、仪器仪表、嵌入式系统等场合都有非常广泛的应用。

液晶LCD1602技术参数液晶LCD1602管脚说明LCD1602液晶模块各管脚的功能介绍如下:1、LCD1602液晶的管脚1:VSS接5V电源负极,即GND。

2、LCD1602液晶的管脚2:VDD接5V电源正极。

3、LCD1602液晶的管脚3:VL为液晶的显示偏压信号,用于对液晶显示对比度调整,接电源正极时对比度最弱,接地时对比度最高。

对比度过高时会产生“鬼影”现象,导致液晶显示的字符不清晰。

我们可以通过使用一个10kΩ的电位器来调整对比度。

4、LCD1602液晶的管脚4:RS为液晶的寄存器选择脚,该管脚为高电平时选择数据寄存器,该管脚为低电平时选择指令寄存器。

5、LCD1602液晶的管脚5:R/W为读/写选择管脚,当该管脚为高电平时进行读操作,当该管脚为低电平时进行写操作。

a当RS和R/W管脚都为低电平时可以写入指令或显示地址。

b当RS管脚为低电平,R/W管脚为高电平时,可以读忙信号。

c当RS管脚为高电平,R/W管脚为低电平时,可以写入数据。

6、LCD1602液晶的管脚6:E管脚为使能端,当E管脚由高电平跳变为低电平时,液晶模块执行命令。

7、LCD1602液晶的管脚7~14:D0~D7为液晶8位双向数据线。

8、LCD1602液晶的管脚15:液晶模块背光源正极。

制作一个采用LCD1602显示的电子钟

制作一个采用LCD1602显示的电子钟

计算机科学与工程系实验报告实验题目:制作一个采用LCD1602显示的电子钟班级:姓名:学号:日期:一、实验目的掌握单片机使用定时器/计数器控制字符型液晶显示器LCD1602的设计与软件编程二、实验要求在LCD上显示当前的时间。

显示格式为“时时:分分:秒秒”。

设有4个功能键k1~k4,功能如下:(1)k1——进入时间修改。

(2)k2——修改小时,按一下k2,当前小时增1。

(3)k3——修改分钟,按一下k3,当前分钟增1。

(4)k4——确认修改完成,电子钟按修改后的时间运行显示。

三、实验要求提交的实验报告中应包括:电路原理图、实验设计思路、C51源程序(含注释语句)、运行效果(含运行截图与说明)、实验小结三、硬件电路原理图的设计四、编程思路及C51源程序编程思路:1、实现当按下K1之后,使中断T0停止计数2、实现当按下K2之后,使小时加一3、实现当按下K3之后,使分钟加一4、实现当按下K4之后,使中断T0恢复计数源程序:#include<reg51.h>#ifndef LCD_CHAR_1602_2005_4_9#define LCD_CHAR_1602_2005_4_9#define uchar unsigned char#define uint unsigned intsbit lcdrs = P2^0;sbit lcdrw = P2^1;sbit lcden = P2^2;void delay(uint z)//延时函数,此处使用晶振为11.0592MHz {uint x,y;for(x=z;x>0;x--){for(y=110;y>0;y--){;}}}void write_com(uchar com) //写入指令数据到lcd{lcdrw=0;lcdrs=0;P3=com;delay(5);lcden=1;delay(5);lcden=0;}void write_data(uchar date) //写入字符显示数据到lcd{lcdrw=0;lcdrs=1;P3=date;delay(5);lcden=1;delay(5);lcden=0;}void init1602()//1602液晶初始化设定{lcdrw=0;lcden=0;write_com(0x3C);write_com(0x0c);write_com(0x06);write_com(0x01);write_com(0x80);}/*void write_string(uchar *pp,uint n)//采用指针的方法输入字符,n为字符数目{int i;for(i=0;i<n;i++)write_data(pp[i]);}*/void write_sfm(uchar add,uchar date)//向指定地址写入数据{uchar shi,ge;shi=date/10;ge=date%10;write_com(0x80+add);write_data(0x30+shi);write_data(0x30+ge);}#endif#define uchar unsigned char#define uint unsigned intsbit Key1 = P1^0;sbit Key2 = P1^1;sbit Key3 = P1^2;sbit Key4 = P1^3;uchar int_time;//定义中断次数计数变量uchar second;//秒计数变量uchar minute;//分钟计数变量uchar hour;//小时计数变量uchar code date[]=" H.I.T. CHINA ";//LCD第1行显示的内容uchar code time[]=" TIME 23:59:55 ";//LCD第2行显示的内容uchar second=55,minute=59,hour=23;void clock_init(){uchar i,j;for(i=0;i<16;i++){write_data(date[i]);}write_com(0x80+0x40);for(j=0;j<16;j++){write_data(time[j]);}}void clock_write( uint s, uint m, uint h){write_sfm(0x47,h);write_sfm(0x4a,m);write_sfm(0x4d,s);}void Keyscan1(){if(Key1==0) {delay(10);if(Key1==0) while(!Key1); TR0=0;}if(Key4==0) {delay(10);if(Key4==0) while(!Key4); TR0=1;}if(Key3==0){delay(10);if(Key3==0)while(!Key3);minute++;if(minute==60)minute=0;} if(Key2==0){delay(10);if(Key2==0)while(!Key2);hour++;if(hour==24)hour=0;}}void main(){init1602();//LCD初始化clock_init();//时钟初始化TMOD=0x01;//设置定时器T0为方式1定时EA=1; // 总中断开ET0=1; // 允许T0中断TH0=(65536-46483)/256;//给T0装初值TL0=(65536-46483)%256;TR0=1;int_time=0;//中断次数、秒、分、时单元清0second=55;minute=59;hour=23;while(1){clock_write(second ,minute, hour);Keyscan1();}}void T0_interserve(void) interrupt 1 using 1 //T0中断服务子程序{int_time++;//中断次数加1if(int_time==20) //若中断次数计满20次{int_time=0; //中断次数变量清0second++;//秒计数变量加1}if(second==60)//若计满60s{second=0; //秒计数变量清0minute ++;//分计数变量加1}if(minute==60)//若计满60分{minute=0;//分计数变量清0hour ++;//小时计数变量加1}if(hour==24){hour=0;//小时计数计满24,将小时计数变量清0 }TH0=(65536-46083)/256;//定时器T0重新赋值TL0=(65536-46083)%256;}五、仿真运行效果展示仿真初始状态按下k1键,进入修改模式六、实验小结通过本次实验,我掌握了LCD1602编程的方法,将所学知识运用到实践中,这是一件慢慢的过程,首先要把理论知识理解透彻,然后就是例题看懂,弄懂举一反三。

LCD1602简介

LCD1602简介

1LCD 1602简介LCD1602可显示两行,每行16个字符,不能显示汉字。

16脚的LCD 1602带背光,14脚的不带背光。

2LCD1602 端口引脚不一一记录手册上面是咋个描述LCD 1602的了。

记录一下操作过程,下图是LCD 1602在51单片机上面的连线。

图1 LCD 与单片机接线图D0-D7引脚连接在单片机的P0端口。

[plain] view plaincopyprint?LCD_RS = P1^0;LCD_RW = P1^1;LCD_EN = P2^5;查看LCD 1602手册,得到LCD引脚组合的含义如下:表格1:LCD操作模式模式输入输出读状态RS=0,RW=H,EN为高变低脉冲输出:D0~D7个状态值读数据RS=1,RW=1,EN为高变低脉冲输出:无写指令RS=0,RW=0,D0--D7=数据,EN由高脉冲变为低脉冲输出D0--D7状态值写数RS=1, RW=0, D0--D7=数据,EN由高脉冲变为低脉冲输出D0--D7状态值据可以参照图1的接线图对这些模式和输入输出做出相应的理解。

模式、输入都是跟单片机I/O端口相连的端口。

输出是使LCD显示的内容。

在编写程序时,可以先设置LCD显示内容的格式(初始化LCD),然后再对LCD进行读写操作。

这些过程由LCD跟单片机相连的I/O端口来完成。

3LCD 1602的操作时序查看LCD 1602手册,以LCD写操作时序为例记录在对LCD操作的过程中需要注意到的延迟语句的编写,否则可能导致对LCD的操作失败。

图2 LCD的写操作时序根据表一LCD的操作时序可知,在RS,RW,E(N),DB7.0(D0-D7)满足一定时序的高低电平条件时就可以对LCD进行写操作。

变化都不是瞬间的,在对RS等置高置低时,RS等变高变低有一个下划的过度时间,如果这种过渡的时间超过单片机内一条或几条指令的执行时间,则这种时序就有可能会被错开。

如现在对LCD 进行写操作,将RS置高,RW置低,准备好DB7.0数据,E由高变低等操作由以下代码完成:[plain] view plaincopyprint?LCD_RS = 1;LCD_RW = 0;DB7_0 = ‘A’;LCD_EN = 1;LCD_EN = 0;RS在高电平时选择数据寄存器,在低电平时选择指令寄存器。

8051单片机驱动LCD1602程序

8051单片机驱动LCD1602程序

extern void initTimer0Mode1(void); extern void delayMs(unsigned int uiDlyMs);
#endif
2、LCD 配置头文件 lcd_cfg.h
/*-------------------------------------------------------------------------LCD_CFG.H:LCD 底层驱动配置信息
{
TMOD = TMOD |0x01;
ET0 = 1;
EA = 1;
}
void delayMs(unsigned int uiDlyMs){Βιβλιοθήκη uiDlyCnt = 0;
TL0
= TIMER_LOW;
TH0
= TIMER_HIGH;
TR0
= 1;
while (uiDlyCnt != uiDlyMs) {
unsigned char ucTmpRow, unsigned char ucTmpCol, unsigned char ucPutChar );
#endif
学习交流 by CD 爱吃鱼
学习交流 by CD 爱吃鱼
二、C 文件
1、延迟函数 C 文件 delay.c
/*-------------------------------------------------------------------------DELAY.C:定时器延时函数
学习交流 by CD 爱吃鱼
8051 单片机驱动 LCD1602 程序
一、头文件
头文件主要包含 80C51.h、delay.h 以及 lcd_cfg.h,其中 80C51.h 只是在官方头文件的基础 上作个人习惯上的修改,本例程仅改动了 GPIO 命名方式,这里就不给出 80C51.h 文件内容。 Delay.h 中包含延迟函数相关信息,lcd_cfg.h 为 LCD 底层配置信息,包括引脚分配以及 LCD1602 驱动函数声明。 1、延迟函数头文件 delay.h

桂林理工大学《单片机》2020复习题

桂林理工大学《单片机》2020复习题

单片机复习题第一周1.MCS-51系列单片机的CPU主要是由(运算器、控制器)组成的2.控制程序必须下到单片机的(程序储存器)中,单片机才能工作3.下面(数据库管理)的应用,不属于单片机的应用范围4.AT89C51有(5个)中断系统5.单片机复位之后PC的内容是(0000H)6.AT89C51的EA引脚(必须接+5V电源)7.单片机中的程序计数器PC用来(存放下一条指令地址)8.Intel 8051单片机是(8)位的单片机9.单片机复位之后SP的内容是07H(对)10.AT89C51有两个串行通信端口(错)第二周1.一个单片机应用系统的晶振频率为6MHZ,那么其机器周期为(2us)2.AT89C52单片机中特殊功能寄存器(SFR)使用片内RAM的部份字节地址(对)。

3.PC可以看成是程序存储器的地址指针。

(对)4.使用AT89C51单片机且引脚EA=1时,仍可外扩64KB的程序存储器(错)5.访问程序存储控制信号的引脚名称是(EA)6.(CPU)是单片机的控制核心,完成运算和控制功能。

7.具有只读不能写,掉电后数据不会丢失的存储器是(ROM)只读存储器ROM(Read Only Memory) RAM (Random Access Memory)8.具有可读可写功能,掉电后数据丢失的存储器是(RAM)9.CPU对各种外围部件采用(并行IO口)来控制10.复位后,单片机并行I/O口P0-P3的值是(0Xff)第三周1.对静态显示的说法是错误的(所需电流较大、占用CPU时间小、编程复杂)正确:所需电流小,占用CPU时间小,编程简单、只适用于显示位数较小的场合2.静态显示只适用于显示位数较小的场合。

(对)3.共阴极数码管的公共控制端一般接低电平4.共阳极数码管,当公共端为高电平,某段端控制端为低电平,对应段位点亮。

(错){共阴极数码管点亮条件是:位控制端(公共端)需低电平,段控制端需要高电平}5.数码管显示字符“3”的段码是(B0H ){“8”为80H}6.数码管显示数字“7”时,需点亮(a,b,c )段即可。

单片机驱动LCD1602A程序

单片机驱动LCD1602A程序

LCALL WRITE_DATA
RET
;******************************************************************************
;函数名:DISP_CGRAM
;输 入:
;
R5---->自选图形数据个数
;
R4---->自选图形序号
;
R3---->自选图形显示位置
9
嵌入式应用软件园,版权所有,请勿转载/销售。
;调 用:无
;描 述:查询忙碌标志信号
;******************************************************************************
CHECK_BUSY:
PUSH ACC
BUSY_LOOP:
CLR E
SETB R_W
CLR RS
SETB E
MOV A, DB0_7
CLR E
JB
ACC.7,BUSY_L
;****************************************************************************** ;函数名:WRITE_COM ;输 入:A ;输 出:无 ;调 用:无 ;描 述:写指令到 LCM ;****************************************************************************** WRITE_COM:
;****************************LCM 与 89C51 接口定义******************************

基于LCD1602电子时钟课程设计报告

基于LCD1602电子时钟课程设计报告

信息与电子工程学院课程设计报告课程单片机技术应用设计题目基于LCD1602电子时钟专业班级姓名学号分工成绩成员指导老师答辩日期目录一、课程设计概述 (3)1.1课程设计背景 (3)1.2课程设计内容 (3)1.3课程设计技术指标 (3)二、方案的选择及确定 (3)2.1单片机芯片的选择 (3)2.2显示模块的选择 (4)2.3实时时间计算模块的选择 (4)2.4实时环境温度采集模块选择 (4)2.5电路设计最终方案决定 (5)三、系统硬件设计 (5)3.1主控模块 (5)3.2LCD显示模块设计 (6)3.3时间计算模块设计 (6)3.4实时环境温度检测模块 (7)3.5报警模块 (7)3.6设置模块 (8)3.7电源接口部分 (8)四、系统软件设计 (8)4.1主函数 (8)4.2设置模块 (9)4.31602液晶屏 (10)4.4软件原理图 (11)五、系统调试过程 (11)5.1软件调试 (11)5.2硬件调试 (12)六、结论 (12)七、遇到的问题及解决方法和总结 (12)7.1硬件方面 (12)7.2软件方面 (13)7.3总结 (13)八、参考文献 (13)九、附录 (14)一、课程设计概述1.1 课程设计背景随着微电子技术的高速发展,单片机在国民经济的个人领域得到了广泛的运用。

单片机以体积小、功能全、性价比高等诸多优点,在工业控制、家用电器、通信设备、信息处理、尖端武器等各种测控领域的应用中独占鳌头,单片机开发技术已成为电子信息、电气、通信、自动化、机电一体化等专业技术人员必须掌握的技术。

而电子万年历作为电子类小设计不仅是市场上的宠儿,也是是单片机实验中一个很常用的题目。

因为它有很好的开放性和可发挥性,因此对作者的要求比较高,不仅考察了对单片机的掌握能力更加强调了对单片机扩展的应用。

而且在操作的设计上要力求简洁,功能上尽量齐全,显示界面也要出色。

1.2 课程设计内容利用单片机、时钟芯片DS1302、温度传感器DS18B20、1602液晶屏等实现日期、时间、温度的显示,即是一个电子时钟。

51单片机外接晶振的最大频率

51单片机外接晶振的最大频率

51单片机外接晶振的最大频率摘要:1.51 单片机外接晶振的概述2.51 单片机外接晶振的最大频率3.如何选择合适的晶振频率4.晶振频率对单片机性能的影响5.结论正文:51 单片机外接晶振的概述51 单片机是一种常见的微控制器,广泛应用于各种嵌入式系统中。

在51 单片机的运行过程中,需要一个稳定的时钟信号来控制指令的执行。

这个时钟信号通常由晶振提供。

晶振是一种高精度和高稳定度的振荡器,通过一定的外接电路,可以生成频率和峰值稳定的正弦波。

51 单片机外接晶振的最大频率51 单片机外接晶振的最大频率受限于单片机本身的设计。

一般来说,51 单片机的最大晶振频率为12MHz。

这意味着,在选择晶振时,应确保晶振的频率不超过12MHz。

然而,实际上,由于晶振的稳定性、成本和性能等因素的影响,通常会选择较低的晶振频率。

如何选择合适的晶振频率在选择51 单片机的晶振频率时,需要考虑以下几个因素:1.系统性能需求:根据系统的实际性能需求选择合适的晶振频率。

例如,如果系统需要高速运行,可以选择较高频率的晶振;如果系统对功耗要求较高,可以选择较低频率的晶振。

2.晶振的稳定性:晶振的稳定性是影响单片机运行稳定性的一个重要因素。

选择晶振时,应确保晶振的稳定性满足系统的要求。

3.成本:晶振的成本也是选择晶振时需要考虑的因素。

通常情况下,晶振的频率越高,成本越高。

因此,在选择晶振时,需要在成本和性能之间进行权衡。

晶振频率对单片机性能的影响晶振频率对单片机的性能有很大影响。

首先,晶振频率决定了单片机的时钟周期。

时钟周期越短,单片机的执行速度越快。

然而,晶振频率越高,晶振的制造工艺越复杂,晶振的稳定性和可靠性也越难保证。

因此,在选择晶振频率时,需要综合考虑单片机的性能需求和晶振的稳定性。

结论总之,51 单片机外接晶振的最大频率受限于单片机本身的设计,通常为12MHz。

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

lcd.h文件:#include <reg51.h>#include <intrins.h>#define uchar unsigned char#define uint unsigned int//******************选择LCD接口(用户修改)******************// //*********************************************************** //LCD若采用四线传输方式,MCU口的高四位和LCD数据口的//高四位相连,传输数据时先发送高四位,再发送低四位数据#define LCD_DB_Port P0 //lcd数据口//#define LCD_8DB //4数据线#define LCD_4DB //8数据线sbit LCD_RS = P2^0;sbit LCD_RW = P2^1;sbit LCD_EN = P2^2;//根据实际电路板性能的好坏可以适当增加或减少以下延时#define delayNOP(); {_nop_();_nop_();_nop_();_nop_();_nop_();}; //*********************************************************** //******************选择LCD接口(用户修改)******************////******************LCD 控制线说明******************////状态字读操作:输入 RS=低、RW=高、EP=高;输出:读出状态字;//数据读出操作:输入 RS=高、RW=高、EP=高;输出:读出为数据;//指令写入操作:输入 RS=低、RW=低、EP=上升沿;输出:无;//数据写入操作:输入 RS=高、RW=低、EP=上升沿;输出:无。

//******************LCD 控制线说明******************////******************LCD1602 命令字 ******************//#define LCD_CMD_8DB 0x38#define LCD_CMD_4DB 0x28#define LCD_CMD_CLR 0x01 //清屏指令//初始化命令,以下几条(指令)按位或,就可得组合// 0x38 //设置5*7 二行 8数据线// 0x28 //设置5*7 二行 4数据线// 0x01 //lcd清屏// 0x02 //光标复位指令// 0x0e //整体显示开,光标开// 0x08 //整体显示关// 0x0c //整体显示开,光标关// 0x0f //整体显示开,光标开,光标闪烁// 0x0e //整体显示开,光标开,光标不闪烁// 0x04 //字符不移,光标左移// 0x06 //字符不移,光标右// 0x05 //字符移,光标左移// 0x07 //字符移,光标右移////控制移动命令,以下几条(指令)按位或,就可得组合// 0x10 //左移动光标// 0x14 //右移动光标// 0x18 //左移动字符// 0x1c //右移动字符//LCD1602a 5*8 自定义字符CGRAM 控制// 命令格式:0 1 A5 A4 A3 A2 A1 A0 ;A5-A0为 CGRAM 地址// 从低位起每8个CGRAM组成一个自定义字符,共可定义8个// 例如将自定义字符写入CGRAM的0x08-0x0f间,// 调用lcd_wdat(0x02)就能显示//******************LCD1602 命令字 ******************//#ifdef LCD_8DB#define LCD_MODE LCD_CMD_8DB#endif#ifdef LCD_4DB#define LCD_MODE LCD_CMD_4DB#endifextern uchar code TAB_LCD_Hex[];/************************************//**********LCD各函数声明*************/extern void delay(uchar x);extern bit lcd_busy();extern void lcd_wcmd(uchar cmd);extern void lcd_wdat(uchar dat);extern void lcd_init();extern void lcd_PrPos(uchar row ,uchar col);extern void lcd_PrHexByte(uchar prbyte);extern void lcd_PrString(uchar *prstring);extern void lcd_wCGRAM(uchar cg_pos,uchar *cg_arr);lcd.c文件:#include "LCD.h"uchar code TAB_LCD_Hex[ ] ={'0','1','2','3','4','5','6','7','8','9','A','B','C','D','E','F'};/*************************************************************//* *//* 延时子程序 *//* *//*************************************************************/void delay(uchar x){ uchar j;while((x--)!=0){for(j=0;j<125;j++) ;}}/*************************************************************//* *//*检查LCD忙状态 *//*lcd_busy为1时,忙,等待。

lcd-busy为0时,闲,可写指令与数据 *//* *//*************************************************************/static bit lcd_busy(){bit result;LCD_RS = 0;LCD_RW = 1;LCD_EN = 1;delayNOP();result = (bit)(LCD_DB_Port&0x80);LCD_EN = 0;return(result);}/*******************************************************************/ /* */ /*写指令数据到LCD *//*RS=L,RW=L,E=高脉冲,D0-D7=指令码。

*/ /* */ /*******************************************************************/void lcd_wcmd(uchar cmd){while(lcd_busy());LCD_RS = 0;LCD_RW = 0;LCD_EN = 0;_nop_();_nop_();#ifdef LCD_8DBLCD_DB_Port = cmd;#endif#ifdef LCD_4DBLCD_DB_Port &= 0x0F; //清高四位LCD_DB_Port |= (cmd & 0xF0); //送高四位delayNOP();LCD_EN = 1; //上跳沿时输入数据delayNOP();LCD_EN = 0;LCD_DB_Port &= 0x0F; //清高四位LCD_DB_Port |= (cmd << 4); //送低四位#endifdelayNOP();LCD_EN = 1; //上跳沿时输入数据delayNOP();LCD_EN = 0;}/*******************************************************************/ /* */ /*写显示数据到LCD *//*RS=H,RW=L,E=高脉冲,D0-D7=数据。

*/ /* */ /*******************************************************************/void lcd_wdat(uchar dat){while(lcd_busy());LCD_RS = 1;LCD_RW = 0;LCD_EN = 0;#ifdef LCD_8DBLCD_DB_Port = dat;#endif#ifdef LCD_4DBLCD_DB_Port &= 0x0F; //清高四位LCD_DB_Port |= (dat & 0xF0); //送高四位数据delayNOP();LCD_EN = 1; //上跳沿时输入数据delayNOP();LCD_EN = 0;LCD_DB_Port &= 0x0F; //清高四位LCD_DB_Port |= (dat << 4); //送低四位数据#endifdelayNOP();LCD_EN = 1;delayNOP(); //上跳沿时输入数据LCD_EN = 0;}/*************************************************************/ /* */ /* LCD初始化设定 */ /* */ /*************************************************************/void lcd_init(){delay(15); //等待电源稳定lcd_wcmd(LCD_MODE); //设置显示模式delay(5);lcd_wcmd(LCD_MODE);delay(5);lcd_wcmd(LCD_MODE);delay(5);lcd_wcmd(0x0c); //显示开,关光标delay(5);lcd_wcmd(0x06); //移动光标delay(5);lcd_wcmd(0x01); //清除LCD的显示内容delay(5);}/*************************************************************/ /* */ /* 设定显示位置 */ /* */ /*************************************************************/void lcd_PrPos(uchar row,uchar col){if(row == 0)lcd_wcmd(col | 0x80); //数据指针=80+地址变量if(row == 1)lcd_wcmd(col | 0x80 | 0x40);}/*************************************************************/ /* */ /* 显示字符串 */ /* */ /*************************************************************/void lcd_PrString(uchar *prstring) //显示一个字符串的子程序{while((*prstring) != '\0'){lcd_wdat(*prstring);prstring++;}}/*************************************************************/ /* */ /* 显示二进制字节 */ /* */ /*************************************************************/ void lcd_PrHexByte(uchar prbyte) //显示一个字符子程序{ACC = prbyte;ACC >>= 4;lcd_wdat(TAB_LCD_Hex[ACC]); //显示高四位ACC = prbyte;ACC &= 0x0F;lcd_wdat(TAB_LCD_Hex[ACC]); //显示低四位}/*************************************************************//* *//* 写入自定义字符 *//* *//*************************************************************/ void lcd_wCGRAM(uchar cg_pos,uchar *cg_arr) //cg_pos 0-7 写入自定义cgram中的位置{uchar i;cg_pos <<= 3; // cg_pos = cg_pos * 8,转化成地址cg_pos |= 0x40; // 转化成命令字for(i = 0; i < 8; i++ ){lcd_wcmd(cg_pos);lcd_wdat(*cg_arr);cg_pos++;cg_arr++;}}测试test.c文件:#include "lcd.h"uchar code bell[] ={0x01,0x1b,0x1d,0x19,0x1d,0x1b,0x01,0x00};main(){uchar i;lcd_init();lcd_PrPos(0,16);lcd_PrString("abc");for(i = 0; i < 16; i++){lcd_wcmd(0x18);delay(200);}lcd_wcmd(0x02); //重置光标lcd_wcmd(0x01); //清屏lcd_wCGRAM(0x01,bell); //写入自定义字符lcd_PrPos(1,5);lcd_wdat(0x01); //显示自定义字符while(1); }。

相关文档
最新文档