关于ds12c887电子时钟的lcd液晶显示问题

SuperHeroMario 2017-01-04 09:09:38
#include <reg51.h>
#include <intrins.h>
#include "define.h"
uchar xdata *ds_addr=0x0000; //set ds12c87 date and time ram address
uchar code initdisp[] = {" 2000-00-00 00:00:00"};
uchar code initdisp1[]={"set time:00:00:00"};
uchar code DT_lcdplace[]={0x05,0x08,0x0b,0x44,0x47,0x4a};
uchar code DT_lcdplace1[]={0x06,0x09,0x0c,0x45,0x48,0x4b};
uchar code DT_lcdplace2[]={0x44,0x47,0x4a};
uchar code DT_lcdplace3[]={0x45,0x48,0x4b};
uchar code DTdata_addr[] = {9,8,7,4,2,0};
uchar code DTdata_addr1[]={5,3,1};
uchar DTdata_tab[] = {0,0,0,0,0,0};
uchar DTdata_tab1[] = {0,0,0};
uchar data_h,data_l;
bit flag,flag_ri;
void delay(uchar ms)
{
uchar i;
while(ms--)
{
for(i=0; i<250; i++)
{
_nop_();
_nop_();
_nop_();
_nop_();
}
}
}
void di()
{
beep=0;
delay(100);
beep=1;
}
bit lcd_bz()
{
bit busy;
rs=0;
rw=1;
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
busy=(bit)(P1&0x80);
ep=0;
return busy;
}

void lcd_wcmd(unsigned char cmd)
{
while(lcd_bz());//判断LCD是否忙碌
rs=0;
rw=0;
ep=0;
_nop_();
_nop_();
P1=cmd;
_nop_();
_nop_();
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
_nop_();
_nop_();
ep=0;
}

void lcd_pos(unsigned char pos)
{
lcd_wcmd(pos|0x80);
}

void lcd_wdat(unsigned char dat)
{
while(lcd_bz());//判断LCD是否忙碌
rs=1;
rw=0;
ep=0;
P1=dat;
_nop_();
_nop_();
ep=1;
_nop_();
_nop_();
ep=0;
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
_nop_();_nop_();
}
void datapro(void) //modify year、month、day、hour、minute、second data
{
if(DTdata_tab[5]==0x60) //modify second data
{
DTdata_tab[5]=0x00;
}
if(DTdata_tab[5]==0xf9)
{
DTdata_tab[5]=0x59;
}

if(DTdata_tab[4]==0x60) //modify minute data
{
DTdata_tab[4]=0x00;
}
if(DTdata_tab[4]==0xf9)
{
DTdata_tab[4]=0x59;
}

if(DTdata_tab[3]==0x13) //modify hour data
{
DTdata_tab[3]=0x01;
}
if(DTdata_tab[3]==0x00)
{
DTdata_tab[3]=0x12;
}

if(DTdata_tab[2]==0x32) //modify day data
{
DTdata_tab[2]=0x01;
}
if(DTdata_tab[2]==0x00)
{
DTdata_tab[2]=0x31;
}

if(DTdata_tab[1]==0x13) //modify month data
{
DTdata_tab[1]=0x01;
}
if(DTdata_tab[1]==0x00)
{
DTdata_tab[1]=0x12;
}

if(DTdata_tab[0]==0xa0) //modify year data
{
DTdata_tab[0]=0x00;
}
if(DTdata_tab[0]==0xf9)
{
DTdata_tab[0]=0x99;
}

}
void datapro1()
{
if(DTdata_tab1[2]==0x60) //modify second data
{
DTdata_tab1[2]=0x00;
}
if(DTdata_tab1[2]==0xf9)
{
DTdata_tab1[2]=0x59;
}

if(DTdata_tab1[1]==0x60) //modify minute data
{
DTdata_tab1[1]=0x00;
}
if(DTdata_tab1[1]==0xf9)
{
DTdata_tab1[1]=0x59;
}

if(DTdata_tab1[0]==0x13) //modify hour data
{
DTdata_tab1[0]=0x01;
}
if(DTdata_tab1[0]==0x00)
{
DTdata_tab1[0]=0x12;
}
}
void data_hl()
{
uchar i;
for(i=0; i<6; i++)
{
if(i==3)
{
if((DTdata_tab[i]&0x80)!=0)
{
DTdata_tab[i]=(DTdata_tab[i]&0x7f)&0x7f;
}
}
data_h=DTdata_tab[i]/16;
data_l=DTdata_tab[i]%16;

lcd_pos(DT_lcdplace[i]);
lcd_wdat(data_h+48); //'0'=48
lcd_wdat(data_l+48); //'0'=48
}
}
void data_pro()
{
uchar i;
for(i=0; i<6; i++)
{
DTdata_tab[i]=*(ds_addr+DTdata_addr[i]);
}
data_hl();

}
void date_init(void) //diaplay date:
{
uchar i;
lcd_pos(0x00);
for(i=0; i<13; i++)
{
lcd_wdat(initdisp[i]);
}

lcd_pos(0x44);
for(i=14; i<22; i++)
{
lcd_wdat(initdisp[i]);
}
}
void lcd_init()
{
lcd_wcmd(0x38);
delay(1);
lcd_wcmd(0x0c);
delay(1);
lcd_wcmd(0x06);
delay(1);
lcd_wcmd(0x01);
}
void key(void)
{
uchar keyval=0,keyval1=0;
bit keyflag=0,keyflag1=0;
if(flag_ri==1)
{
if((keyset==0)||(keyadd==0)||(keysub==0)||(keyclk==0)||(keywrd==0)||(keybck==0))
{
delay(10);
if((keyset==0)||(keyadd==0)||(keysub==0)||(keyclk==0)||(keywrd==0)||(keybck==0))
{
while(!(keyset&&keyadd&&keysub&&keyclk&&keywrd&&keybck));di();
flag_ri=0;
}
}
}
if(keyset==0)
{
delay(10);
if(keyset==0)
{
while(keyset==0);di();
lcd_wcmd(0x0f);
while(keyval!=6)
{
lcd_pos(DT_lcdplace1[keyval]);
if(keyset==0)
{
delay(10);
if(keyset==0)
{
keyval++;
if(keyval==6)
keyval=0;
while(keyset==0);di();
}
}
if(keyadd==0)
{
delay(10);
if(keyadd==0)
{
keyflag=1;
DTdata_tab[keyval]++;

if((DTdata_tab[keyval]&0x0f)==0x0a)
{
DTdata_tab[keyval]=DTdata_tab[keyval]+6;
}

while(keyadd==0);di();
}
}
if(keysub==0)
{
delay(10);
if(keysub==0)
{
keyflag=1;
DTdata_tab[keyval]--;

if((DTdata_tab[keyval]&0x0f)==0x0f)
{
DTdata_tab[keyval]=DTdata_tab[keyval]-6;
}
while(keysub==0);di();
}
}
if(keybck==0)
{
delay(10);
if(keybck==0)
{
while(keybck==0);di();
keyflag=0;
keyval=0;
break;
}
}
if(keyflag==1)
{
keyflag=0;
datapro();

*(ds_addr+0)=DTdata_tab[5]; //write modified data
*(ds_addr+2)=DTdata_tab[4];
*(ds_addr+4)=DTdata_tab[3];
*(ds_addr+7)=DTdata_tab[2];
*(ds_addr+8)=DTdata_tab[1];
*(ds_addr+9)=DTdata_tab[0];

data_hl();
}
}
lcd_wcmd(0x0c);
}
}
if(keyclk==0)
{
uchar i;
delay(10);
if(keyclk==0)
{
while(keyclk==0);di();
lcd_wcmd(0x01);
flag=~flag;
if(flag==1)
{
lcd_pos(0x00);
for(i=0;i<9;i++)
{
lcd_wdat(initdisp1[i]);
}
lcd_pos(0x44);
for(i=9;i<17;i++)
{
lcd_wdat(initdisp1[i]);
}
while(1)
{
for(i=0; i<3; i++)
{
DTdata_tab1[i]=*(ds_addr+DTdata_addr1[i]);
}
for(i=0; i<3; i++)
{
data_h=DTdata_tab1[i]/16;
data_l=DTdata_tab1[i]%16;

lcd_pos(DT_lcdplace2[i]);
lcd_wdat(data_h+48); //'0'=48
lcd_wdat(data_l+48); //'0'=48
}
if(keyset==0)
{
delay(10);
if(keyset==0)
{
while(keyset==0);di();
lcd_wcmd(0x0f);
while(1)
{
lcd_pos(DT_lcdplace3[keyval1]);
if(keyset==0)
{
delay(10);
if(keyset==0)
{
keyval1++;
if(keyval1>=3)
keyval1=0;
while(keyset==0);di();
}
}
if(keyadd==0)
{
delay(10);
if(keyadd==0)
{
keyflag1=1;
DTdata_tab1[keyval1]++;
if((DTdata_tab1[keyval1]&0x0f)==0x0a)
{
DTdata_tab1[keyval1]=DTdata_tab1[keyval1]+6;
}
while(keyadd==0);di();
}
}
if(keysub==0)
{
delay(10);
if(keysub==0)
{
keyflag1=1;
DTdata_tab1
[keyval1]--;
if((DTdata_tab1[keyval1]&0x0f)==0x0f)
{
DTdata_tab1[keyval1]=DTdata_tab1[keyval1]-6;
}
while(keysub==0);di();
}
}

if(keyflag1==1)
{
keyflag1=0;
datapro1();
*(ds_addr+1)=DTdata_tab1[2]; //write modified data
*(ds_addr+3)=DTdata_tab1[1];
*(ds_addr+5)=DTdata_tab1[0];

for(i=0; i<3; i++)
{
data_h=DTdata_tab1[i]/16;
data_l=DTdata_tab1[i]%16;

lcd_pos(DT_lcdplace2[i]);
lcd_wdat(data_h+48); //'0'=48
lcd_wdat(data_l+48); //'0'=48
}
}

if(keybck==0)
{
delay(10);
if(keybck==0)
{
while(keybck==0);di();
flag=0;
keyflag1=0;
keyval1=0;
break;
}
}
}
//lcd_wcmd(0x01);
lcd_wcmd(0x0c);
lcd_init();
date_init();
break;
}
}
}
}
}
}
}


void main(void)
{
*(ds_addr+10)=0x20;
*(ds_addr+11)=0x22;
lcd_init();
date_init();
EA=1;
EX1=1;
IT1=1;
while(1)
{
data_pro();//datapro();
data_hl();
key();
if(flag_ri==1)
{
di();
delay(500);
key();
}
}
}
void ecter() interrupt 2
{
//uchar c;
flag_ri=1;
*(ds_addr+12)=0x00;
}
下面是define.h的代码
#define uchar unsigned char
#define uint unsigned int

sbit DS_AS = P2^6;
sbit DS_CS = P2^7;
sbit DS_RW = P3^6;
sbit DS_DS = P3^7;
sbit dsirq=P3^3;
sbit rs=P2^2; //寄存器选择端口
sbit rw=P2^1; //读写选择端口
sbit ep=P2^0; //使能信号端口
sbit keyset=P3^0; //按键设置
sbit keyadd=P3^1; //
sbit keysub=P3^2; //
sbit keyclk=P2^4;
sbit keywrd=P3^4;
sbit keybck=P2^5;
sbit beep=P3^5;

我想问一下为什么初始上电时,如果时间是下午十二点之后小时的数据显示的是八十几
...全文
345 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
farmanlinuxer 2017-01-12
  • 打赏
  • 举报
回复
看看DS12C887的数据手册,看是不是有12小时制和24小时制两种计时方式,如果有,可能是芯片状态处于12H状态, 读出的时间小时数要根据12H还是24H区别处理。

27,377

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧