DS12C887+STC89C52RC+LCD1602出现问题,求助!
时间:10-02
整理:3721RD
点击:
数码管显示没有问题,但是换了lcd1602就只能显示四条白杠
求助,把程序贴在下面:
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
//ds12c887引脚
sbit AS=P0^1;
sbit wr=P0^2;
sbit DS=P0^3;
sbit CS=P0^0;
//lcd1602引脚
sbit lcd_enable=P2^5;
sbit STATE7=P0^7;
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P2^5;
//时间变量
uchar sec,min,hour,s1,s2,m1,m2,h1,h2;
//延时函数
void delay(uchar t)
{
uchar a,b,c;
for(a=t;a>0;a--)
for(b=50;b>0;b--)
for(c=25;c>0;c--)
{;}
}
//lcd1602相关函数
void busy_check(void)
{
P0=0xff;
do{
RS=0;
RW=1;
EN=0;
EN=1;
}
while(STATE7==1);
lcd_enable=0;
}
void write_cmd(uchar cmd)
{
busy_check();
RS=0;
RW=0;
P0=cmd;
_nop_();
EN=1;
_nop_();
EN=0;
}
void write_data(uchar Data)
{
busy_check();
RS=1;
RW=0;
P0=Data;
_nop_();
EN=1;
_nop_();
EN=0;
}
void lcd1602_init()
{
P0=0xff;
EN=0;
write_cmd(0x38);
write_cmd(0x0f);
write_cmd(0x06);
write_cmd(0x01);
}
void write_byte(uchar d,uchar a)
{
CS=0;
AS=1;
DS=1;
wr=1;
P3=a;
AS=0;
wr=0;
P3=d;
wr=1;
AS=1;
CS=1;
}
uchar read_byte(uchar a)
{
uchar d;
AS=1;
DS=1;
wr=1;
CS=0;
P3=a;
AS=0;
DS=0;
P3=0xff;
d=P3;
DS=1;
AS=1;
CS=1;
return d;
}
void set_time()
{
write_byte(0x00,0x00);
write_byte(0x18,0x02);
write_byte(0x0e,0x04);
}
void RTC_init()
{
//uchar i=read_byte(0x0a)|0x7f;
//if(i==0xff)
{
write_byte(0x20,0x0a);
write_byte(0x06,0x0b);
set_time();
}
}
void get_time()
{
sec=read_byte(0x00);
s1=sec/10;
s2=sec%10;
min=read_byte(0x02);
m1=min/10;
m2=min%10;
hour=read_byte(0x04);
h1=hour/10;
h2=hour%10;
}
void main()
{
//RTC_init(); //initialization then not use it
lcd1602_init();
dlock=0;
wlock=0;
while(1)
{
get_time();
write_cmd(0x80);
write_data(h1);
delay(255);
write_data(h2);
delay(1);
write_data(':');
delay(1);
write_data(m1);
delay(1);
write_data(m2);
delay(1);
write_data(':');
delay(1);
write_data(s1);
delay(1);
write_data(s2);
delay(1);
}
}
求助,把程序贴在下面:
#include<reg52.h>
#include<intrins.h>
typedef unsigned char uchar;
//ds12c887引脚
sbit AS=P0^1;
sbit wr=P0^2;
sbit DS=P0^3;
sbit CS=P0^0;
//lcd1602引脚
sbit lcd_enable=P2^5;
sbit STATE7=P0^7;
sbit RS=P1^0;
sbit RW=P1^1;
sbit EN=P2^5;
//时间变量
uchar sec,min,hour,s1,s2,m1,m2,h1,h2;
//延时函数
void delay(uchar t)
{
uchar a,b,c;
for(a=t;a>0;a--)
for(b=50;b>0;b--)
for(c=25;c>0;c--)
{;}
}
//lcd1602相关函数
void busy_check(void)
{
P0=0xff;
do{
RS=0;
RW=1;
EN=0;
EN=1;
}
while(STATE7==1);
lcd_enable=0;
}
void write_cmd(uchar cmd)
{
busy_check();
RS=0;
RW=0;
P0=cmd;
_nop_();
EN=1;
_nop_();
EN=0;
}
void write_data(uchar Data)
{
busy_check();
RS=1;
RW=0;
P0=Data;
_nop_();
EN=1;
_nop_();
EN=0;
}
void lcd1602_init()
{
P0=0xff;
EN=0;
write_cmd(0x38);
write_cmd(0x0f);
write_cmd(0x06);
write_cmd(0x01);
}
void write_byte(uchar d,uchar a)
{
CS=0;
AS=1;
DS=1;
wr=1;
P3=a;
AS=0;
wr=0;
P3=d;
wr=1;
AS=1;
CS=1;
}
uchar read_byte(uchar a)
{
uchar d;
AS=1;
DS=1;
wr=1;
CS=0;
P3=a;
AS=0;
DS=0;
P3=0xff;
d=P3;
DS=1;
AS=1;
CS=1;
return d;
}
void set_time()
{
write_byte(0x00,0x00);
write_byte(0x18,0x02);
write_byte(0x0e,0x04);
}
void RTC_init()
{
//uchar i=read_byte(0x0a)|0x7f;
//if(i==0xff)
{
write_byte(0x20,0x0a);
write_byte(0x06,0x0b);
set_time();
}
}
void get_time()
{
sec=read_byte(0x00);
s1=sec/10;
s2=sec%10;
min=read_byte(0x02);
m1=min/10;
m2=min%10;
hour=read_byte(0x04);
h1=hour/10;
h2=hour%10;
}
void main()
{
//RTC_init(); //initialization then not use it
lcd1602_init();
dlock=0;
wlock=0;
while(1)
{
get_time();
write_cmd(0x80);
write_data(h1);
delay(255);
write_data(h2);
delay(1);
write_data(':');
delay(1);
write_data(m1);
delay(1);
write_data(m2);
delay(1);
write_data(':');
delay(1);
write_data(s1);
delay(1);
write_data(s2);
delay(1);
}
}
1602光度太高了吗。
调节电位器 好像与亮度无关
莫非与液晶的响应速度有关?
调节电位器不就是调光度嘛
恩,与光度无关
