📄 12887.c
字号:
#include <reg51.h>
#include <absacc.h>
#include <intrins.h>
#define uchar unsigned char
#define uint unsigned int
#define ulong unsigned long
#define BYTEPERLINE 16
#define ABSLINE 16
#define FLAGADD 0x7f00 //0-8191
#define ADDRAMHEAD 0x6000 //0x6000-7fff P2.5 0110--0111
#define DSHEAD 0x0 //DS12887 P2.6 0000
#define HEAD 0xaa
//DS12887
#define SECONDS 0
#define SECONDALARM 1
#define MINUTES 2
#define MINUTEALARM 3
#define HOURS 4
#define HOURALARM 5
#define DAYOFWEEK 6
#define DAYOFMONTH 7
#define MONTH 8
#define YEAR 9
#define REGISTERA 10
#define REGISTERB 11
#define REGISTERC 12
#define REGISTERD 13
#define AORDER1 0x2f//0x20//0b00100000 //禁止SQW;启动DS12887
#define BORDER1 0x82//0b10000010 //开始修改禁止计时;禁止所有功能;24MODE;BCD OUT。
#define BORDER0 0x02//0x02//0b00000010 //结束修改。
sbit UnUsed0=P1^0;
sbit UnUsed1=P1^1;
sbit Unused6=P1^6;
sbit Unused7=P1^7;
uchar DSDATE[10]={0x00,0x00,0x30,0x30,0x17,0x17,0x03,0x01,0x09,0x04};
uchar Date[8]={2,0,0,4,0,8,3,1};
uchar Time[6]={1,5,3,1,0,0};
bit DisPicture=0;
uchar code Num[]={
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*-- 文字: 0 --*/
0x00,0x00,0x00,0x10,0x70,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x7C,0x00,0x00,/*-- 文字: 1 --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x04,0x04,0x08,0x10,0x20,0x42,0x7E,0x00,0x00,/*-- 文字: 2 --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x04,0x18,0x04,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*-- 文字: 3 --*/
0x00,0x00,0x00,0x04,0x0C,0x14,0x24,0x24,0x44,0x44,0x7E,0x04,0x04,0x1E,0x00,0x00,/*-- 文字: 4 --*/
0x00,0x00,0x00,0x7E,0x40,0x40,0x40,0x58,0x64,0x02,0x02,0x42,0x44,0x38,0x00,0x00,/*-- 文字: 5 --*/
0x00,0x00,0x00,0x1C,0x24,0x40,0x40,0x58,0x64,0x42,0x42,0x42,0x24,0x18,0x00,0x00,/*-- 文字: 6 --*/
0x00,0x00,0x00,0x7E,0x44,0x44,0x08,0x08,0x10,0x10,0x10,0x10,0x10,0x10,0x00,0x00,/*-- 文字: 7 --*/
0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,0x42,0x3C,0x00,0x00,/*-- 文字: 8 --*/
0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x26,0x1A,0x02,0x02,0x24,0x38,0x00,0x00 /*-- 文字: 9 --*/
};//
uchar code MAINLIB[]={
//年[16*16]横排
0x8,0x0,0x8,0x8,0x1F,0xFC,0x11,0x0,
0x21,0x0,0x41,0x10,0x1F,0xF8,0x11,0x0,
0x11,0x0,0x11,0x4,0xFF,0xFE,0x1,0x0,
0x1,0x0,0x1,0x0,0x1,0x0,0x1,0x0, //32
//月[16*16]横排
0x0,0x10,0xF,0xF8,0x8,0x10,0x8,0x10,
0x8,0x10,0xF,0xF0,0x8,0x10,0x8,0x10,
0x8,0x10,0xF,0xF0,0x8,0x10,0x8,0x10,
0x10,0x10,0x10,0x10,0x20,0x50,0x40,0x20,
//日[16*16]横排
0x0,0x10,0x1F,0xF8,0x10,0x10,0x10,0x10,
0x10,0x10,0x10,0x10,0x10,0x10,0x1F,0xF0,
0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,
0x10,0x10,0x1F,0xF0,0x10,0x10,0x0,0x0,
//;时[16*16]横排
0x00,0x08,0x04,0x08,0x7E,0x08,0x44,0x08,
0x47,0xFE,0x44,0x08,0x44,0x08,0x7C,0x88,
0x44,0x48,0x44,0x48,0x44,0x08,0x44,0x08,
0x7C,0x08,0x44,0x48,0x00,0x28,0x00,0x10,
//;分[16*16]横排
0x00,0x80,0x04,0x80,0x04,0x40,0x08,0x40,
0x08,0x20,0x10,0x10,0x20,0x08,0x4F,0xEE,
0x84,0x24,0x04,0x20,0x04,0x20,0x04,0x20,
0x04,0x20,0x08,0x20,0x11,0x40,0x20,0x80,
//;秒[16*16]横排
0x04,0x20,0x0E,0x20,0x78,0x20,0x08,0x20,
0x08,0xA8,0xFE,0xA6,0x08,0xA2,0x1D,0x20,
0x1A,0x24,0x28,0x24,0x28,0x28,0x48,0x10,
0x88,0x20,0x08,0x40,0x08,0x80,0x0B,0x00,
};
void MakeTimeImage(uint,uchar);
void MakeDateImage(uint,uchar);
void Delay(uint);
void WriteMode(uchar,uchar);
void WriteTime(void);
void ReadTime(void);
void DSToDateTime(void);
void DSToDateTime(void)
{
//DSDATE[10]={ 0x00,0x00,0x00,0x00,0x17,0x17,0x03,0x01,0x09,0x04};
//sec min hour week date month year
//Date[8]={2,0,0,4,0,8,3,1};
//Time[6]={1,5,3,1,0,0};
uchar i=0;
Date[0]=2;
Date[1]=0;
Date[2]=(DSDATE[9])>>4;
Date[3]=(DSDATE[9]&0x0f);
Date[4]=(DSDATE[8])>>4;
Date[5]=(DSDATE[8]&0x0f);
Date[6]=(DSDATE[7])>>4;;
Date[7]=(DSDATE[7]&0x0f);
Time[0]=(DSDATE[4])>>4;
Time[1]=(DSDATE[4]&0x0f);
Time[2]=(DSDATE[2])>>4;
Time[3]=(DSDATE[2]&0x0f);
Time[4]=(DSDATE[0])>>4;
Time[5]=(DSDATE[0]&0x0f);
}
void WriteMode(uchar AMode,uchar BMode)
{
XBYTE[DSHEAD+REGISTERA]=AMode;
_nop_();
_nop_();
XBYTE[DSHEAD+REGISTERB]=BMode;
_nop_();
_nop_();
}
void WriteTime(void)
{
//DSDATE[10]={ 0x00,0x00,0x00,0x00,0x17,0x17,0x03,0x01,0x09,0x04};
//sec min hour week date month year
XBYTE[DSHEAD]=DSDATE[0];
XBYTE[DSHEAD+1]=DSDATE[1];
XBYTE[DSHEAD+2]=DSDATE[2];
XBYTE[DSHEAD+3]=DSDATE[3];
XBYTE[DSHEAD+4]=DSDATE[4];
XBYTE[DSHEAD+5]=DSDATE[5];
XBYTE[DSHEAD+6]=DSDATE[6];
XBYTE[DSHEAD+7]=DSDATE[7];
XBYTE[DSHEAD+8]=DSDATE[8];
XBYTE[DSHEAD+9]=DSDATE[9];
}
void ReadTime(void)
{ DSDATE[0]=XBYTE[DSHEAD];
DSDATE[1]=XBYTE[DSHEAD+1];
DSDATE[2]=XBYTE[DSHEAD+2];
DSDATE[3]=XBYTE[DSHEAD+3];
DSDATE[4]=XBYTE[DSHEAD+4];
DSDATE[5]=XBYTE[DSHEAD+5];
DSDATE[6]=XBYTE[DSHEAD+6];
DSDATE[7]=XBYTE[DSHEAD+7];
DSDATE[8]=XBYTE[DSHEAD+8];
DSDATE[9]=XBYTE[DSHEAD+9];
}
///////////////////////////////////////////////////////////////////////////////////////
///////////////////////////////////////////////////////////////////////////////////////
void Delay(uint DelayTime)
{
uchar i;
while (DelayTime!=0)
{
DelayTime--;//
for(i=0;i<111;i++){}
}
}
///(111+2)*DelayTime 110次:(0.1mS 11.0592MHz/0.05mS 22.1184MHz)
void DeliverPerLine(uchar DelayTime)
{
uchar Time;
for(;Time<DelayTime;Time++){}
}
void MCReceive() interrupt 4 using 3
{
uint T_Addr=ADDRAMHEAD+2*ABSLINE*BYTEPERLINE;
uchar i,j;
uchar Buffer[10];//
Res=OUTUNABLE;
ES=0;
RI=0;
if(SBUF!=HEAD)
return;
WriteMode(AORDER1,BORDER1);
Delay(10);
for(i=0;i<10;i++)
{
while(RI==0){}
RI=0;
Buffer[i]=SBUF;
}
//Buffer[0]:表示当前年 00-99
//Buffer[1]:表示当前月 1-12
//Buffer[2]:表示当前日 1-31
//Buffer[3]:表示当前时 0-23
//Buffer[4]:表示当前分 0-59
//Buffer[5]:表示当前秒 0-59
//Buffer[6]:表示星期日 1-7
//Buffer[7]:
//Buffer[8]:
//Buffer[9]:
if(Buffer[0]==0xf0)
{
DSDATE[0]+=5;
for(j=0;j<ABSLINE;j++)
for(i=0;i<BYTEPERLINE;i++)
{
while(RI==0){}
RI=0;
XBYTE[T_Addr++]=SBUF;
}
DisPicture=1;
}
else if((Buffer[0]>99)||(Buffer[1]>12)||(Buffer[2]>31)||(Buffer[3]>23)||(Buffer[4]>59)||(Buffer[5]>59)||(Buffer[6]>7))
{
DSDATE[0]+=3;
}
else
{
//DSDATE[10]={ 0x00,0x00,0x00,0x00,0x17,0x17,0x03,0x01,0x09,0x04};
//sec min hour week date month year
DSDATE[0]=(((Buffer[5])/10)<<4)+((Buffer[5])%10);
DSDATE[1]=(((Buffer[5])/10)<<4)+((Buffer[5])%10);
DSDATE[2]=(((Buffer[4])/10)<<4)+((Buffer[4])%10);
DSDATE[3]=(((Buffer[4])/10)<<4)+((Buffer[4])%10);
DSDATE[4]=(((Buffer[3])/10)<<4)+((Buffer[3])%10);
DSDATE[5]=(((Buffer[3])/10)<<4)+((Buffer[3])%10);
DSDATE[6]=(((Buffer[6])/10)<<4)+((Buffer[6])%10);
DSDATE[7]=(((Buffer[2])/10)<<4)+((Buffer[2])%10);
DSDATE[8]=(((Buffer[1])/10)<<4)+((Buffer[1])%10);
DSDATE[9]=(((Buffer[0])/10)<<4)+((Buffer[0])%10);
}
WriteTime();
WriteMode(AORDER1,BORDER0);
Delay(10);
return;
}
void MakeDateImage(uint TargetAddr,uchar LineNum)
{
uint TargetAdd=TargetAddr+LineNum*BYTEPERLINE;
uchar i=LineNum,j;
for(j=0;j<BYTEPERLINE;j++)
{
switch(j)
{
case 0:
XBYTE[TargetAdd++]=0;
break;
case 1:
case 2:
case 3:
case 4:
XBYTE[TargetAdd++]=Num[16*Date[j-1]+i];//0123
break;
case 5: XBYTE[TargetAdd++]=MAINLIB[(i*2)];//年
break;
case 6: XBYTE[TargetAdd++]=MAINLIB[(i*2)+1];//年
break;
case 7:
case 8:
XBYTE[TargetAdd++]=Num[16*Date[j-3]+i];//45
break;
case 9: XBYTE[TargetAdd++]=MAINLIB[32+(i*2)];//月
break;
case 10: XBYTE[TargetAdd++]=MAINLIB[32+(i*2)+1];//月
break;
case 11:
case 12:
XBYTE[TargetAdd++]=Num[16*Date[j-5]+i];//67
break;
case 13: XBYTE[TargetAdd++]=MAINLIB[64+(i*2)];//日
break;
case 14: XBYTE[TargetAdd++]=MAINLIB[64+(i*2)+1];//日
break;
case 15:
XBYTE[TargetAdd++]=0;
break;
default : break;
}
}
}
void MakeTimeImage(uint TargetAddr,uchar LineNum)
{
uchar i=LineNum,j;
uint TargetAdd=TargetAddr+LineNum*BYTEPERLINE;
for(j=0;j<BYTEPERLINE;j++)
{
switch(j)
{
case 0:
case 1:
XBYTE[TargetAdd++]=0;
break;
case 2:
case 3:
XBYTE[TargetAdd++]=Num[16*Time[j-2]+i]; //01
break;
case 4: XBYTE[TargetAdd++]=MAINLIB[96+(i*2)];//时
break;
case 5: XBYTE[TargetAdd++]=MAINLIB[96+(i*2)+1];//时
break;
case 6:
case 7: XBYTE[TargetAdd++]=Num[16*Time[j-4]+i];//23
break;
case 8: XBYTE[TargetAdd++]=MAINLIB[128+(i*2)];//分
break;
case 9: XBYTE[TargetAdd++]=MAINLIB[128+(i*2)+1];//分
break;
case 10:
case 11: XBYTE[TargetAdd++]=Num[16*Time[j-6]+i];//45
break;
case 12: XBYTE[TargetAdd++]=MAINLIB[160+(i*2)];//秒
break;
case 13: XBYTE[TargetAdd++]=MAINLIB[160+(i*2)+1];//秒
break;
case 14:
case 15:
XBYTE[TargetAdd++]=0;
break;
default: break;
}
}
}
void main(void)
{
uchar i;
uchar TotalPage,CurPage,CurLine;
uint TargetAddr,DelayPerPage,TimePerLine,TargetAddrOff=0,TimeCounter=0;
uint DisTimes=0;
WriteMode(AORDER1,BORDER0);
TH1=0xfe;
TL1=0xfe;
PCON=0x80;
TMOD=0x21;
TR1=1; /////Enable Counter
SCON=0x70; /////Enable Receive 8 Bit UART variable Bode Rate
PS=1; /////Serial IP High
ES=1;
EA=1;
Delay(400);//
Delay(400);//
Delay(400);//
Delay(400);//
Delay(400);//
Delay(400);//
Delay(400);//
Delay(400);//
Delay(400);//
Delay(400);//
//根据串口来的图像数编排:新图像总数,读取时间到图像RAM,帧间延时
TotalPage=1;
TargetAddr=ADDRAMHEAD;
//WriteMode(AORDER1,BORDER0);
ReadTime();
DSToDateTime();
for(CurLine=0;CurLine<ABSLINE;CurLine++)
MakeTimeImage(ADDRAMHEAD,CurLine);
for(CurLine=0;CurLine<ABSLINE;CurLine++)
MakeDateImage(ADDRAMHEAD+ABSLINE*BYTEPERLINE,CurLine);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -