万年历程序,12864屏幕不显示
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P0^7;
sbit lcdrw=P0^6;
sbit lcde=P0^5;
sbit lcdpsb=P0^4;
sbit rst=P1^0;
sbit sclk=P1^2;
sbit io=P1^1;
uchar writedat[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_dat[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar time_dat[7]={14,1,4,21,11,58,30}; //年周月日时分秒
uchar code table[]="0123456789";
uchar code table1[]="一二三四五六日";
uchar str0[16]="2014/04/21";
uchar str1[16]="09:46:30 星期一";
uchar str2[16]="fffff";
uchar str3[16]="dddd";
void write1302_byte(uchar dat);//写数据
void write1302(uchar add,uchar dat);//写地址和写数据
read1302(uchar add);//读数据
void set_rtc(void);//初始化
void lcd12864display(uchar *p,uchar line);
void lcd12864display(uchar *p,uchar line)
{
uchar add;
uchar i;
if(line==1)
{add=0x80;}
if(line==2)
{add=0x90;}
if(line==3)
{add=0x88;}
if(line==4)
{add=0x98;}
i=*p+line;
// write_com(i);
}
void delayms(uint x)
{
uchar i,j;
for(j=0;j<x;j++)
for(i=0;i<110;i++); //延时x秒
}
void write_com(uchar com) //写指令
{
lcdrs=0;
lcdrw=0;
lcde=0;
P2=com;
delayms(5);
lcde=1;
delayms(5);
lcde=0;
}
void write_dat(uchar dat) //写数据
{
lcdrs=1;
lcdrw=0;
lcde=0;
P2=dat;
delayms(5);
lcde=1;
delayms(5);
lcde=0;
}
void lcd_init() //初始化
{
lcdpsb=1;
write_com(0x30);
delayms(5);
write_com(0x0c);
delayms(5);
write_com(0x01);
delayms(5);
}
void write1302_byte(uchar dat)//写数据
{
uchar i;
rst=0;
_nop_();
rst=1;
_nop_();
for(i=0;i<8;i++)
{
sclk=0;
io=dat;
dat=dat&&0x01;
dat=dat>>1;
sclk=1;
}
rst=0;
_nop_();
}
void write1302(uchar add,uchar dat)
{
rst=0;
_nop_();
rst=1;
_nop_();
write1302_byte(add);//写地址
write1302_byte(dat);//写数据
rst=0;
_nop_();
sclk=1;
_nop_();
io=1;
_nop_();
}
read1302(uchar add)
{
uchar i,value;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
write1302_byte(add);
for(i=0;i<8;i++)
{
value=value>>1;
sclk=0;
if(io)
value=value|0x80;
sclk=1;
_nop_();
}
rst=0;
_nop_();
sclk=0;
_nop_();
sclk=1;
_nop_();
io=1;
_nop_();
return value;//返回
}
void set_rtc() //初始化
{
uchar i,j;
for(i=0;i<7;i++)
{
j=time_dat[i]/10;
time_dat[i]=time_dat[i]%10;
time_dat[i]=time_dat[i]+j*16;
}
write1302(0x8e,0x00); //去除写保护
for(i=0;i<7;i++)
{
write1302(writedat[i],time_dat[i]);
}
write1302(0x8e,0x80);//写保护
}
void read_str(void)
{
uchar i;
for(i=0;i<7;i++)
{
time_dat[i]=read1302(read_dat[i]);
}
}
struct Time
{
uchar second;
uchar minute;
uchar hour;
uchar day;
uchar week;
uchar month;
uchar year;
}time;
//extern struct Time time;
void mian()
{
time.second=59;
time.minute=30;
time.hour=11;
time.day =21;
time.week=1;
time.month=4;
time.year=14;
set_rtc();
delayms(50);
lcd_init();
delayms(50);
while(1)
{
read_str();
str0[2]=table[time.year/10];
str0[3]=table[time.year%10];
str0[6]=table[time.month/10];
str0[7]=table[time.month%10];
str0[9]=table[time.day/10];
str0[10]=table[time.day%10];
str1[1]=table[time.hour/10];
str1[2]=table[time.hour%10];
str1[4]=table[time.minute/10];
str1[5]=table[time.minute%10];
str1[7]=table[time.second/10];
str1[8]=table[time.second%10];
str1[14]=table1[(time.week-1)*2-1];
str1[15]=table1[(time.week-1)*2] ;
lcd12864display(str0,1);
lcd12864display(str1,2);
lcd12864display(str2,3);
lcd12864display(str3,4);
}
}
看到你的留言了,这两天在忙毕业论文,而且又你问题又问得不清不楚,所以一直没回。12864我也没用过,刚买了回来也没心思去弄它。但是也看了一点。12864不显示,首先检查一下硬件线路有没问题。管脚对不,看一次初始化程序。如果屏幕没问题不显示一般都是这些问题。我也没用过只能给点建议。
我用最小系统和时钟模块,和液晶屏都检查过了,硬件没问题了。就是不显示啊,我怀疑是ds1302读到的数据每一写进去液晶屏,或者是ds1302的初始化错了
硬件没问题,我觉得是1302读到的数据没写到液晶屏里面
你看看ds1302的初始化有没有问题
液晶屏有没显示其他东西还是一点东西都不显示。先让液晶屏显示其他的东西有没问题。
液晶屏显示其他的东西有没问题,我试过了
行,我现在在弄,等我弄好了在发给你。
感谢啊,其实我对1302还不是很熟悉
我改了一下DS1302的驱动函数。你的main函数都写成mian.我仿真一直没反应。我还以为是程序问题呢。
你ds1302的读写都保存在数组time-dat中,根本就没有用到结构体time.
发改过的程序给你你下载看看还有什么问题没。因为我不会12864,因此也不能完全仿真。有问题再上来问。
- #include <reg52.h>
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit lcdrs=P0^7;
- sbit lcdrw=P0^6;
- sbit lcde=P0^5;
- sbit lcdpsb=P0^4;
- sbit rst=P1^0;
- sbit sclk=P1^2;
- sbit io=P1^1;
- uchar writedat[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
- uchar read_dat[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
- uchar time_dat[7]={14,1,4,21,11,58,30}; //年周月日时分秒
- uchar code table[]="0123456789";
- uchar code table1[]="一二三四五六日";
- uchar str0[16]="2014/04/21";
- uchar str1[16]="09:46:30 星期一";
- uchar str2[16]="fffff";
- uchar str3[16]="dddd";
- void write1302_byte(uchar dat);//写数据
- void write1302(uchar add,uchar dat);//写地址和写数据
- read1302(uchar add);//读数据
- void set_rtc(void);//初始化
- void lcd12864display(uchar *p,uchar line);
- void lcd12864display(uchar *p,uchar line)
- {
- uchar add;
- uchar i;
- if(line==1)
- {add=0x80;}
- if(line==2)
- {add=0x90;}
- if(line==3)
- {add=0x88;}
- if(line==4)
- {add=0x98;}
- i=*p+line;
- // write_com(i);
- }
- void delayms(uint x)
- {
- uchar i,j;
- for(j=0;j<x;j++)
- for(i=0;i<110;i++); //延时x秒
- }
- void write_com(uchar com) //写指令
- {
- lcdrs=0;
- lcdrw=0;
- lcde=0;
- P2=com;
- delayms(5);
- lcde=1;
- delayms(5);
- lcde=0;
- }
- void write_dat(uchar dat) //写数据
- {
- lcdrs=1;
- lcdrw=0;
- lcde=0;
- P2=dat;
- delayms(5);
- lcde=1;
- delayms(5);
- lcde=0;
- }
- void lcd_init() //初始化
- {
- lcdpsb=1;
- write_com(0x30);
- delayms(5);
- write_com(0x0c);
- delayms(5);
- write_com(0x01);
- delayms(5);
- }
- void write1302_byte(uchar dat)//写数据
- {
- uchar i;
- for(i=0;i<8;i++)
- {
- sclk=0;
- io=dat&0x01;
- dat=dat>>1;
- sclk=1;
- }
- }
- void write1302(uchar add,uchar dat)
- {
- rst=0;
- _nop_();
- sclk=0;
- _nop_();
- rst=1;
- _nop_();
- write1302_byte(add);//写地址
- write1302_byte(dat);//写数据
- rst=0;
- }
- read1302(uchar add)
- {
- uchar i,value;
- rst=0;
- _nop_();
- sclk=0;
- _nop_();
- rst=1;
- _nop_();
- write1302_byte(add);
- for(i=0;i<8;i++)
- {
- value=value>>1;
- sclk=0;
- if(io)
- value=value|0x80;
- sclk=1;
- _nop_();
- }
- rst=0;
- _nop_();
- sclk=0;
- _nop_();
- sclk=1;
- _nop_();
- io=0;
- _nop_();
- return value;//返回
- }
- void set_rtc() //初始化
- {
- uchar i,j;
- for(i=0;i<7;i++)
- {
- j=time_dat[i]/10;
- time_dat[i]=time_dat[i]%10;
- time_dat[i]=time_dat[i]+j*16;
- }
- write1302(0x8e,0x00); //去除写保护
- for(i=0;i<7;i++)
- {
- write1302(writedat[i],time_dat[i]);
- }
- write1302(0x8e,0x80);//写保护
- }
- void read_str(void)
- {
- uchar i;
- for(i=0;i<7;i++)
- {
- time_dat[i]=read1302(read_dat[i]);
- }
- }
- void main()
- {
- set_rtc();
- delayms(50);
- lcd_init();
- delayms(50);
- while(1)
- {
- read_str();
- str0[2]=table[time_dat[0]/10];
- str0[3]=table[time_dat[0]%10];
- str0[6]=table[time_dat[2]/10];
- str0[7]=table[time_dat[2]%10];
- str0[9]=table[time_dat[3]/10];
- str0[10]=table[time_dat[3]%10];
- str1[1]=table[time_dat[4]/10];
- str1[2]=table[time_dat[4]%10];
- str1[4]=table[time_dat[5]/10];
- str1[5]=table[time_dat[5]%10];
- str1[7]=table[time_dat[6]/10];
- str1[8]=table[time_dat[6]%10];
- str1[14]=table1[(time_dat[1]-1)*2-1];
- str1[15]=table1[(time_dat[1]-1)*2] ;
- lcd12864display(str0,1);
- lcd12864display(str1,2);
- lcd12864display(str2,3);
- lcd12864display(str3,4);
- }
-
- }
#include <reg52.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
sbit lcdrs=P0^7;
sbit lcdrw=P0^6;
sbit lcde=P0^5;
sbit lcdpsb=P0^4;
sbit rst=P1^0;
sbit sclk=P1^2;
sbit io=P1^1;
uchar writedat[]={0x8c,0x8a,0x88,0x86,0x84,0x82,0x80};
uchar read_dat[]={0x8d,0x8b,0x89,0x87,0x85,0x83,0x81};
uchar time_dat[7]={14,1,4,21,11,58,30}; //年周月日时分秒
uchar code table[]="0123456789";
uchar code table1[]="一二三四五六日";
uchar str0[16]="2014/04/21";
uchar str1[16]="09:46:30 星期一";
uchar str2[16]="1302显示实验";
uchar str3[16]="暂时未成功";
void write1302_byte(uchar dat);//写数据
void write1302(uchar add,uchar dat);//写地址和写数据
read1302(uchar add);//读数据
void set_rtc(void);//初始化
void display_daan(void);
void write_com(uchar com);
void write_dat(uchar dat) ;
void delayms(uint x);
void display(void)
{
uchar i;
write_com(0x80);
for(i=0;i<10;i++)
{
write_dat(str0[i]);
delayms(5);
}
}
void display1(void)
{
uchar i;
write_com(0x90);
for(i=0;i<15;i++)
{
write_dat(str1[i]);
delayms(5);
}
}
void display2(void)
{
uchar i;
write_com(0x88);
for(i=0;i<12;i++)
{
write_dat(str2[i]);
delayms(5);
}
}
void display3(void)
{
uchar i;
write_com(0x98);
for(i=0;i<10;i++)
{
write_dat(str3[i]);
delayms(5);
}
}
void display_daan(void)
{
display();
display1();
display2();
display3();
}
void delayms(uint x)
{
uchar i,j;
for(j=0;j<x;j++)
for(i=0;i<110;i++); //延时x秒
}
void write_com(uchar com) //写指令
{
lcdrs=0;
lcdrw=0;
lcde=0;
P2=com;
delayms(5);
lcde=1;
delayms(5);
lcde=0;
}
void write_dat(uchar dat) //写数据
{
lcdrs=1;
lcdrw=0;
lcde=0;
P2=dat;
delayms(5);
lcde=1;
delayms(5);
lcde=0;
}
void lcd_init() //初始化
{
lcdpsb=1;
write_com(0x30);
delayms(5);
write_com(0x0c);
delayms(5);
write_com(0x01);
delayms(5);
}
void write1302_byte(uchar dat)//写数据
{
uchar i;
for(i=0;i<8;i++)
{
sclk=0;
io=dat&0x01;
dat=dat>>1;
sclk=1;
}
}
void write1302(uchar add,uchar dat)
{
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
write1302_byte(add);//写地址
write1302_byte(dat);//写数据
rst=0;
}
read1302(uchar add)
{
uchar i,value;
rst=0;
_nop_();
sclk=0;
_nop_();
rst=1;
_nop_();
write1302_byte(add);
for(i=0;i<8;i++)
{
value=value>>1;
sclk=0;
if(io)
value=value|0x80;
sclk=1;
_nop_();
}
rst=0;
_nop_();
sclk=0;
_nop_();
sclk=1;
_nop_();
io=0;
_nop_();
return value;//返回
}
void set_rtc() //初始化
{
uchar i,j;
for(i=0;i<7;i++)
{
j=time_dat[i]/10;
time_dat[i]=time_dat[i]%10;
time_dat[i]=time_dat[i]+j*16;
}
write1302(0x8e,0x00); //去除写保护
for(i=0;i<7;i++)
{
write1302(writedat[i],time_dat[i]);
}
write1302(0x8e,0x80);//写保护
}
void read_str(void)
{
uchar i;
for(i=0;i<7;i++)
{
time_dat[i]=read1302(read_dat[i]);
}
}
void main()
{
set_rtc();
delayms(50);
lcd_init();
delayms(50);
while(1)
{
read_str();
str0[2]=table[time_dat[0]/10];
str0[3]=table[time_dat[0]%10];
str0[6]=table[time_dat[2]/10];
str0[7]=table[time_dat[2]%10];
str0[9]=table[time_dat[3]/10];
str0[10]=table[time_dat[3]%10];
str1[1]=table[time_dat[4]/10];
str1[2]=table[time_dat[4]%10];
str1[4]=table[time_dat[5]/10];
str1[5]=table[time_dat[5]%10];
str1[7]=table[time_dat[6]/10];
str1[8]=table[time_dat[6]%10];
str1[14]=table1[(time_dat[1]-1)*2-1];
str1[15]=table1[(time_dat[1]-1)*2] ;
display_daan();
}
}
我改了下程序,能显示。时间,日期都不对了。
1302的驱动程序没有问题,读进去的时间有问题。