
代码贴出,供大家参考
需要设定开始地址和移动方式,而后写入数据地址自动加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显示卡的信息的程序等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)