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

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

代码贴出,供大家参考

需要设定开始地址和移动方式,而后写入数据地址自动加1,给你一段驱动程序,看你会用么

首先是库文件,自己建立一个LCD1602h文件,用记事本或编译器打开,将代码粘贴进去,该文件放在项目文件夹下

#ifndef __LCD1602_H__

#define __LCD1602_H__

#include<reg52h>

#include"timerh"

/以下为函数开关/

//#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

以下是驱动源代码,自己建立一个LCD1602c文件,用记事本或编译器打开,复制粘贴进去:

该文件放在项目文件夹下

#include"LCD1602h"

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+0x40row+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+0x40row+position);

while(str[i])

{

LCD1602_writeData(str[i++]);

}

}

#endif

1、需要修改引脚设置,就到LCD1602h中修改

2、主函数头写上#include“LCD1602h”,将“LCD1602c”添加到项目中

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

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

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

#include<REG52h>

#include"LCD1602h"

void main(void)

{

    LCD1602_initialise();

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

    LCD1602_displayInt(1,0,2015);

    while(1);

}

手打不易,望采纳!

你确定是将程序烧到单片机里面的而不是用keil硬件仿真的吗,如果是烧进去的就只能检测你的初始化程序有没有错误(你说了你的硬件电路没问题的);如果是硬件仿真的话就看看你的设置有没有问题,keil硬件仿真不要勾选串口引发中断,还有就是最好不要用到P3的引脚

#include "LCD1602H"

#include <reg52H>

sbit lcdrs=P2^5; //命令/数据

sbit lcdrw=P2^6; //读/写

sbit lcden=P2^7; //使能端

static void delay(uchar zz)

{

uchar a,b;

for(a=zz;a>0;a--)

for(b=35;b>0;b--);

}

void WriteData(uchar x) //写数据

{

lcden=0;

lcdrs=1;

lcdrw=0;

P0=x;

delay(10);

lcden=1 ;

delay(10);

lcden=0;

lcdrw=1;

}

void WriteCommand(uchar y) //写命令

{

lcden=0; // 写指令 输入:RS=0,RW=0,E=下降沿脉冲,DB0~DB7=指令码 输出:无

lcdrs=0; // 写数据 输入:RS=1,RW=0,E=下降沿脉冲,DB0~DB7=数据 输出:无

lcdrw=0; // 读数据 输入:RS=1,RW=1,E=1 输出:DB0~DB7=数据

P0=y; // 读状态 输入:RS=0,RW=1,E=1 输出:DB0~DB7=状态字

delay(10);

lcden=1 ;

delay(10);

lcden=0;

lcdrw=1;

}

void Init_LCD1602()

{

WriteCommand(0x01);//清屏

WriteCommand(0x38);//1602显示,57点阵设置

WriteCommand(0x38);

WriteCommand(0x0c); //开显示,不显示光标

}

没看到你的程序呢?

你一个while语句就能检测是否忙了。

例如

定义一个变量busy为忙信号。busy=1时液晶处于忙状态。busy=0时处于空闲状态。

那么你检测就用一个while语句

while(busy);//如果液晶处于忙。则等待busy=0;

//1602 四线制驱动程序,根据需要自己改端口定义和延时

#define LINE1 0

#define LINE2 1

#define LINE1_HEAD 0x80

#define LINE2_HEAD 0xC0

#define CLEARSCREEN LCD_en_com(0x01);LCD_delay(30)

//

//change this part at different board

sbit DB7=P2^7;

sbit DB6=P2^6;

sbit DB5=P2^5;

sbit DB4=P2^4;

sbit LCD1602_RS=P2^1; //data command select 1 data 0 command pin 4

sbit LCD1602_RW=P2^2; //read write select 1 read 0 write pin 5

sbit LCD1602_EN=P2^3; //LCD enable signal pin 6

//

void LCD_delay(unsigned int n)

{

unsigned int i=0,j=0;

for (i=n;i>0;i--)

for (j=0;j<12;j++);

}

void LCD_en_com(unsigned char command)

{

DB7=(command>>7)%2;

DB6=(command>>6)%2;

DB5=(command>>5)%2;

DB4=(command>>4)%2;

LCD1602_RS = 0; //RS 0

LCD1602_RW = 0; //RW 0

LCD1602_EN = 1; //EN --\|/__ Write command

LCD_delay(2);

LCD1602_EN = 0;

DB7=(command>>3)%2;

DB6=(command>>2)%2;

DB5=(command>>1)%2;

DB4=(command>>0)%2;

LCD1602_RS = 0; //RS 0

LCD1602_RW = 0; //RW 0

LCD1602_EN = 1; //EN --\|/__ Write command

LCD_delay(2);

LCD1602_EN = 0;

}

void LCD_en_dat(unsigned char command)

{

DB7=(command>>7)%2;

DB6=(command>>6)%2;

DB5=(command>>5)%2;

DB4=(command>>4)%2;

LCD1602_RS = 1; //RS 1

LCD1602_RW = 0; //RW 0

LCD1602_EN = 1; //EN --\|/__ Write data

LCD_delay(2);

LCD1602_EN = 0;

DB7=(command>>3)%2;

DB6=(command>>2)%2;

DB5=(command>>1)%2;

DB4=(command>>0)%2;

LCD1602_RS = 1; //RS 1

LCD1602_RW = 0; //RW 0

LCD1602_EN = 1; //EN --\|/__ Write data

LCD_delay(2);

LCD1602_EN = 0;

}

void LCD_set_xy(unsigned char x,unsigned char y)

{

unsigned char address;

if(y == LINE1)

address = LINE1_HEAD + x;

else

address = LINE2_HEAD + x;

LCD_delay(10);

LCD_en_com(address);

}

void LCD_write_string(unsigned char x,unsigned char y,unsigned char s)

{

LCD_set_xy(x,y);

while(s)

{

LCD_en_dat(s);

s++;

}

}

//

void InitTimer0(void)//200us

{

TMOD = 0x01;

TH0 = 0x0FE;

TL0 = 0x70;

EA = 1;

ET0 = 1;

TR0 = 1;

}

unsigned char LCD_ContCount=0;

sbit LCDCONT=P2^0;

void Timer0Interrupt(void) interrupt 1

{

TH0 = 0x0FE;

TL0 = 0x70;

if(LCD_ContCount<LCD_CONTRAST){LCDCONT=0;}

else{LCDCONT=1;}

LCD_ContCount++;

if(LCD_ContCount==100){LCD_ContCount=0;}

}

//

void LCD_init(void)

{

LCD_delay(50);

LCD_en_com(0x33);//原来1602初始化成4位数据线之前必需先初始化成8位(此时命令发送方式是8位格式,但数据线只需接4位)

LCD_delay(10);

LCD_en_com(0x32);//然后再改到4位线宽,这样初始化才稳定

LCD_delay(10);

LCD_en_com(0x28);//四线模式设置

LCD_delay(10);

LCD_en_com(0x0c);//显示开--对应开关显示控制指令

LCD_delay(10);

CLEARSCREEN;

InitTimer0();

}

//

至于AD,用片上自带的AD就行,没有具体的电路,只能帮你这些了。

另:楼上说用ADC0834的,STC12C5A60S2已经有AD了啊

8位AD,最大255; uchar num; num=AD_receive();//把AD采集回来的数据保存 write_com(0x80);//1602从0x80开始显示数据 write_data(num/100+0x30); //显示字符百位,后面以此类推 write_data(num%100/10+0x30);//十位数 write_data(num%10+0x30);//个位数 至于1602的驱动程序,网上多得是,找找就有了

以上就是关于字符型1602LCD自定义字符地址设置后,字符显示时,地址需要用c语言编程调用吗还是程序默认调全部的内容,包括:字符型1602LCD自定义字符地址设置后,字符显示时,地址需要用c语言编程调用吗还是程序默认调、51单片机驱动1602c液晶显示屏复位的问题、求射频卡RC522程序用51单片机驱动1602显示卡的信息的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zz/9317383.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存