1、需要修改引脚设置,就到LCD1602.h中修改
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 举报,一经查实,本站将立刻删除。