16X16点阵数字钟问题

2020-01-25 15:23发布

小弟最近从网上找到个16*16点陈移动数字钟,想自已制作一个,不知怎样修改才可以显示为自已的姓名.请大家指点下
#include "reg51.h"
#include "intrins.h"
typedef unsigned char uint8;
typedef unsigned int uint16;
#define LED_Y P2
#define LCD_DATA 1
#define LCD_COMMAND 0
#define WORDNUU 11
sbit Ser_STB=P2^5;
sbit LED_EN=P2^4;
sbit LCD_RS=P1^5;
sbit LCD_RW=P1^6;
sbit LCD_EN=P1^7;
sbit RTC_SDA=P3^6;
sbit RTC_SCL=P3^5;
sbit RTC_RST=P3^4;
sbit KEY1=P1^0;
sbit KEY2=P1^1;
sbit KEY3=P1^2;
sbit KEY4=P1^3;
sbit DQ=P1^4;
uint8 TEMP_ERR;
#define  LCD_PORT P0
uint8 WORDNUM,WORDNUMBER;
uint8 Temp_Value;
uint8 LCD_NO;
uint16 i1,i2;
uint8 bdata AA;
sbit AA7 = AA^7;
#define READ_SECOND     0x81
#define WRITE_SECOND    0x80
#define READ_MINE       0x83
#define WRITE_MINE      0x82
#define READ_HOUR       0x85
#define WRITE_HOUR                 0x84
#define READ_DAY                0x87
#define WRITE_DAY                0x86
#define READ_MONTH                0x89
#define WRITE_MONTH                0x88
#define READ_WEEK                0x8b
#define WRITE_WEEK                0x8a
#define READ_YEAR       0x8d
#define WRITE_YEAR                0x8c
uint8 DATE[16];
uint8 TIME[16];

uint8 const code HZ[][32]=
{
        {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1*/
        {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1*/

{0xFD,0xFF,0xFE,0xFF,0x80,0x01,0xBE,0xFB,0x7E,0xF7,0xFE,0xFF,0x80,0x03,0xFC,0x7F,0xFA,0x7F,0xFA,0xBF,0xF6,0xDF,0xEE,0xEF,0xDE,0xF1,0xBE,0xFB,0xFE,0xFF,0xFF,0xFF},/*"宋",0*/

{0xDF,0xFF,0xEE,0xEF,0xEE,0xEF,0x76,0xEF,0xB4,0x03,0xAE,0xEF,0xEE,0xEF,0xEE,0xEF,0xDE,0xEF,0xD0,0x01,0x1E,0xDF,0xDE,0xEF,0xDD,0xF7,0xDD,0xF3,0xDB,0xFB,0xD7,0xFB},/*"洪",1*/

{0xFB,0xBF,0xFB,0xBF,0xFB,0xBF,0xFB,0xBB,0xBB,0xB9,0xDB,0xB3,0xDB,0xB7,0xEB,0xAF,0xE3,0xAF,0xEB,0x9F,0xFB,0xBF,0xFB,0xBF,0xFB,0xBB,0x00,0x01,0xFF,0xFF,0xFF,0xFF},/*"业",2*/

{0xEF,0xFF,0xEE,0x07,0xEE,0xF7,0x02,0x07,0xEE,0xF7,0xEE,0x07,0xE7,0xFF,0xC8,0x03,0xAF,0xBF,0x6D,0xBF,0xED,0x83,0xED,0xBF,0xE9,0xBF,0xEA,0x3F,0xA7,0x81,0xDF,0xFF},/*"提",3*/

{0xFF,0xFF,0x01,0x03,0xD7,0x7B,0xD7,0x03,0x01,0x7B,0x55,0x03,0x55,0xDF,0x55,0x5F,0x51,0x03,0x3C,0xDF,0x01,0xDF,0x7D,0x03,0x7D,0xDF,0x01,0xDF,0x7E,0x01,0xFF,0xFF},/*"醒",4*/

{0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0x00,0x01,0xFE,0xFF,0xFD,0x7F,0xFD,0x7F,0xFD,0xBF,0xFB,0xBF,0xFB,0xDF,0xF7,0xEF,0xEF,0xE7,0xDF,0xF1,0xBF,0xFB},/*"大",5*/

{0xFD,0xFF,0xFE,0xFF,0xC0,0x01,0xBF,0xFB,0xA0,0x17,0xFE,0xFF,0xFD,0xFF,0xF0,0xDF,0x8D,0x4F,0xFB,0x3F,0xE6,0x3F,0x99,0x4F,0xE7,0x71,0x9F,0x7B,0xFA,0xFF,0xFD,0xFF},/*"家",6*/

{0xFF,0xFF,0x00,0x07,0xED,0xF7,0xED,0xB7,0xED,0xB7,0xED,0xB7,0x81,0xB7,0xED,0xB7,0xED,0xB7,0xED,0x57,0xE3,0x5F,0x1E,0xDD,0xFE,0xDD,0xFD,0xDD,0xFB,0xE1,0xF7,0xFF},/*"现",7*/

{0xFD,0xFF,0xFD,0xFF,0x80,0x01,0xFB,0xFF,0xFB,0xFF,0xF7,0xBF,0xE7,0xBF,0xE8,0x03,0xCF,0xBF,0xAF,0xBF,0x6F,0xBF,0xEF,0xBF,0xEF,0xBF,0xE8,0x01,0xEF,0xFF,0xFF,0xFF},/*"在",8*/

{0xFF,0xFF,0xF0,0x0F,0xF7,0xEF,0xF0,0x0F,0xF7,0xEF,0xF0,0x0F,0xFF,0xFF,0x00,0x01,0xFE,0xFF,0xF6,0xFF,0xF6,0x07,0xF6,0xFF,0xEA,0xFF,0xDC,0xFF,0xBF,0x01,0xFF,0xFF},/*"是",9*/
        {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1*/
        {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*" ",1*/
        0x55,0xaa,
};
uint8 const code NUM[][16]=
{
        {0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF},/*"0",0*/
        {0xFF,0xFF,0xFF,0xEF,0x8F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0x83,0xFF,0xFF},/*"1",1*/
        {0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xFB,0xFB,0xF7,0xEF,0xDF,0xBD,0x81,0xFF,0xFF},/*"2",2*/
        {0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xFB,0xE7,0xFB,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF},/*"3",3*/
        {0xFF,0xFF,0xFF,0xFB,0xF3,0xEB,0xDB,0xDB,0xBB,0xBB,0x81,0xFB,0xFB,0xE1,0xFF,0xFF},/*"4",4*/
        {0xFF,0xFF,0xFF,0x81,0xBF,0xBF,0xBF,0xA7,0x9B,0xFD,0xFD,0xBD,0xBB,0xC7,0xFF,0xFF},/*"5",5*/
        {0xFF,0xFF,0xFF,0xE3,0xDB,0xBF,0xBF,0xA7,0x9B,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF},/*"6",6*/
        {0xFF,0xFF,0xFF,0x81,0xBB,0xBB,0xF7,0xF7,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xFF,0xFF},/*"7",7*/
        {0xFF,0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF},/*"8",8*/
        {0xFF,0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xD9,0xE5,0xFD,0xFD,0xDB,0xC7,0xFF,0xFF},/*"9",9*/
};
uint8 const code DATETMP[][32]=
{
        {0xF7,0xFF,0xF0,0x03,0xEF,0x7F,0xEF,0x7F,0xDF,0x7F,0xB0,0x07,0x77,0x7F,0xF7,0x7F,0xF7,0x7F,0xF7,0x7F,0x00,0x01,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F,0xFF,0x7F},/*"年",0*/
        {0xF8,0x0F,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xF8,0x0F,0xFB,0xEF,0xFB,0xEF,0xFB,0xEF,0xF8,0x0F,0xFB,0xEF,0xF7,0xEF,0xF7,0xEF,0xEF,0xEF,0xDF,0xAF,0xBF,0xDF,0xFF,0xFF},/*"月",1*/
        {0xFF,0xFF,0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xE0,0x0F,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF},/*"日",2*/
        {0xFE,0xFF,0xFE,0xFF,0xFE,0x07,0xFE,0xFF,0xFE,0xEF,0xE0,0x07,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xE0,0x0F,0xEF,0xEF,0xFE,0xEF,0xD7,0x77,0xDB,0xBB,0xBB,0xBB,0xFF,0xFF},/*"点",3*/
        {0xF7,0x7F,0xF3,0x7F,0xF7,0xBF,0xEF,0xDF,0xEF,0xCF,0xDF,0xE7,0xBF,0xF1,0x60,0x1B,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xF7,0xDF,0xEF,0x5F,0xDF,0xBF,0xBF,0xFF},/*"分",4*/
        {0xFF,0xFF,0xE0,0x07,0xEF,0xF7,0xE0,0x07,0xEF,0xF7,0xE0,0x07,0xFE,0xFF,0xEE,0xFF,0xE0,0x03,0xDE,0xFF,0xDE,0xFF,0xB0,0x07,0xFE,0xFF,0xFE,0xFF,0x80,0x01,0xFF,0xFF},/*"星",5*/
        {0xDD,0xFF,0xDD,0x83,0x80,0xBB,0xDD,0xBB,0xC1,0xBB,0xDD,0x83,0xC1,0xBB,0xDD,0xBB,0xDD,0xBB,0x00,0x83,0xFF,0xBB,0xDB,0x7B,0xDD,0x7B,0xBC,0xEB,0x7E,0xF7,0xFF,0xFF},/*"期",6*/
        {0xE0,0x07,0xFE,0xFF,0x80,0x01,0xBE,0xFB,0xE2,0x8F,0xFE,0xFF,0xE2,0x8F,0xFD,0x7F,0xFB,0x9F,0xE5,0xE1,0x1E,0xF7,0xE0,0x1F,0xFF,0xBF,0xFD,0x7F,0xFE,0xFF,0xFE,0xFF},/*"零",7*/
        {0xFF,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0x07,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFF,0xFE,0xFB,0x80,0x01,0xFF,0xFF},/*"上",8*/
        {0xD8,0x03,0xDE,0xEF,0xDE,0x0F,0x06,0xEF,0xDE,0x0F,0xD6,0xE3,0xC8,0x0F,0x9F,0xEF,0x50,0x41,0xDB,0x5D,0xDC,0xEB,0xDE,0xF7,0xDD,0x67,0xDB,0x99,0x56,0x7B,0xBF,0xFF},/*"摄",9*/
        {0xFF,0xFF,0xFF,0x07,0xC0,0xFF,0xDE,0xFF,0xDE,0xFF,0xDE,0xFF,0xC0,0x03,0xDF,0x7F,0xDF,0x7F,0xDF,0x7F,0xDF,0xBF,0xDF,0xBF,0xDB,0xDB,0xD7,0xEB,0xCF,0xF3,0xDF,0xFB},/*"氏",10*/
        {0xFE,0xFF,0xFF,0x7F,0xC0,0x01,0xDD,0xDF,0xDD,0xDF,0xD0,0x03,0xDD,0xDF,0xDC,0x1F,0xDF,0xFF,0xD8,0x07,0xDD,0xEF,0xDE,0xDF,0xDF,0x3F,0xBE,0xCF,0xB9,0xF1,0x67,0xFB},/*"度",11*/
} ;
uint8 const code WEEK[][32]=
{
        {0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*"一",0*/
        {0xFF,0xFF,0xFF,0xEF,0xC0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFB,0x80,0x01,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*"二",1*/
        {0xFF,0xFF,0xFF,0xFF,0x80,0x03,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xC0,0x07,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x80,0x01,0xFF,0xFF,0xFF,0xFF},/*"三",2*/
        {0xFF,0xFF,0x80,0x03,0xBB,0x7B,0xBB,0x7B,0xBB,0x7B,0xBB,0x7B,0xBB,0x7B,0xBB,0x7B,0xB7,0x7B,0xB7,0x83,0xAF,0xFB,0x9F,0xFB,0xBF,0xFB,0x80,0x03,0xBF,0xFB,0xFF,0xFF},/*"四",3*/
        {0xFF,0xFF,0x80,0x07,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xFF,0xFD,0xDF,0xC0,0x0F,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDF,0xFB,0xDB,0x00,0x01,0xFF,0xFF,0xFF,0xFF},/*"五",4*/
        {0xFB,0xFF,0xFC,0xFF,0xFE,0x7F,0xFE,0xFF,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0xFB,0x7F,0xF9,0xBF,0xFB,0xDF,0xF7,0xEF,0xF7,0xE7,0xEF,0xF3,0xDF,0xF3,0xBF,0xF7,0xFF,0xFF},/*"六",5*/
        {0xFF,0xFF,0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xE0,0x0F,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xEF,0xE0,0x0F,0xEF,0xEF,0xFF,0xFF,0xFF,0xFF},/*"日",6*/
};
void TEMP_Delay(uint16 i)
{
        while(i--);
}
void TEMP_INITIALIZE()
{
        DQ=1;
        TEMP_Delay(8);
        DQ=0;
        TEMP_Delay(80);
        DQ=1;
        TEMP_Delay(14);
        TEMP_ERR=DQ;
        TEMP_Delay(20);
}

uint8 TEMP_Read_Char()
{
        uint8 i;
        uint8 dat;
        for(i=0;i<8;i++)
        {
                DQ=0;
                dat>>=1;
                DQ=1;
                if(DQ)
                dat|=0x80;
                TEMP_Delay(4);
        }
        return dat;
}

void TEMP_Write_Char(uint8 dat)
{
        uint8 i;
        for(i=0;i<8;i++)
        {
                DQ=0;
                DQ=dat&0x01;
                TEMP_Delay(5);
                DQ=1;
                dat>>=1;
        }
}

void TEMP_Read()
{
        uint8 a,b;
        TEMP_INITIALIZE();
        TEMP_Write_Char(0xcc);
        TEMP_Write_Char(0x44);
        TEMP_Delay(100);
        TEMP_INITIALIZE();
        TEMP_Write_Char(0xcc);
        TEMP_Write_Char(0xbe);
        TEMP_Delay(100);
        a=TEMP_Read_Char();
        b=TEMP_Read_Char();
        Temp_Value=b<<4;
        Temp_Value+=(a&0xf0)>>4;
}

void RTC_Write(uint8 dat)
{
        uint8 i;          
        for(i=0;i<8;i++)
        {
                RTC_SDA=(bit)(dat&0x01);
                RTC_SCL=1;
                RTC_SCL=0;
                dat>>=1;
        }
}

uint8 RTC_Read()                                               
{
    uint8 i;
    for(i=0; i<8; i++)
    {
        AA >>=1;                                 //相当于汇编中的 RRC
        AA7 = RTC_SDA;
        RTC_SCL = 1;
        RTC_SCL = 0;
    }
    return AA;
}

void RTC_Write_Byte(uint8 addr,uint8 dat)
{
        RTC_RST=0;
        RTC_SCL=0;
        RTC_RST=1;
        RTC_Write(addr);
        RTC_Write(dat);
        RTC_SCL=1;
        RTC_RST=0;
}

uint8 RTC_Read_Byte(uint8 addr)
{
        uint8 dat;
        RTC_RST=0;
        RTC_SCL=0;
        RTC_RST=1;
        RTC_Write(addr|0x01);
        dat=RTC_Read();
        RTC_SCL=1;
        RTC_RST=0;
        return dat;
}


typedef struct __SYSTEMTIME__
{
        uint8  Second;
        uint8  Mine;
        uint8  Hour;
        uint8  Day;
        uint8  Month;
        uint8  Week;
        uint8  Year;
}SYSTEMTIME;
static SYSTEMTIME TIMETYPE;

void CurrentTime(SYSTEMTIME *dat)
{
        uint8 TimeValue;
        TimeValue=RTC_Read_Byte(READ_SECOND);
        dat->Second=(((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
        TimeValue=RTC_Read_Byte(READ_MINE);
        dat->Mine=  (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
        TimeValue=RTC_Read_Byte(READ_HOUR);
        dat->Hour=  (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
        TimeValue=RTC_Read_Byte(READ_DAY);
        dat->Day=        (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
        TimeValue=RTC_Read_Byte(READ_MONTH);
        dat->Month= (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
        TimeValue=RTC_Read_Byte(READ_WEEK);
        dat->Week=        (TimeValue&0x0f);
        TimeValue=RTC_Read_Byte(READ_YEAR);
        dat->Year=        (((TimeValue&0x70)>>4)*10)+(TimeValue&0x0f);
}
bit LCD_BUSY()
{
        bit result;
        LCD_RS=0;
        LCD_RW=1;
        LCD_EN=1;
        _nop_();
        _nop_();
        result=(bit)(LCD_PORT&0x80);
        LCD_EN=0;
        return result;
}
void LCD_Write(uint8 dat,uint8 type)
{
        uint8 i;
        while((LCD_BUSY()&&i<100)){i++;}
        if(i>99)LCD_NO=1;
        LCD_RS=type;
        LCD_RW=0;
        LCD_EN=0;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD_PORT=dat;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD_EN=1;
        _nop_();
        _nop_();
        _nop_();
        _nop_();
        LCD_EN=0;
}
void LCD_INITIALIZE()
{
        LCD_Write(0x06,LCD_COMMAND);
        LCD_Write(0x38,LCD_COMMAND);
        LCD_Write(0x0c,LCD_COMMAND);
        LCD_Write(0x01,LCD_COMMAND);
}       
void LCD_Prints(uint8 *dat,uint8 add)
{
        LCD_Write(add|0x80,LCD_COMMAND);
        while(*dat!='')LCD_Write((*(dat++)),LCD_DATA);
}
void et0() interrupt 1 using 0
{
        static uint8 i;
        TH0=0xf3;
        TL0=0xf3;
        TR0=1;
        i++;
        if(i==22)
        {
                i=0;
                WORDNUMBER++;
        }
}
void KEY_Delay()
{
        uint8 i,j;
        for(i=0;i<200;i++)
        for(j=0;j<200;j++);
}
void SET_YEAR()
{
        uint8 YEAR[3];
        LCD_Prints("  YEAR SETTING  ",0);
        LCD_Prints("  YEAR:20       ",0x40);
        if((!KEY3)&&(TIMETYPE.Year<80)){KEY_Delay();i1=i2=0;TIMETYPE.Year++;}
        else if(TIMETYPE.Year>79)TIMETYPE.Year=0;
        if((!KEY4)&&(TIMETYPE.Year>0)){KEY_Delay();i1=i2=0;TIMETYPE.Year--;}
        YEAR[0]=(TIMETYPE.Year/10)+'0';
        YEAR[1]=(TIMETYPE.Year%10)+'0';
        YEAR[2]='';
        LCD_Prints(YEAR,0x49);
}                       
void SET_MONTH()
{
        uint8 MONTH[3];
        LCD_Prints("  MONTH SETTING ",0);
        LCD_Prints("  MONTH:        ",0x40);
        if((!KEY3)&&(TIMETYPE.Month<13)){KEY_Delay();TIMETYPE.Month++;i1=i2=0;}
        else if(TIMETYPE.Month>12)TIMETYPE.Month=1;
        if((!KEY4)&&(TIMETYPE.Month>1)){KEY_Delay();TIMETYPE.Month--;i1=i2=0;}
        MONTH[0]=(TIMETYPE.Month/10)+'0';
        MONTH[1]=(TIMETYPE.Month%10)+'0';
        MONTH[2]='';
        LCD_Prints(MONTH,0x48);
}
void SET_DAY()
{
        uint8 DAY[3];
        LCD_Prints("  DAY SETTING   ",0);
        LCD_Prints("  DAY:          ",0x40);
        if((!KEY3)&&(TIMETYPE.Day<32)){KEY_Delay();TIMETYPE.Day++;i1=i2=0;}
        else if(TIMETYPE.Day>31)TIMETYPE.Day=1;
        if((!KEY4)&&(TIMETYPE.Day>1)){KEY_Delay();TIMETYPE.Day--;i1=i2=0;}
        DAY[0]=(TIMETYPE.Day/10)+'0';
        DAY[1]=(TIMETYPE.Day%10)+'0';
        DAY[2]='';
        LCD_Prints(DAY,0x46);
}
void SET_WEEK()
{
        uint8 WEEK[2];
        LCD_Prints("  WEEK SETTING  ",0);
        LCD_Prints("  WEEK:         ",0x40);
        if((!KEY3)&&(TIMETYPE.Week<8)){KEY_Delay();TIMETYPE.Week++;i1=i2=0;}
        else if(TIMETYPE.Week>7)TIMETYPE.Week=1;
        if((!KEY4)&&(TIMETYPE.Week>1)){KEY_Delay();TIMETYPE.Week--;i1=i2=0;}
        WEEK[0]=TIMETYPE.Week+'0';
        WEEK[1]='';
        LCD_Prints(WEEK,0x47);
}
void SET_HOUR()
{
        uint8 HOUR[3];
        LCD_Prints("  HOUR SETTING  ",0);
        LCD_Prints("  HOUR:         ",0x40);
        if((!KEY3)&&(TIMETYPE.Hour<24)){KEY_Delay();TIMETYPE.Hour++;i1=i2=0;}
        else if(TIMETYPE.Hour>23)TIMETYPE.Hour=0;
        if((!KEY4)&&(TIMETYPE.Hour>0)){KEY_Delay();TIMETYPE.Hour--;i1=i2=0;}
        HOUR[0]=(TIMETYPE.Hour/10)+'0';
        HOUR[1]=(TIMETYPE.Hour%10)+'0';
        HOUR[2]='';
        LCD_Prints(HOUR,0x47);
}
void SET_MINE()
{
        uint8 MINE[3];
        LCD_Prints("  MINE SETTING  ",0);
        LCD_Prints("  MINE:         ",0x40);
        if((!KEY3)&&(TIMETYPE.Mine<60)){KEY_Delay();TIMETYPE.Mine++;i1=i2=0;}
        else if(TIMETYPE.Mine>59)TIMETYPE.Mine=0;
        if((!KEY4)&&(TIMETYPE.Mine>0)){KEY_Delay();TIMETYPE.Mine--;i1=i2=0;}
        MINE[0]=(TIMETYPE.Mine/10)+'0';
        MINE[1]=(TIMETYPE.Mine%10)+'0';
        MINE[2]='';
        LCD_Prints(MINE,0x47);
}
void SET_SECOND()
{
        uint8 SECOND[3];
        LCD_Prints(" SECOND SETTING ",0);
        LCD_Prints(" SECOND:        ",0x40);
        if((!KEY3)&&(TIMETYPE.Second<60)){KEY_Delay();TIMETYPE.Second++;i1=i2=0;}
        else if(TIMETYPE.Second>59)TIMETYPE.Second=0;
        if((!KEY4)&&(TIMETYPE.Second>0)){KEY_Delay();TIMETYPE.Second--;i1=i2=0;}
        SECOND[0]=(TIMETYPE.Second/10)+'0';
        SECOND[1]=(TIMETYPE.Second%10)+'0';
        SECOND[2]='';
        LCD_Prints(SECOND,0x48);
}
void Write_Time()
{
        uint8 year,month,day,hour,mine,second,week;
        year=((TIMETYPE.Year/10)<<4)|(TIMETYPE.Year%10);
        month=((TIMETYPE.Month/10)<<4)|(TIMETYPE.Month%10);
        day=((TIMETYPE.Day/10)<<4)|(TIMETYPE.Day%10);
        week=TIMETYPE.Week;
        hour=((TIMETYPE.Hour/10)<<4)|(TIMETYPE.Hour%10);
        mine=((TIMETYPE.Mine/10)<<4)|(TIMETYPE.Mine%10);
        second=((TIMETYPE.Second/10)<<4)|(TIMETYPE.Second%10);
        RTC_Write_Byte(0x8e,0x00); //写入允许
    RTC_Write_Byte(0x80,WRITE_SECOND|0x80);
        RTC_Write_Byte(0x8e,0x80); //禁止写入
        RTC_Write_Byte(0x8e,0x00); //写入允许
        RTC_Write_Byte(WRITE_YEAR,year); //写入新的秒数
        RTC_Write_Byte(WRITE_MONTH,month); //写入新的秒数
        RTC_Write_Byte(WRITE_DAY,day); //写入新的秒数
        RTC_Write_Byte(WRITE_HOUR,hour); //写入新的秒数
        RTC_Write_Byte(WRITE_MINE,mine&0x7f); //写入新的秒数
        RTC_Write_Byte(WRITE_WEEK,week); //写入新的秒数
        RTC_Write_Byte(WRITE_SECOND,second);
        RTC_Write_Byte(0x8e,0x00); //写入允许
        RTC_Write_Byte(0x8E,0x80);
}                       
void SET_TIME()
{
        uint8 i;
        CurrentTime(&TIMETYPE);
        while(1)
        {         
                switch(i)
                {
                        case 0:SET_YEAR();break;
                        case 1:SET_MONTH();break;
                        case 2:SET_DAY(); break;
                        case 3:SET_WEEK();break;
                        case 4:SET_HOUR();break;
                        case 5:SET_MINE();break;
                        case 6:SET_SECOND();break;
                }
                if(!KEY2){i++;KEY_Delay();i1=i2=0;}
                if(i==7){i=0;Write_Time();break;}
                i1++;
                if(i1==10){i2++;i1=0;}
                if(i2==100){i=0;Write_Time();break;}
        }
}

void TIMESETTING()
{       
        if(!KEY1){LED_EN=1;SET_TIME();}
        WORDNUMBER=0;
        WORDNUM=0;
}
void LED_Ser(uint8 dat)
{
        SBUF=dat;
        while(TI==0);
        TI=0;
}
void LED_Delay()
{
        uint8 i,j;
        for(i=0;i<11;i++)
        for(j=0;j<16;j++);
}
void SET_STB()
{
        Ser_STB=0;
        Ser_STB=1;
}
void Disp_LED(uint8 *dat)
{
        uint8 i;
        uint16 tmp,tmp1,tmp2;
        LED_EN=0;
        LED_Y=0x01|0xf0;
        if(WORDNUMBER==16)
        {
                WORDNUMBER=0;
                WORDNUM++;
        }
        for(i=0;i<32;i+=2)
        {
                if((!KEY1)&&(!LCD_NO))TIMESETTING();
                tmp1=(dat[i+1]|(uint16)(dat<<8));
                tmp2=(dat[i+33]|(uint16)(dat[i+32]<<8));
                tmp=((tmp1<<WORDNUMBER)|tmp2>>(16-WORDNUMBER));
                if(tmp2==0x55aa)WORDNUM=0;
                LED_EN=0;
                LED_Ser((uint8)(tmp));
                LED_Ser((uint8)(tmp>>8));
                SET_STB();
                LED_Y=0x0f&(i/2);
                LED_Delay();
                LED_EN=1;
        }
}
void Disp_LED1(uint8 *dat,uint8 *dat1)
{
        uint8 i;
        uint16 tmp,tmp1,tmp2;
        LED_EN=0;
        LED_Y=0x01|0xf0;
        if(WORDNUMBER==16)
        {
                WORDNUMBER=0;
                WORDNUM++;
        }
        for(i=0;i<32;i+=2)
        {
                if((!KEY1)&&(!LCD_NO))TIMESETTING();
                tmp1=(dat[i+1]|(uint16)(dat<<8));
                tmp2=(dat1[i+1]|(uint16)(dat1<<8));
                tmp=((tmp1<<WORDNUMBER)|tmp2>>(16-WORDNUMBER));
                LED_EN=0;
                LED_Ser((uint8)(tmp));
                LED_Ser((uint8)(tmp>>8));
                SET_STB();
                LED_Y=0x0f&(i/2);
                LED_Delay();
                LED_EN=1;
        }
}
void Disp_Str_LED2(uint8 *dat,uint8 *dat1,uint8 *dat2)
{
        uint8 i;
        uint16 tmp,tmp1,tmp2;
        LED_EN=0;
        LED_Y=0x01|0xf0;
        if(WORDNUMBER==16)
        {
                WORDNUMBER=0;
                WORDNUM++;
        }
        for(i=0;i<32;i+=2)
        {
                if((!KEY1)&&(!LCD_NO))TIMESETTING();
                tmp1=(dat1[i/2]|(uint16)(dat[i/2]<<8));
                tmp2=(dat2[i+1]|(uint16)(dat2<<8));
                tmp=((tmp1<<WORDNUMBER)|tmp2>>(16-WORDNUMBER));
                LED_EN=0;
                LED_Ser((uint8)(tmp));
                LED_Ser((uint8)(tmp>>8));
                SET_STB();
                LED_Y=0x0f&(i/2);
                LED_Delay();
                LED_EN=1;
        }
}
void Disp_Str_LED4(uint8 *dat,uint8 *dat1,uint8 *dat2,uint8 *dat3)
{
        uint8 i;
        uint16 tmp,tmp1,tmp2;
        LED_EN=0;
        LED_Y=0x01|0xf0;
        if(WORDNUMBER==16)
        {
                WORDNUMBER=0;
                WORDNUM++;
        }
        for(i=0;i<32;i+=2)
        {
                if((!KEY1)&&(!LCD_NO))TIMESETTING();
                tmp1=(dat1[i/2]|(uint16)(dat[i/2]<<8));
                tmp2=(dat3[i/2]|(uint16)(dat2[i/2]<<8));
                tmp=((tmp1<<WORDNUMBER)|tmp2>>(16-WORDNUMBER));
                LED_EN=0;
                LED_Ser((uint8)(tmp));
                LED_Ser((uint8)(tmp>>8));
                SET_STB();
                LED_Y=0x0f&(i/2);
                LED_Delay();
                LED_EN=1;
        }
}
void Disp_Str_LED_HZ(uint8 *dat,uint8 *dat1,uint8 *dat2)
{
        uint8 i;
        uint16 tmp,tmp1,tmp2;
        LED_EN=0;
        LED_Y=0x01|0xf0;
        if(WORDNUMBER==16)
        {
                WORDNUMBER=0;
                WORDNUM++;
        }
        for(i=0;i<32;i+=2)
        {
                if((!KEY1)&&(!LCD_NO))TIMESETTING();
                tmp1=(dat[i+1]|(uint16)(dat<<8));
                tmp2=(dat2[i/2]|(uint16)(dat1[i/2]<<8));
                tmp=((tmp1<<WORDNUMBER)|tmp2>>(16-WORDNUMBER));
                LED_EN=0;
                LED_Ser((uint8)(tmp));
                LED_Ser((uint8)(tmp>>8));
                SET_STB();
                LED_Y=0x0f&(i/2);
                LED_Delay();
                LED_EN=1;
        }
}

void LCD_DISP()
{
        DATE[0]='2';
        DATE[1]='0';
        DATE[4]='/';
        DATE[7]='/';
        DATE[10]='W';
        DATE[11]='e';
        DATE[12]='e';
        DATE[13]='k';
        DATE[14]=':';
        DATE[16]='';
        TIME[2]=':';
        TIME[5]=' ';
        TIME[6]='T';
        TIME[7]='e';
        TIME[8]='m';
        TIME[9]='p';
        TIME[10]=':';
        TIME[13]=0xdf;
        TIME[14]='C';
        TIME[15]=' ';
        TIME[16]='';
}



void LCD_Disp_Time()
{
        DATE[2]=TIMETYPE.Year/10+'0';
        DATE[3]=TIMETYPE.Year%10+'0';
        DATE[5]=TIMETYPE.Month/10+'0';
        DATE[6]=TIMETYPE.Month%10+'0';
        DATE[8]=TIMETYPE.Day/10+'0';
        DATE[9]=TIMETYPE.Day%10+'0';
        DATE[15]=TIMETYPE.Week+'0';
        TIME[0]=TIMETYPE.Hour/10+'0';
        TIME[1]=TIMETYPE.Hour%10+'0';
        TIME[3]=TIMETYPE.Mine/10+'0';
        TIME[4]=TIMETYPE.Mine%10+'0';
        TIME[11]=Temp_Value/10+'0';
        TIME[12]=Temp_Value%10+'0';
        if(TEMP_ERR)
        {
                Temp_Value=0;
                TIME[11]='E';
                TIME[12]='R';
                TIME[13]='R';
                TIME[14]='0';
                TIME[15]='R';
        }
        else
        {
                TIME[13]=0xdf;
                TIME[14]='C';
                TIME[15]=' ';
        }
        LCD_Prints(DATE,0);
        LCD_Prints(TIME,0x40);
}
void main()
{
        TMOD=0x01;
        TH0=0x3c;
        TL0=0xb0;
        EA=1;
        TR0=1;
        ET0=1;
        SCON=0;
        LCD_INITIALIZE();
        TEMP_INITIALIZE();
        LCD_DISP();
        while(1)
        {
                switch(WORDNUM)
                {
                        case WORDNUU+0:Disp_Str_LED_HZ(&HZ[WORDNUU],&NUM[2],&NUM[0]);break;
                        case WORDNUU+1:Disp_Str_LED4(&NUM[2],&NUM[0],&NUM[TIMETYPE.Year/10],&NUM[TIMETYPE.Year%10]);break;
                        case WORDNUU+2:Disp_Str_LED2(&NUM[TIMETYPE.Year/10],&NUM[TIMETYPE.Year%10],&DATETMP[0]);break;
                        case WORDNUU+3:Disp_Str_LED_HZ(&DATETMP[0],&NUM[TIMETYPE.Month/10],&NUM[TIMETYPE.Month%10]);break;
                        case WORDNUU+4:Disp_Str_LED2(&NUM[TIMETYPE.Month/10],&NUM[TIMETYPE.Month%10],&DATETMP[1]);break;
                        case WORDNUU+5:Disp_Str_LED_HZ(&DATETMP[1],&NUM[TIMETYPE.Day/10],&NUM[TIMETYPE.Day%10]);break;
                        case WORDNUU+6:Disp_Str_LED2(&NUM[TIMETYPE.Day/10],&NUM[TIMETYPE.Day%10],&DATETMP[2]);break;
                        case WORDNUU+7:Disp_LED1(&DATETMP[2],&DATETMP[5]);break;
                        case WORDNUU+8:Disp_LED1(&DATETMP[5],&DATETMP[6]);break;
                        case WORDNUU+9:Disp_LED1(&DATETMP[6],&WEEK[TIMETYPE.Week-1]);break;
                        case WORDNUU+10:Disp_Str_LED_HZ(&WEEK[TIMETYPE.Week-1],&NUM[TIMETYPE.Hour/10],&NUM[TIMETYPE.Hour%10]);break;
                        case WORDNUU+11:Disp_Str_LED2(&NUM[TIMETYPE.Hour/10],&NUM[TIMETYPE.Hour%10],&DATETMP[3]);break;
                        case WORDNUU+12:Disp_Str_LED_HZ(&DATETMP[3],&NUM[TIMETYPE.Mine/10],&NUM[TIMETYPE.Mine%10]);break;
                        case WORDNUU+13:Disp_Str_LED2(&NUM[TIMETYPE.Mine/10],&NUM[TIMETYPE.Mine%10],&DATETMP[4]);break;
                        case WORDNUU+14:Disp_LED1(&DATETMP[4],&DATETMP[7]);break;
                        case WORDNUU+15:Disp_LED1(&DATETMP[7],&DATETMP[8]);break;
                        case WORDNUU+16:Disp_Str_LED_HZ(&DATETMP[8],&NUM[Temp_Value/10],&NUM[Temp_Value%10]);break;
                        case WORDNUU+17:Disp_Str_LED2(&NUM[Temp_Value/10],&NUM[Temp_Value%10],&DATETMP[9]);break;
                        case WORDNUU+18:Disp_LED1(&DATETMP[9],&DATETMP[10]);break;
                        case WORDNUU+19:Disp_LED1(&DATETMP[10],&DATETMP[11]);break;
                        case WORDNUU+20:Disp_LED1(&DATETMP[11],&HZ[0]);break;
                        case WORDNUU+21:WORDNUM=0;WORDNUMBER=0;break;
                        default:Disp_LED(&HZ[WORDNUM]);
                }
                if(WORDNUMBER==16)
                {
                        TEMP_Read();
                        CurrentTime(&TIMETYPE);
                        LCD_Disp_Time();
                }
        }
}
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。