基于51单片机的1602显示程序。

基于51单片机的1602显示程序。,第1张

#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液晶显示问题等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

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

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

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

发表评论

登录后才能评论

评论列表(0条)

    保存