字符型1602LCD自定义字符地址设置后,字符显示时,地址需要用c语言编程调用吗?还是程序默认调

2024-11-23 23:36:33
推荐回答(3个)
回答1:

代码贴出,供大家参考

需要设定开始地址和移动方式,而后写入数据地址自动加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);
}

手打不易,望采纳!

回答2:

每行顺序写入,不要越界。

回答3:

默认是从第一个开始
要改变的话就要设置