1. 首页 > 笙耀百科 >

lcd1602编程需要的函数 lcd1602编程框图

1、需要修改引脚设置,就到LCD1602.h中修改

lcd1602编程需要的函数 lcd1602编程框图lcd1602编程需要的函数 lcd1602编程框图


2、主函数头写上#include“LCD1602.h”,将“LCD1602.c”添加到项目中

3、使用的时候先调用LCD1602_initialise();对1602初始化;其中光标移动方式已经设定好了

4、根据需要开关函数开关(注释掉定义就是关闭相应函数,取消注释则是打开),调用相关函数。关于函数功能,库文件注释得很详细,请自行查看;

提供一段main()函数代码,供参考:

#include

#include"LCD1602.h"

void main(void)

{LCD1602_initialise();

LCD1602_displayStr(0,0,"Hello World!");

LCD1602_displayInt(1,0,2015);

while(1);

}

你好:

lcd1602的响应速度相对于单片机的速度来说是偏慢的。

举个简单的例子,把一桶油通过漏斗向一个瓶子里倒,倒油的速度,即流量必须维持在一定范围之内,倒得太快油会从漏斗顶部溢出来,这样就浪费掉了。我们通过眼睛可以判断并使油面保持在顶面以下,以漏斗的额定流量来倒油,这样效率最高。

而对于单片机来说,1602好比那个瓶子漏斗,写入1602中要显示的数据好比油,如果以单片机的高运行速度向1602写数据就很可能造成上面所说的溢出,比如连续写入abc,结果只显示出了a,这是因为1602的显示芯片每次都要花时间来处理输入的ascii码数据,并把它显示出来。而我们却不容易主动地去控制写入数据的速度,所以1602使用忙信号就有必要了,每次单片机只有检测到忙信号为0,即不忙时,才向1602发数据。比如要显示abc,则这样操作,写a---判忙---写b---判忙---写c---判忙。这样就不会出错了。

这几年推出的lcd,像手机的屏响应速度就比较快,而1602这个古董我用示波器测过,大约40us左右的忙处理时间,而很多速度快的单片机的指令周期都是ns级的。也就是说单片机相当一段时间都在‘等’lcd。#include

#defineucharunsignedchar

#defineuintunsignedint

voidbusy(void)

{uchartemp=0x80;//初始化temp最高位为1,使得能够进入下面

//的while循环

p0=0xff;(p0就是8个数据口)

rs=0;//设置命令操作

rw=1;//设置读操作

en=1;//使能

delay(100);(这是设的延时函数,不用解释)

while(temp&0x80)//判忙,一旦表达式为假,即temp最高位为0,

//则表示1602不忙,跳出while.

{temp=p0;delay(20);}//把p0的的高位读入temp,延时

en=0;//关闭使能信号

}每次读写操作都要调用这个busy函数

*P是你存放所要显示的数据。p就是存放显示数据的地址,p++,就是将wei个数据的地址依次加,用来把数据输出

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define LcdBus P0

sbit 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

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);

}}

功能特性

1,可以仿真63K程序空间,接近64K 的16位地址空间;

2,可以仿真64Kxdata 空间,全部64K 的16位地址空间;

3,可以真实仿真全部32 条IO脚;

4,完全兼容keilC51 UV2 调试环境,可以通过UV2 环境进行单步,断点, 全速等操作;

5,可以使用C51语言或者ASM汇编语言进行调试 ;

6,可以非常方便地进行所有变量观察,包括鼠标取值观察,即鼠标放在某 变量上就会立即显示出它此的值;

以上内容参考:

#include

#include

#define uchar unsigned char

#define uint unsigned int

#define LcdBus P0

sbit 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

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

{WrDat(disp[i]);

delayms(300);

}}

void LcdIni()

{WrOp(0x38);

WrOp(0x06); //光标加1

WrOp(0x0f); //开显示 光标闪烁

// WrOp(0x0c); //开显示 光标不闪烁

}void WrOp(uchar dat)

{//uchar i;

ChkBusy();

LED1602_RS=0; //RS=0

LED1602_RW=0; //RW=0

LED1602_EN=0; //EN=0

LcdBus=dat; //送数据

LED1602_EN=1; //EN=1

delayms(10); //延时

LED1602_EN=0; //EN=0

}void WrDat(uchar dat)

{//uchar i;

ChkBusy();

LED1602_RS=1; //rs=1

LED1602_RW=0; //rw=0

LED1602_EN=0; //en=0

LcdBus=dat; //送数据

LED1602_EN=1; //en=1

delayms(10);; //延时

LED1602_EN=0; //en=0

}void ChkBusy()

{LED1602_RS=0; //RS=0

LED1602_RW=1; //RW=1

LED1602_EN=1; //EN=1

while(LcdBus&0x80); //送数据

LED1602_EN=0; //en=0

}

#include

#define uint unsigned int

#define uchar unsigned char

#define DATE_IO P0

sbit RS=P2^4;

sbit E=P2^6;

sbit RW=P2^5;

uchar code table[]="00:00";

uchar code table1[]="0123456789";

void delay_us(unsigned int n) //延时 如果需要高精度延时 请嵌入汇编

{if (n == 0)

{return ;

}while (--n);

}/*延时函数*/

void delay_ms(uint i)

{unsigned char a, b;

for (a = 1; a < i; a++)

{for (b = 1; b; b++)

{;

}}

}void delay(uint z)

{uint x,y;

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

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

}void write_come(uchar come)

{RS=0;

E=1;

DATE_IO=come;

delay_us(5);

E=0;

RS=1;

}void write_date(uchar date)

{RS=1;

E=1;

DATE_IO=date;

delay_us(5);

E=0;

RS=0;

}void init()//这个是初始化函数 你自己理解一下其实差不多是一样的

{RW=0;

E=0;

write_come(0x38);

delay_ms(5);

write_come(0x08);

delay_ms(5);

write_come(0x01);

delay_ms(5);

write_come(0x06);

write_come(0x0c);

delay_ms(5);

}void init_time()

{uchar i;

for(i=0;i<5;i++)

{write_come(0x80+i);

write_date(table[i]);

}}

void main()

{uchar miao,fen,miaoge,miaoshi,fenshi,fenge;

init();

init_time();

while(1)

{miaoge=miao%10;

miaoshi=miao/10;

write_come(0x80);

write_date(table1[fenshi]);

write_date(table1[fenge]);

write_date(table[2]);

write_date(table1[miaoshi]);

write_date(table1[miaoge]);

miao++;

if(miao==60)

{miao=0;

fen++;

fenge=fen%10;

fenshi=fen/10;

if(fen==60)

fen=0;

}delay(1000);

}}

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至836084111@qq.com 举报,一经查实,本站将立刻删除。

联系我们

工作日:9:30-18:30,节假日休息