代码贴出,供大家参考
需要设定开始地址和移动方式,而后写入数据地址自动加1,给你一段驱动程序,看你会用么
首先是库文件,自己建立一个LCD1602.h文件,用记事本或编译器打开,将代码粘贴进去,该文件放在项目文件夹下
#ifndef __LCD1602_H__
#define __LCD1602_H__
#include
#include"timer.h"
/*以下为函数开关*/
//#define LCD1602_CKECKBUSY
//#define LCD1602_CLEANSCREEN
#define LCD1602_DISPLAYSTR
#define LCD1602_DSIPLAYINT
/****************/
#define lcd_port P0 //LCD1602总线接口
sbit lcdrs = P2^3; //寄存器选择,高电平1选择数据寄存器、低电平0选择指令寄存器。
sbit lcden = P2^5; //使能端,写操作时,下降沿使能,读操作时,E高电平有效
sbit lcdrw = P2^4; //读写选通,高电平读,低电平写。
//注意改驱动不支持从LCD读取数据
void LCD1602_initialise(); //初始化函数,开机后,显示内容之前,请初始化
#ifdef LCD1602_CLEANSCREEN
void LCD1602_cleanScreen(bit rewind); //清屏函数(rewind为0),或使光标归位(rewind为1时)
#endif
#ifdef LCD1602_DISPLAYSTR //显示字符(串)
void LCD1602_displayStr(unsigned char row,unsigned char position,unsigned char *dat);
#endif
#ifdef LCD1602_DSIPLAYINT //显示整型数据(-32767~32767)
void LCD1602_displayInt(unsigned char row,unsigned char position,int dat); //一次写入整型数(-32767~32767),position为开始位置
#endif
void LCD1602_setCmd(unsigned char command); //设定子函数 写指令或设定地址
void LCD1602_writeData(unsigned char dat); //向LCD1602写入数据,记得先用写指令函数设定地址
#ifdef LCD1602_CKECKBUSY
bit LCD1602_checkBusy(); //判忙函数,忙返回值为1
#endif
/*****************************************************************/
/* row显示位置行选择,0为第一行,1为第二行 */
/* position显示位置的其实位置,为该行所在位置,值:0~15 */
/* dat为显示内容 */
/*****************************************************************/
#endif
以下是驱动源代码,自己建立一个LCD1602.c文件,用记事本或编译器打开,复制粘贴进去:
该文件放在项目文件夹下
#include"LCD1602.h"
void delay(unsigned int ms)//延时大约1ms
{
unsigned int i;
for(;ms>0;ms--)
for(i=0;i<120;i++);
}
void delayMicroseconds(unsigned int us)
{
for(;us>4;us-=4);
}
void LCD1602_setCmd(unsigned char command) //设定子函数 写指令
{
lcdrs=0; //当lcdrs=0 时,允许写入指令
lcd_port=command;
delayMicroseconds(5);
lcden=1;
delayMicroseconds(5);
lcden=0;
}
void LCD1602_writeData(unsigned char dat) //写数据
{
lcdrs=1; //当lcdrs=1 时,允许写入显示
lcd_port=dat;
delay(1);
lcden=1; //lcden高脉冲将P0口数据读走
delayMicroseconds(5);
lcden=0;
}
#ifdef LCD1602_CLEANSCREEN
void LCD1602_cleanScreen(bit rewind) //清屏或光标归位函数
{
if(rewind)
LCD1602_setCmd(0x02); //光标归位指令
else
LCD1602_setCmd(0x01); //清屏指令
delay(5);
}
#endif
#ifdef LCD1602_CKECKBUSY
bit LCD1602_checkBusy(void) //判忙函数
{
lcd_port=0xFF;
lcdrs=0;
lcdrw=1;
lcden=0;
delayMicroseconds(1);
lcden=1;
return !(bit)(lcd_port&0x80);
}
#endif
void LCD1602_initialise() //初始化函数
{
lcden=0;
lcdrw=0;
LCD1602_setCmd(0x38); //指令码:设置16X2显示,5X7点阵,8位数据接口
LCD1602_setCmd(0x0C); //指令码:开显示,不显示光标
LCD1602_setCmd(0x06); //指令码:指针加一,整屏不移动
LCD1602_setCmd(0x01); //显示清屏
delay(10); //稍停顿下,让LCD正确配置好
} //*/
#ifdef LCD1602_DISPLAYSTR
void LCD1602_displayStr(unsigned char row,unsigned char position,unsigned char *dat)//一次写入字符串(超出不显示),position为开始位置
{
LCD1602_setCmd(0x80+0x40*row+position);
while(*dat)
{
LCD1602_writeData(*dat++);
}
}
#endif
#ifdef LCD1602_DSIPLAYINT
void LCD1602_displayInt(unsigned char row,unsigned char position,int dat) //一次写入整型数(-32767~32767),position为开始位置
{
unsigned char str[7];
unsigned char i=0;
bit flag=0;
if(dat==0)
{
str[i++]=0x30;
}
else
{
if(dat<0)
{
str[i++]=0x2D;
dat=-dat;
}
if(dat/10000 ||flag){str[i++]=dat/10000+0x30; flag=1;}
if(dat/1000%10||flag){str[i++]=dat/1000%10+0x30;flag=1;}
if(dat/100%10 ||flag){str[i++]=dat/100%10+0x30; flag=1;}
if(dat/10%10 ||flag){str[i++]=dat/10%10+0x30; flag=1;}
if(dat%10 ||flag){str[i++]=dat%10+0x30; }
}
str[i]=0;
flag=0;
i=0;
LCD1602_setCmd(0x80+0x40*row+position);
while(str[i])
{
LCD1602_writeData(str[i++]);
}
}
#endif
1、需要修改引脚设置,就到LCD1602.h中修改
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);
}
手打不易,望采纳!
每行顺序写入,不要越界。
默认是从第一个开始
要改变的话就要设置