
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]="Eaz0";
uchar code table1[]="abc asdfg qwe";
sbit lcden=P3^4;
sbit lcdrs=P3^5;
void delay(uint z);
void write_com(uchar com);
void write_data(uchar date);
void init();
uchar num;
int main()
{
init();
while(1)
{
write_com(0x80);
for(num=0;num<4;num++)
{
write_data(table[num]);
delay(5);
}
write_com(0x80+0x40);
for(num=0;num<13;num++)
{
write_data(table1[num]);
delay(5);
}
}
}
void init()
{
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void write_com(uchar com)
{
lcdrs=0;
P2=com;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void write_data(uchar date)
{
lcdrs=1;
P2=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--)
for(y=110;y>0;y--);
}
不好意思,您的经验真得很不够,这是十分简单的程序,你不懂估计是没有去看液晶的数据手册,或者懒得去看,都是不好的
//
/ 写入字节函数 /
//
void ShowChar(unsigned char pos,unsigned char c)
{
unsigned char p;
if (pos>=0x10) //液晶中,写入不同的行,使用不同的命令,命令保存在p这个变量里面,如果写入第一行,使用else那里的命令,否则使用下面的
p=pos+0xb0; //命令代码高4位为0xc表示写入第二行,即0xb0+0x10=0xc0,后面的四位指示第二行具体哪一个位置,一共有16个位置
else
p=pos+0x80; //命令代码高4位为0x8表示写入第二行,即0x80+0x00=0x80,后面的四位指示第一行具体哪一个位置,一共有16个位置
WriteCommand (p);//写命令
WriteData (c); //写数据
}
//
/ 写入字符串函数 /
//
void ShowString (unsigned char line,char ptr)
{
unsigned char l,i;
l=line<<4; //就是乘以16,0-15在第一行,16-35在第二行
for (i=0;i<16;i++)
ShowChar (l++,(ptr+i));//循环显示16个字符 //调用上面的函数在l位置进行显示
}
给初始化里面加一个
w_cmd(0x0f);
去掉那个busy 然后自己写个等待函数试一下
#include "reg52h"#define uchar unsigned char
#define uint unsigned int
uchar code table[]=" Hello world! ";
uchar code table1[]=" 2013/8/10 ";
uchar num;
sbit rs=P1^0;
sbit rw=P1^1;
sbit lcden=P2^5;
sbit sd=P2^6;
sbit ds1302=P2^7;
sbit dula=P2^0;
sbit wela=P2^1;
sbit cs88=P2^2;
void delay(uint zz)
{
uint xx,yy;
for (xx=zz;xx>0;xx--)
for(yy=110;yy>0;yy--);
}
void comwrite(uchar com)
{
rs=0;
P0=com;
delay(3);
lcden=1;
delay(5);
lcden=0;
delay(8);
}
void datawrite(uchar dat)
{
rs=1;
P0=dat;
delay(3);
lcden=1;
delay(5);
lcden=0;
delay(8);
}
void initlcd()
{
lcden=1;
rw=0;
comwrite(0x38);//设置1602显示
comwrite(0x0f);//开显示 显示光标 光标闪烁
comwrite(0x06);//光标指针加一
comwrite(0x01);//显示清零
comwrite(0x80);//光标指针初始化
}
void main()
{
wela=0;
dula=0;
cs88=0;
ds1302=0;
sd=0;
initlcd();
comwrite(0x80+0x12);
for(num=0;num<16;num++)
{
datawrite(table[num]);
}
comwrite(0x80+0x40+0x12);
for(num=0;num<16;num++)
{
datawrite(table1[num]);
}
for(num=0;num<18;num++)
{
comwrite(0x18);
delay(200);
}
while(1);
}
这是我今年8月份自己写的 你看看
#include<reg52h>
#define uchar unsigned char
#define uint unsigned int
uchar code table[]'STC89C52RC'!;//这边错了
sbit lcden=P3^4;
sbit lcdrs=P3^5;
sbit dula=P2^6;
sbit wela=P2^7;
uchar num;
void delay(uint z)
{
uint x,y;
for(x=z;x>0;x--);
for(y=110;y>0;y--);
}
void write_com(uchar com)
{
lcdrs=0;
P0=com;
delay(5);
lcday=1;
delay(5);
lcden=0;
}
viod write_data(uchar date)//这个write_data函数只能写一个字节
{
lcdrs=1;
P0=date;
delay(5);
lcden=1;
delay(5);
lcden=0;
}
void init()
{
dula=0;
wela=0;
lcden=0;
write_com(0x38);
write_com(0x0c);
write_com(0x06);
write_com(0x01);
}
void main();
{
init();
write_com(0x80);
for(num=0;num<11;num++)
{
write_data(STC89C52RC);//write_data只能写一个字节,这边错了,还有如果要写单个字节,如果是字母的话,还得加引号
//如果要写一个字符串,可以另外写个函数
delay(5);
}
while(1)
}
void init_1602()
{
LCD_1602_EN=0;
LCD_1602_RW=0; //这句话你忘写了,液晶数据也不进去的。。
write_1602_com(0x38); //设置16X2显示,5X7点阵,8位数据接口
write_1602_com(0x0e); //设置开显示,不显示光标
write_1602_com(0x06); //写一个字符后地址指针加1
write_1602_com(0x01); //显示清0,数据指针清0
write_1602_com(0x80); //设置初始显示为第一行第一列
}
楼上回答有问题,虽然没有大循环,但只要初始化正确,LCD的显示是不用扫描的,字符会一直显示。还有就是,不推荐检查LCD的忙信号。
如果只给LCD供电1602应该有一行是全黑显示的。如果初始化正确,全黑显示行会消失。否则应该检查LCD的硬件。
这是我写的一个成功的,你仔细对比下就知道了!
#include<reg52h>
#include<intrinsh>
#define U8 unsigned char
#define U16 unsigned int
#define BOOL bit
U8 secondh,secondl,minuteh,minutel,hourh,hourl,second,minute,hour;
U8 monthl,monthh,month,day,datel,dateh,date,year,yearl,yearh;
/定义LCD功能管脚/
sbit LCDRS = P2^6 ; //控制LCD数据或命令的读写
sbit LCDRW = P2^5 ; //控制LCD读写信号
sbit LCDEN = P2^7 ; //使能LCD
//
/定义DS1302功能管脚/
sbit DSRST = P3^5 ; //DS1302复位管脚
sbit DSIO = P3^4 ; //控制DS1302数据传输
sbit DSCLK = P3^6 ; //DS1302时钟
//
/延时函数/
void delay(U16 time)
{
U16 time1,time2;
for(time1=time;time1>0;time1--)
for(time2=110;time2>0;time2--);
}
//
/检测LCD忙碌状态/
BOOL judge_lcd()
{
BOOL flag;
LCDEN = 0;
LCDRS = 0;
LCDRW = 1;
LCDEN = 1;
delay(1);
flag=(BOOL)(P0&0x80); //状态位第7位为1时禁止读写,为0时可读写
LCDEN = 0;
return flag;
}
//
/实现LCD写指令/
void write_lcd_command(U16 command)
{
while(judge_lcd()); //检测LCD是否为忙碌状态
P0 = command ;
LCDRS = 0 ;
LCDRW = 0 ;
LCDEN = 1 ;
delay(1);
LCDEN = 0 ;
}
//
/实现LCD写数据/
void write_lcd_date(U16 date)
{
while(judge_lcd()); //检测LCD是否为忙碌状态
P0 = date ;
LCDRS = 1 ;
LCDRW = 0 ;
LCDEN = 1 ;
delay(1);
LCDEN = 0 ;
}
//
/实现LCD写指令及数据/
void write_lcd_com_date(U16 addr,U16 date)
{
write_lcd_command(addr);
delay(1);
write_lcd_date(date);
}
//
/初始化LCD/
void init_lcd()
{
write_lcd_command(0x38); //设置16x2显示,5x7点阵,8位数据口
delay(1);
write_lcd_command(0x0c); //开显示,不显示光标,光标不闪烁
delay(1);
write_lcd_command(0x06); //读写一个字符后,地址自动加1,不移动屏幕
delay(1);
write_lcd_command(0x01); //清屏
delay(1);
}
//
/读DS1302/
U8 read_ds1302(U8 addr)
{
U8 i,temp=0x00;
DSRST=0;
DSIO=1;
DSCLK=0;
DSRST=1;
for (i=0;i<8;i++) //循环8次 写入地址数据
{
DSCLK=0;
DSIO=addr&0x01; //每次传输低字节
addr>>=1; //右移一位
DSCLK=1;
}
delay(1);
if(DSIO)
temp|=0x80; //每次传输低字节
DSCLK=0;
temp>>=1;
for (i=0;i<7;i++) //循环8次 读取数据
{
DSCLK=0;
if(DSIO)
temp|=0x80; //每次传输低字节
DSCLK=1;
temp>>=1; //右移一位
}
DSCLK=1;
DSRST=0;
DSIO=0;
return temp; //返回
}
//
/写DS1302/
void write_ds1302(U8 addr, U8 date)
{
U8 i;
DSRST=0;
DSCLK=0;
DSRST=1;
for (i=0;i<8;i++) //循环8次 写入地址数据
{
DSCLK=0;
_nop_();
DSIO=addr&0x01; //每次传输低字节
addr>>=1; //右移一位
DSCLK=1;
_nop_();
}
for (i=0;i<8;i++) //循环8次 写入数据
{
DSCLK=0;
_nop_();
DSIO=date&0x01; //每次传输低字节
date>>=1; //右移一位 DSCLK=1
DSCLK=1;
_nop_();
}
DSRST=0;
delay(1);
}
//
/初始化DS1302/
void init_ds1302()
{
//读秒
if((((second=read_ds1302(0x81))>>7)&&0x01)==1)
{
write_ds1302(0x8e,0x00); //关闭写保护
write_ds1302(0x80,0x00); //00秒
write_ds1302(0x82,0x54); //54分
write_ds1302(0x84,0x17); //17点
write_ds1302(0x86,0x14); //14日
write_ds1302(0x88,0x10); //10月
write_ds1302(0x8a,0x05); //星期五
write_ds1302(0x8c,0x11); //2011年
write_ds1302(0x8e,0x80); //允许写保护
}
}
//
/主函数/
void main()
{
init_lcd();
delay(2);
write_lcd_com_date(0x81,'2');
write_lcd_com_date(0x82,'0');
delay(1);
init_ds1302();
delay(1);
while(1)
{
second=read_ds1302(0x81);
secondl=second&0x0f;
secondh=second>>4;
minute=read_ds1302(0x83);
minutel=minute&0x0f;
minuteh=minute>>4;
hour=read_ds1302(0x85);
hourl=hour&0x0f;
hourh=hour>>4;
month=read_ds1302(0x89);
monthl=month&0x0f;
monthh=month>>4;
year=read_ds1302(0x8d);
yearl=year&0x0f;
yearh=year>>4;
date=read_ds1302(0x87);
datel=date&0x0f;
dateh=date>>4;
day=read_ds1302(0x8b);
day=day&0x0f;
delay(15);
write_lcd_com_date(0xca,0x30+secondl);
write_lcd_com_date(0xc9,0x30+secondh);
write_lcd_com_date(0xc8,':');
write_lcd_com_date(0xc7,0x30+minutel);
write_lcd_com_date(0xc6,0x30+minuteh);
write_lcd_com_date(0xc5,':');
write_lcd_com_date(0xc4,0x30+hourl);
write_lcd_com_date(0xc3,0x30+hourh);
write_lcd_com_date(0x84,0x30+yearl);
write_lcd_com_date(0x83,0x30+yearh);
write_lcd_com_date(0x85,'-');
write_lcd_com_date(0x87,0x30+monthl);
write_lcd_com_date(0x86,0x30+monthh);
write_lcd_com_date(0x88,'-');
write_lcd_com_date(0x8a,0x30+datel);
write_lcd_com_date(0x89,0x30+dateh);
write_lcd_com_date(0x8c,0x30+day);
}
}
以上就是关于基于51单片机的1602显示程序。全部的内容,包括:基于51单片机的1602显示程序。、单片机1602液晶显示中下面的程序什么意思不明白啊 下面带问号都不会啊、单片机1602液晶显示问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)