定时器三时段输出自动控制器

/***定时器三时段输出自动控制器 L1818 CODE 6504***/

/*2017 7 18 11:00通过 使用内部EEPROM PAST*******/

#include <reg52.h>

#include <intrins.h>

#define uchar unsigned char

#define uint unsigned int

typedef unsigned char BYTE;

typedef unsigned int WORD;

sbit SDA_3231=P1^1; //模拟I2C数据传送位SDA

sbit SCL_3231=P1^6; //模拟I2C时钟控制位SCL

sbit OUT1=P3^5; /****输出****/

sbit OUT2=P3^1; /****输出****/

sbit OUT3=P3^4; /****输出****/

sbit OUT4=P3^0;

bit ack_3231; //应答标志位

uchar kcounter,kstatus; //按键计数标志 按键状态标志

int func; /*功能标志*/

#define DS3231_WriteAddress 0xD0 //器件写地址

#define DS3231_ReadAddress 0xD1 //器件读地址

#define DS3231_SECOND 0x00 //秒

#define DS3231_MINUTE 0x01 //分

#define DS3231_HOUR 0x02 //时

#define DS3231_WEEK 0x03 //星期

#define DS3231_DAY 0x04 //日

#define DS3231_MONTH 0x05 //月

#define DS3231_YEAR 0x06 //年

//闹铃1

#define DS3231_SALARM1ECOND 0x07 //秒

#define DS3231_ALARM1MINUTE 0x08 //分

#define DS3231_ALARM1HOUR 0x09 //时

#define DS3231_ALARM1WEEK 0x0A //星期/日

//闹铃2

#define DS3231_ALARM2MINUTE 0x0b //分

#define DS3231_ALARM2HOUR 0x0c //时

#define DS3231_ALARM2WEEK 0x0d //星期/日

#define DS3231_CONTROL 0x0e //控制寄存器

#define DS3231_STATUS 0x0f //状态寄存器

#define BSY 2 //忙

#define OSF 7 //振荡器停止标志

uint aa=0; /****RUN FLAG****/

bit open1_flag;

bit open2_flag;

bit open3_flag;

uchar m,n;

uchar yms; // 时 分 秒加减标志

uchar TM_TEN; // 时十位

uchar TM_BIT; // 时个位

uchar HOUR_TEN; // 时十位

uchar HOUR_BIT; // 时个位

uchar MINUTER_TEN; // 分十位

uchar MINUTER_BIT; // 分个位

uchar SECOND_TEN; // 秒十位

uchar SECOND_BIT; // 秒个位

uchar YEAR_TEN; // 年十位

uchar YEAR_BIT; // 年个位

uchar MONTH_TEN; // 月十位

uchar MONTH_BIT; // 月个位

uchar DAY_TEN; // 天十位

uchar DAY_BIT; // 天个位

int valh1a,valm1a,vals1a; // 第一段时间开时分秒

int valh2a,valm2a,vals2a; // 第二段时间开时分秒

int valh3a,valm3a,vals3a; // 第三段时间开时分秒

int valh1b,valm1b,vals1b; // 第一段时间关时分秒

int valh2b,valm2b,vals2b; // 第二段时间关时分秒

int valh3b,valm3b,vals3b; // 第三段时间关时分秒

int valh,valm,vals; // 设置时间时分秒缓冲

int vala,valb; /**/

bit adddecbit; /*功能设置运行标志 加减位标志01*/

uchar code disdt[10]={0xb0,0xb1,0xb2,0xb3,0xb4,0xb5,0xb6,0xb7,0xb8,0xb9};

sbit beep=P2^3; //蜂鸣器

sbit SET_KEY=P3^2;

sbit ENTER_KEY=P1^7;

sbit HOUR_ADD=P3^3; //时加

sbit HOUR_DEC=P1^5; //时减

sbit MINUTER_ADD=P1^3; //分加

sbit MINUTER_DEC=P1^4; //分减

sbit SECOND_ADD=P1^2; //秒加

sbit SECOND_DEC=P5^4; //秒减

sbit CS=P2^6; //12864PIN4

sbit SID=P2^7; //12864PIN5

sbit SCLK=P1^0; //12864PIN6

#define CMD_IDLE 0 //空闲模式

#define CMD_READ 1 //IAP字节读命令

#define CMD_PROGRAM 2 //IAP字节编程命令

#define CMD_ERASE 3 //IAP扇区擦除命令

#define ENABLE_IAP 0x82 //if SYSCLK<20MHz

#define IAP_ADDRESS_0 0x0400 // 第一段开数据存储起始地址

#define IAP_ADDRESS_1 0x0600 // 第二段开数据存储起始地址

#define IAP_ADDRESS_2 0x0800 // 第三段开数据存储起始地址

#define IAP_ADDRESS_3 0x0A00 // 第一段关数据存储起始地址

#define IAP_ADDRESS_4 0x0C00 // 第二段关数据存储起始地址

#define IAP_ADDRESS_5 0x0E00 // 第三段关数据存储起始地址

void IapIdle();

BYTE IapReadByte(WORD addr);

void IapProgramByte(WORD addr, BYTE dat);

void IapEraseSector(WORD addr);

void delay(uint k); /****延时****/

/*------------------延时子程序------------------------*/

void delay(unsigned int t)

{

uint i,j;

for(i=0;i<t;i++)

for(j=0;j<500;j++);

}

/*------------------延时子程序------------------------*/

void delay_1ms(uint x)

{

int i, j;

for (i=0; i<x; i++)

for (j=0; j<1500; j++);

}

/*----关闭IAP----------------------------*/

void IapIdle()

{

IAP_CONTR = 0; //关闭IAP功能

IAP_CMD = 0; //清除命令寄存器

IAP_TRIG = 0; //清除触发寄存器

IAP_ADDRH = 0x80; //将地址设置到非IAP区域

IAP_ADDRL = 0;

}

/*-从ISP/IAP/EEPROM区域读取一字节-*/

BYTE IapReadByte(WORD addr)

{

BYTE dat; //数据缓冲区

IAP_CONTR = ENABLE_IAP; //使能IAP

IAP_CMD = CMD_READ; //设置IAP命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop(); //等待ISP/IAP/EEPROM操作完成

dat = IAP_DATA; //读ISP/IAP/EEPROM数据

IapIdle(); //关闭IAP功能

return dat; //返回

}

/*-写一字节数据到ISP/IAP/EEPROM区域-*/

void IapProgramByte(WORD addr, BYTE dat)

{

IAP_CONTR = ENABLE_IAP; //使能IAP

IAP_CMD = CMD_PROGRAM; //设置IAP命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_DATA = dat; //写ISP/IAP/EEPROM数据

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop(); //等待ISP/IAP/EEPROM操作完成

IapIdle();

}

/*---扇区擦除---------------*/

void IapEraseSector(WORD addr)

{

IAP_CONTR = ENABLE_IAP; //使能IAP val=IapReadByte(IAP_ADDRESS+1);

IAP_CMD = CMD_ERASE; //设置IAP命令

IAP_ADDRL = addr; //设置IAP低地址

IAP_ADDRH = addr >> 8; //设置IAP高地址

IAP_TRIG = 0x5a; //写触发命令(0x5a)

IAP_TRIG = 0xa5; //写触发命令(0xa5)

nop(); //等待ISP/IAP/EEPROM操作完成

IapIdle();

}

/*************************************/

void timechange(void)

{

TM_TEN=valb/10;

TM_BIT=valb-TM_TEN*10;

}

/*************************************/

void red_eeprom(void)

{

TM_TEN=IapReadByte(IAP_ADDRESS_0+1); // 一段时间 时 开十位

TM_BIT=IapReadByte(IAP_ADDRESS_0+2); // 一段时间 时 开个位

valh1a=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_0+3); // 一段时间 分 开十位

TM_BIT=IapReadByte(IAP_ADDRESS_0+4); // 一段时间 分 开个位

valm1a=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_0+5); // 一段时间 秒 开十位

TM_BIT=IapReadByte(IAP_ADDRESS_0+6); // 一段时间 秒 开个位

vals1a=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_1+1); // 二段时间 时 开十位

TM_BIT=IapReadByte(IAP_ADDRESS_1+2); // 二段时间 时 开个位

valh2a=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_1+3); // 二段时间 分 开十位

TM_BIT=IapReadByte(IAP_ADDRESS_1+4); // 二段时间 分 开个位

valm2a=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_1+5); // 二段时间 秒 开十位

TM_BIT=IapReadByte(IAP_ADDRESS_1+6); // 二段时间 秒 开个位

vals2a=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_2+1); // 三段时间 时 开十位

TM_BIT=IapReadByte(IAP_ADDRESS_2+2); // 三段时间 时 开个位

valh3a=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_2+3); // 三段时间 分 开十位

TM_BIT=IapReadByte(IAP_ADDRESS_2+4); // 三段时间 分 开个位

valm3a=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_2+5); // 三段时间 秒 开十位

TM_BIT=IapReadByte(IAP_ADDRESS_2+6); // 三段时间 秒 开个位

vals3a=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_3+1); // 一段时间 时 关十位

TM_BIT=IapReadByte(IAP_ADDRESS_3+2); // 一段时间 时 关个位

valh1b=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_3+3); // 一段时间 分 关十位

TM_BIT=IapReadByte(IAP_ADDRESS_3+4); // 一段时间 分 关个位

valm1b=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_3+5); // 一段时间 秒 关十位

TM_BIT=IapReadByte(IAP_ADDRESS_3+6); // 一段时间 秒 关个位

vals1b=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_4+1); // 二段时间 时 关十位

TM_BIT=IapReadByte(IAP_ADDRESS_4+2); // 二段时间 时 关个位

valh2b=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_4+3); // 二段时间 分 关十位

TM_BIT=IapReadByte(IAP_ADDRESS_4+4); // 二段时间 分 关个位

valm2b=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_4+5); // 二段时间 秒 关十位

TM_BIT=IapReadByte(IAP_ADDRESS_4+6); // 二段时间 秒 关个位

vals2b=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_5+1); // 三段时间 时 关十位

TM_BIT=IapReadByte(IAP_ADDRESS_5+2); // 三段时间 时 关个位

valh3b=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_5+3); // 三段时间 分 关十位

TM_BIT=IapReadByte(IAP_ADDRESS_5+4); // 三段时间 分 关个位

valm3b=TM_TEN*10+TM_BIT;

TM_TEN=IapReadByte(IAP_ADDRESS_5+5); // 三段时间 秒 关十位

TM_BIT=IapReadByte(IAP_ADDRESS_5+6); // 三段时间 秒 关个位

vals3b=TM_TEN*10+TM_BIT;

}

/*************************************/

void write_eeproma(void)

{

IapEraseSector(IAP_ADDRESS_0); //扇区擦除

valb=valh1a;

timechange();

IapProgramByte(IAP_ADDRESS_0+1,TM_TEN); /*写入一段时间 时 开十位*/

IapProgramByte(IAP_ADDRESS_0+2,TM_BIT); /*写入一段时间 时 开个位*/

valb=valm1a;

timechange();

IapProgramByte(IAP_ADDRESS_0+3,TM_TEN); /*写入一段时间 分 开十位*/

IapProgramByte(IAP_ADDRESS_0+4,TM_BIT); /*写入一段时间 分 开个位*/

valb=vals1a;

timechange();

IapProgramByte(IAP_ADDRESS_0+5,TM_TEN); /*写入一段时间 秒 开十位*/

IapProgramByte(IAP_ADDRESS_0+6,TM_BIT); /*写入一段时间 秒 开个位*/

}

/*************************************/

void write_eepromb(void)

{

IapEraseSector(IAP_ADDRESS_1); //扇区擦除

valb=valh2a;

timechange();

IapProgramByte(IAP_ADDRESS_1+1,TM_TEN); /*写入二段时间 时 开十位*/

IapProgramByte(IAP_ADDRESS_1+2,TM_BIT); /*写入二段时间 时 开个位*/

valb=valm2a;

timechange();

IapProgramByte(IAP_ADDRESS_1+3,TM_TEN); /*写入二段时间 时 开个位*/

IapProgramByte(IAP_ADDRESS_1+4,TM_BIT); /*写入二段时间 时 开个位*/

valb=vals2a;

timechange();

IapProgramByte(IAP_ADDRESS_1+5,TM_TEN); /*写入二段时间 时 开个位*/

IapProgramByte(IAP_ADDRESS_1+6,TM_BIT); /*写入二段时间 时 开个位*/

}

/*************************************/

void write_eepromc(void)

{

IapEraseSector(IAP_ADDRESS_2); //扇区擦除

valb=valh3a;

timechange();

IapProgramByte(IAP_ADDRESS_2+1,TM_TEN); /*写入三段时间 时 开十位*/

IapProgramByte(IAP_ADDRESS_2+2,TM_BIT); /*写入三段时间 时 开个位*/

valb=valm3a;

timechange();

IapProgramByte(IAP_ADDRESS_2+3,TM_TEN); /*写入三段时间 时 开个位*/

IapProgramByte(IAP_ADDRESS_2+4,TM_BIT); /*写入三段时间 时 开个位*/

valb=vals3a;

timechange();

IapProgramByte(IAP_ADDRESS_2+5,TM_TEN); /*写入三段时间 时 开个位*/

IapProgramByte(IAP_ADDRESS_2+6,TM_BIT); /*写入三段时间 时 开个位*/

}

/*************************************/

void write_eepromd(void)

{

IapEraseSector(IAP_ADDRESS_3); //扇区擦除

valb=valh1b;

timechange();

IapProgramByte(IAP_ADDRESS_3+1,TM_TEN); /*写入一段时间 时 关十位*/

IapProgramByte(IAP_ADDRESS_3+2,TM_BIT); /*写入一段时间 时 关个位*/

valb=valm1b;

timechange();

IapProgramByte(IAP_ADDRESS_3+3,TM_TEN); /*写入一段时间 分 关十位*/

IapProgramByte(IAP_ADDRESS_3+4,TM_BIT); /*写入一段时间 分 关个位*/

valb=vals1b;

timechange();

IapProgramByte(IAP_ADDRESS_3+5,TM_TEN); /*写入一段时间 秒 关十位*/

IapProgramByte(IAP_ADDRESS_3+6,TM_BIT); /*写入一段时间 秒 关个位*/

}

/*************************************/

void write_eeprome(void)

{

IapEraseSector(IAP_ADDRESS_4); //扇区擦除

valb=valh2b;

timechange();

IapProgramByte(IAP_ADDRESS_4+1,TM_TEN); /*写入二段时间 时 关十位*/

IapProgramByte(IAP_ADDRESS_4+2,TM_BIT); /*写入二段时间 时 关个位*/

valb=valm2b;

timechange();

IapProgramByte(IAP_ADDRESS_4+3,TM_TEN); /*写入二段时间 分 关十位*/

IapProgramByte(IAP_ADDRESS_4+4,TM_BIT); /*写入二段时间 分 关个位*/

valb=vals2b;

timechange();

IapProgramByte(IAP_ADDRESS_4+5,TM_TEN); /*写入二段时间 秒 关十位*/

IapProgramByte(IAP_ADDRESS_4+6,TM_BIT); /*写入二段时间 秒 关个位*/

}

/*************************************/

void write_eepromf(void)

{

IapEraseSector(IAP_ADDRESS_5); //扇区擦除

valb=valh3b;

timechange();

IapProgramByte(IAP_ADDRESS_5+1,TM_TEN); /*写入三段时间 时 关十位*/

IapProgramByte(IAP_ADDRESS_5+2,TM_BIT); /*写入三段时间 时 关个位*/

valb=valm3b;

timechange();

IapProgramByte(IAP_ADDRESS_5+3,TM_TEN); /*写入三段时间 分 关十位*/

IapProgramByte(IAP_ADDRESS_5+4,TM_BIT); /*写入三段时间 分 关个位*/

valb=vals3b;

timechange();

IapProgramByte(IAP_ADDRESS_5+5,TM_TEN); /*写入三段时间 秒 关十位*/

IapProgramByte(IAP_ADDRESS_5+6,TM_BIT); /*写入三段时间 秒 关个位*/

}

/*-----------写命令到LCD--------------*/

void write_com(unsigned char cmdcode)

{

uchar i;

uchar i_data,temp_data1,temp_data2;

EA=0;

i_data=0xf8;

delay_1ms(10);

CS=1;

SCLK=0;

for(i=0;i<8;i++)

{

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data<<1;

}

i_data=cmdcode;

i_data&=0xf0;

for(i=0;i<8;i++)

{

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data<<1;

}

i_data=cmdcode;

temp_data1=i_data&0xf0;

temp_data2=i_data&0x0f;

temp_data1>>=4;

temp_data2<<=4;

i_data=temp_data1|temp_data2;

i_data&=0xf0;

for(i=0;i<8;i++)

{

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data<<1;

}

CS=0;

EA=1;

}

/*--------------写数据到LCD------------------*/

void write_data(unsigned char Dispdata)

{

uchar i;

uchar i_data,temp_data1,temp_data2;

EA=0;

i_data=0xfa;

delay_1ms(10);

CS=1;

for(i=0;i<8;i++)

{

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data<<1;

}

i_data=Dispdata;

i_data&=0xf0;

for(i=0;i<8;i++)

{

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data<<1;

}

i_data=Dispdata;

temp_data1=i_data&0xf0;

temp_data2=i_data&0x0f;

temp_data1>>=4;

temp_data2<<=4;

i_data=temp_data1|temp_data2;

i_data&=0xf0;

for(i=0;i<8;i++)

{

SID=(bit)(i_data&0x80);

SCLK=0;

SCLK=1;

i_data=i_data<<1;

}

CS=0;

EA=1;

}

/*------------------初始化LCD屏-----------*/

void lcd_init()

{

uchar comdata;

delay_1ms(100);

comdata=0x30;

write_com(comdata); /*功能设置:一次送8位数据,基本指令集*/

comdata=0x04;

write_com(comdata); /*点设定:显示字符/光标从左到右移位,DDRAM地址加1*/

comdata=0x0f;

write_com(comdata); /*显示设定:开显示,显示光标,当前显示位反白闪动*/

comdata=0x01;

write_com(comdata); /*清DDRAM*/

comdata=0x02;

write_com(comdata); /*DDRAM地址归位*/

comdata=0x80;

write_com(comdata); /*把显示地址设为0X80,即为第一行的首位*/

}

/************************************/

uchar BCD2HEX(uchar val) //BCD转换为Byte

{

uchar temp;

temp=val&0x0f;

val>>=4;

val&=0x0f;

val*=10;

temp+=val;

return temp;

}

uchar HEX2BCD(uchar val) //B码转换为BCD码

{

uchar i,j,k;

i=val/10;

j=val%10;

k=j+(i<<4);

return k;

}

/************************************/

void delayus(uint us)

{

while (us--);

}

void delayms(uint ms)

{

delayus(50000);

while (ms--);

}

/************************************/

void Start_I2C()

{

SDA_3231=1; //发送起始条件的数据信号

delayus(1);

SCL_3231=1;

delayus(5); //起始条件建立时间大于4.7us,延时

SDA_3231=0; //发送起始信号

delayus(5); // 起始条件锁定时间大于4μs

SCL_3231=0; //钳住I2C总线,准备发送或接收数据

delayus(2);

}

/************************************/

void Stop_I2C()

{

SDA_3231=0; //发送结束条件的数据信号

delayus(1); //发送结束条件的时钟信号

SCL_3231=1; //结束条件建立时间大于4us

delayus(5);

SDA_3231=1; //发送I2C总线结束信号

delayus(4);

}

/************************************/

void SendByte(uchar c)

{

uchar BitCnt;

for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位

{

if((c<<BitCnt)&0x80)

SDA_3231=1; //判断发送位

else

SDA_3231=0;

delayus(1);

SCL_3231=1; //置时钟线为高,通知被控器开始接收数据位

delayus(5); //保证时钟高电平周期大于4μs

SCL_3231=0;

}

delayus(2);

SDA_3231=1; //8位发送完后释放数据线,准备接收应答位

delayus(2);

SCL_3231=1;

delayus(3);

if(SDA_3231==1)

ack_3231=0;

else

ack_3231=1; //判断是否接收到应答信号

SCL_3231=0;

delayus(2);

}

/************************************/

uchar RcvByte()

{

uchar retc;

uchar BitCnt;

retc=0;

SDA_3231=1; //置数据线为输入方式

for(BitCnt=0;BitCnt<8;BitCnt++)

{

delayus(1);

SCL_3231=0; //置时钟线为低,准备接收数据位

delayus(5); //时钟低电平周期大于4.7μs

SCL_3231=1; //置时钟线为高使数据线上数据有效

delayus(3);

retc=retc<<1;

if(SDA_3231==1)

retc=retc+1; //读数据位,接收的数据位放入retc中

delayus(2);

}

SCL_3231=0;

delayus(2);

return(retc);

}

/************************************/

void Ack_I2C(bit a)

{

if(a==0)

SDA_3231=0; //在此发出应答或非应答信号

else

SDA_3231=1;

delayus(3);

SCL_3231=1;

delayus(5); //时钟低电平周期大于4μs

SCL_3231=0; //清时钟线,钳住I2C总线以便继续接收

delayus(2);

}

/************************************/

uchar write_byte(uchar addr, uchar write_data)

{

Start_I2C();

SendByte(DS3231_WriteAddress);

if (ack_3231 == 0)

return 0;

SendByte(addr);

if (ack_3231 == 0)

return 0;

SendByte(write_data);

if (ack_3231 == 0)

return 0;

Stop_I2C();

delayus(10);

return 1;

}

/************************************/

uchar read_current()

{

uchar read_data;

Start_I2C();

SendByte(DS3231_ReadAddress);

if(ack_3231==0)

return(0);

read_data = RcvByte();

Ack_I2C(1);

Stop_I2C();

return read_data;

}

/************************************/

uchar read_random(uchar random_addr)

{

Start_I2C();

SendByte(DS3231_WriteAddress);

if(ack_3231==0)

return(0);

SendByte(random_addr);

if(ack_3231==0)

return(0);

return(read_current());

}

/************************************/

void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec)

{

uchar temp=0;

temp=HEX2BCD(yea);

write_byte(DS3231_YEAR,temp); //修改年

temp=HEX2BCD(mon);

write_byte(DS3231_MONTH,temp); //修改月

temp=HEX2BCD(da);

write_byte(DS3231_DAY,temp); //修改日

temp=HEX2BCD(hou);

write_byte(DS3231_HOUR,temp); //修改时

temp=HEX2BCD(min);

write_byte(DS3231_MINUTE,temp); //修改分

temp=HEX2BCD(sec);

write_byte(DS3231_SECOND,temp); //修改秒

}

/************************************/

void TimeDisplay(uchar Dhour,uchar Dmin,uchar Dsec)

{

HOUR_TEN=Dhour/10; // 时十位

HOUR_BIT=Dhour%10; // 时个位

MINUTER_TEN=Dmin/10; // 分十位

MINUTER_BIT=Dmin%10; // 分个位

SECOND_TEN=Dsec/10; // 秒十位

SECOND_BIT=Dsec%10; // 秒个位

}

/************************************/

void get_show_time(void)

{

uchar Htemp1,Htemp2,Mtemp1,Mtemp2,Stemp1,Stemp2;

Htemp1=read_random(DS3231_HOUR); //时 24小时制

Htemp1&=0x3f;

Htemp2=BCD2HEX(Htemp1);

Mtemp1=read_random(DS3231_MINUTE); //分

Mtemp2=BCD2HEX(Mtemp1);

Stemp1=read_random(DS3231_SECOND); //秒

Stemp2=BCD2HEX(Stemp1);

TimeDisplay(Htemp2,Mtemp2,Stemp2);

}

/************************************/

void DateDisplay(uchar Dyear,uchar Dmonth,uchar Dday)

{

YEAR_TEN=Dyear/10; //年十位

YEAR_BIT=Dyear%10; //年个位

MONTH_TEN=Dmonth/10; //月十位

MONTH_BIT=Dmonth%10; //月个位

DAY_TEN=Dday/10; //天十位

DAY_BIT=Dday%10; //天个位

}

/************************************/

void get_show_date(void)

{

uchar Ytemp1,Ytemp2,Mtemp1,Mtemp2,Dtemp1,Dtemp2;

Ytemp1=read_random(DS3231_YEAR); //年

Ytemp2=BCD2HEX(Ytemp1);

Mtemp1=read_random(DS3231_MONTH); //月

Mtemp2=BCD2HEX(Mtemp1);

Dtemp1=read_random(DS3231_DAY); //日

Dtemp2=BCD2HEX(Dtemp1);

DateDisplay(Ytemp2,Mtemp2,Dtemp2);

}

/************************************/

void write_in(void)

{

write_com(0x9B); /*--写---*/

write_data(0XD0);

write_data(0XB4);

write_com(0x9C); /*--入---*/

write_data(0XC8);

write_data(0XEB);

delay(300);

write_com(0x9B); /*--写---*/

write_data(0xB6); /*半个字符*/

write_data(0xA0); /*半个字符*/

write_com(0x9C); /*--入---*/

write_data(0xB6); /*半个字符*/

write_data(0xA0); /*半个字符*/

}

/************************************/

void dis_one(void)

{

write_com(0x80); /*--一---*/

write_data(0XD2);

write_data(0XBB);

}

/************************************/

void dis_two(void)

{

write_com(0x80); /*--二---*/

write_data(0XB6);

write_data(0XFE);

}

/************************************/

void dis_three(void)

{

write_com(0x80); /*--三---*/

write_data(0XC8);

write_data(0XFD);

}

/************************************/

void dis_open(void)

{

write_com(0x85); /*---开--*/

write_data(0XBF);

write_data(0XAA);

}

/************************************/

void dis_open1(void)

{

write_com(0x98); /*---开--*/

write_data(0XBF);

write_data(0XAA);

}

/************************************/

void dis_open2(void)

{

write_com(0x99); /*---开--*/

write_data(0XBF);

write_data(0XAA);

}

/************************************/

void dis_open3(void)

{

write_com(0x9A); /*---开--*/

write_data(0XBF);

write_data(0XAA);

}

/************************************/

void dis_close(void)

{

write_com(0x85); /*---关--*/

write_data(0XB9);

write_data(0XD8);

}

/************************************/

void dis_close1(void)

{

write_com(0x98); /*---关--*/

write_data(0XB9);

write_data(0XD8);

}

/************************************/

void dis_close2(void)

{

write_com(0x99); /*---关--*/

write_data(0XB9);

write_data(0XD8);

}

/************************************/

void dis_close3(void)

{

write_com(0x9A); /*---关--*/

write_data(0XB9);

write_data(0XD8);

}

/************************************/

void dis_time(void)

{

write_com(0x81); /*---段--*/

write_data(0XB6);

write_data(0XCE);

write_com(0x82); /*---时--*/

write_data(0XCA);

write_data(0XB1);

write_com(0x83); /*---间--*/

write_data(0XBC);

write_data(0XE4);

write_com(0x92);

write_data(0XCA); /*-时---*/

write_data(0XB1); /*------*/

write_com(0x95);

write_data(0XB7); /*-分---*/

write_data(0XD6); /*------*/

write_com(0x8A);

write_data(0XC3); /*-秒---*/

write_data(0XEB); /*------*/

}

/*------------------开机广告-----------------------*/

void displayAdvertising()

{

write_com(0x06); /*游标的移动方向及指定显示的移位*/

write_com(0x82); /*--定---*/

write_data(0XB6);

write_data(0XA8);

write_com(0x83); /*--时---*/

write_data(0XCA);

write_data(0XB1);

write_com(0x84); /*--万---*/

write_data(0XCD);

write_data(0XF2);

write_com(0x85); /*--能---*/

write_data(0XC4);

write_data(0XDC);

write_com(0x91); /*--自---*/

write_data(0XD7);

write_data(0XD4);

write_com(0x92); /*--动---*/

write_data(0XB6);

write_data(0XAF);

write_com(0x93); /*--控---*/

write_data(0XBF);

write_data(0XD8);

write_com(0x94); /*--制---*/

write_data(0XD6);

write_data(0XC6);

write_com(0x95); /*--器---*/

write_data(0XC6);

write_data(0XF7);

write_com(0x88); /*--手----*/

write_data(0xCA);

write_data(0xD6);

write_com(0x89); /*--机----*/

write_data(0xBB);

write_data(0xFA);

write_com(0x8A);

write_data(0x3A); /*--:----*/

write_data(0x31); /*--1----*/

write_com(0x8B);

write_data(0x33); /*--3----*/

write_data(0x37); /*--7----*/

write_com(0x8C);

write_data(0x37); /*--7----*/

write_data(0x35); /*--5----*/

write_com(0x8D);

write_data(0x30); /*--0----*/

write_data(0x36); /*--6----*/

write_com(0x8E);

write_data(0x31); /*--1----*/

write_data(0x37); /*--7----*/

write_com(0x8F);

write_data(0x39); /*--9----*/

write_data(0x32); /*--2----*/

}

/************************************/

void displayymtm(void )

{

write_com(0x82);

write_data(0XC4); /*-年---*/

write_data(0XEA); /*------*/

write_com(0x85);

write_data(0XD4); /*-月---*/

write_data(0XC2); /*------*/

write_com(0x92);

write_data(0XCA); /*-时---*/

write_data(0XB1); /*------*/

write_com(0x95);

write_data(0XB7); /*-分---*/

write_data(0XD6); /*------*/

}

/************************************/

void display_hour(void)

{

write_com(0x80);

write_data(0XBD); /*-较---*/

write_data(0XCF); /*------*/

write_com(0x81);

write_data(0XCA); /*-时---*/

write_data(0XB1); /*------*/

write_com(0x92);

write_data(0XCA); /*-时---*/

write_data(0XB1); /*------*/

}

/************************************/

void display_minuter(void)

{

write_com(0x80);

write_data(0XBD); /*-较---*/

write_data(0XCF); /*------*/

write_com(0x81);

write_data(0XCA); /*-时---*/

write_data(0XB1); /*------*/

write_com(0x92);

write_data(0XB7); /*-分---*/

write_data(0XD6); /*------*/

}

/************************************/

void display_second(void)

{

write_com(0x80);

write_data(0XBD); /*-较---*/

write_data(0XCF); /*------*/

write_com(0x81);

write_data(0XCA); /*-时---*/

write_data(0XB1); /*------*/

write_com(0x92);

write_data(0XC3); /*-秒---*/

write_data(0XEB); /*------*/

}

/************************************/

void timer0() interrupt 1

{

int HOUR,MINUTER,SECOND;

HOUR=HOUR_TEN*10+HOUR_BIT;

MINUTER=MINUTER_TEN*10+MINUTER_BIT;

SECOND=SECOND_TEN*10+SECOND_BIT;

aa=aa+1;

if(aa==5)

{

aa=0;

OUT4=!OUT4;

displayymtm(); //显示年月时分

write_com(0X90); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[HOUR_TEN]); /*时十位*/

write_com(0X91); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[HOUR_BIT]); /*时个位*/

write_com(0X93); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[MINUTER_TEN]); /*分十位*/

write_com(0X94); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[MINUTER_BIT]); /*分个位*/

write_com(0X96); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[SECOND_TEN]); /*秒十位*/

write_com(0X97); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[SECOND_BIT]); /*秒个位*/

write_com(0X80); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[YEAR_TEN]); /*年十位*/

write_com(0X81); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[YEAR_BIT]); /*年个位*/

write_com(0X83); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[MONTH_TEN]); /*月十位*/

write_com(0X84); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[MONTH_BIT]); /*月个位*/

write_com(0X86); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[DAY_TEN]); /*天十位*/

write_com(0X87); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[DAY_BIT]); /*天个位*/

/******valh1a,valm1a,vals1a; 第一段时间开时分秒*/

/******valh2a,valm2a,vals2a; 第二段时间开时分秒*/

/******valh3a,valm3a,vals3a; 第三段时间开时分秒*/

/******valh1b,valm1b,vals1b; 第一段时间关时分秒*/

/******valh2b,valm2b,vals2b; 第二段时间关时分秒*/

/******valh3b,valm3b,vals3b; 第三段时间关时分秒*/

/*open1_flag;open2_flag;open3_flag; *****/

if(HOUR==valh1a&&MINUTER==valm1a&&SECOND==vals1a)

{

OUT1=0; //第一段开

dis_open1();

}

if(HOUR==valh2a&&MINUTER==valm2a&&SECOND==vals2a)

{

OUT2=0; //第二段开

dis_open2();

}

if(HOUR==valh3a&&MINUTER==valm3a&&SECOND==vals3a)

{

OUT3=0; //第三段开

dis_open3();

}

if(HOUR==valh1b&&MINUTER==valm1b&&SECOND==vals1b)

{

OUT1=1; //第一段关

dis_close1();

}

if(HOUR==valh2b&&MINUTER==valm2b&&SECOND==vals2b)

{

OUT2=1; //第二段关

dis_close2();

}

if(HOUR==valh3b&&MINUTER==valm3b&&SECOND==vals3b)

{

OUT3=1; //第三段关

dis_close3();

}

}

}

/***************************************/

void data_change(void)

{

m=vala/10;

n=vala-m*10;

}

/***************************************/

void displayh()

{

write_com(0x90); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[m]); /*十位*/

write_com(0x91); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[n]); /*个位*/

}

/***************************************/

void displaym()

{

write_com(0x90); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[m]); /*十位*/

write_com(0x91); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[n]); /*个位*/

}

/***************************************/

void displays()

{

write_com(0x90); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[m]); /*十位*/

write_com(0x91); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[n]); /*个位*/

}

/**************时显示*************************/

void displaya(void)

{

write_com(0x90); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[m]); /*十位*/

write_com(0x91); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[n]); /*个位*/

}

/***************分显示************************/

void displayb(void)

{

write_com(0x93); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[m]); /*十位*/

write_com(0x94); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[n]); /*个位*/

}

/***************秒显示************************/

void displayc(void)

{

write_com(0x88); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[m]); /*十位*/

write_com(0x89); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[n]); /*个位*/

}

/*--------------页面显示-------------*/

void disptest() /*显示*/

{

uint U,V;

U=func/10;

V=func-U*10;

write_com(0x86); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[U]); /*十位*/

write_com(0x87); /*地址*/

write_data(0xA3); /*半个字符*/

write_data(disdt[V]); /*个位*/

}

/****************处理*********************/

/******valh1a,valm1a,vals1a; 第一段时间开时分秒*/

/******valh2a,valm2a,vals2a; 第二段时间开时分秒*/

/******valh3a,valm3a,vals3a; 第三段时间开时分秒*/

/******valh1b,valm1b,vals1b; 第一段时间关时分秒*/

/******valh2b,valm2b,vals2b; 第二段时间关时分秒*/

/******valh3b,valm3b,vals3b; 第三段时间关时分秒*/

void WRIEEPROM_DEALWITH(int funs)

{

uchar temp=0;

if(funs==1)

{

write_eeproma(); //包含第一段时间开时分秒处理

write_in();

}

if(funs==2)

{

write_eepromb(); //包含第二段时间开时分秒处理

write_in();

}

if(funs==3)

{

write_eepromc(); //包含第三段时间开时分秒处理

write_in();

}

if(funs==4)

{

write_eepromd(); //包含第一段时间关时分秒处理

write_in();

}

if(funs==5)

{

write_eeprome(); //包含第二段时间关时分秒处理

write_in();

}

if(funs==6)

{

write_eepromf(); //包含第三段时间关时分秒处理

write_in();

}

if(funs==7) //写DS3231时

{

temp=HEX2BCD(valh);

write_byte(DS3231_HOUR,temp); //修改时

write_in();

}

if(funs==8) //写DS3231分

{

temp=HEX2BCD(valm);

write_byte(DS3231_MINUTE,temp); //修改分

write_in();

}

if(funs==9) //写DS3231秒

{

temp=HEX2BCD(vals);

write_byte(DS3231_SECOND,temp); //修改秒

write_in();

}

}

/*----------------加减按键处理子程序------------*/

/*对功能键计数器funtt散转后判别加减标志adddec****/

void addfunt(int funtt,uchar yms_flag,bit adddec)

{

int fun;

bit adddecb;

uchar flag;

fun=funtt;

adddecb=adddec;

flag=yms_flag;

disptest(); //页面显示

switch(fun)

{ //

case 1: //一段时间开加

if(adddecb)

{

if(flag==0X01) //时加

{

valh1a=valh1a+1;

if(valh1a>=24)

valh1a=0;

vala=valh1a; //一段时间时显示

data_change();

displaya();

}

else if(flag==0X10) //分加

{

valm1a=valm1a+1;

if(valm1a>=60)

valm1a=0;

vala=valm1a; //一段时间分显示

data_change();

displayb();

}

else if(flag==0X11) //秒加

{

vals1a=vals1a+1;

if(vals1a>=60)

vals1a=0;

vala=vals1a; //一段时间秒显示

data_change();

displayc();

}

}

else

{ //减

if(flag==0X01)

{

valh1a=valh1a-1;

if(valh1a<0)

valh1a=23;

vala=valh1a; //一段时间时显示

data_change();

displaya();

}

else if(flag==0X10)

{

valm1a=valm1a-1;

if(valm1a<0)

valm1a=59;

vala=valm1a; //一段时间秒显示

data_change();

displayb();

}

else if(flag==0X11)

{

vals1a=vals1a-1;

if(vals1a<0)

vals1a=59;

vala=vals1a; //一段时间秒显示

data_change();

displayc();

}

}break;

case 2: //

if(adddecb)

{

if(flag==0X01) //时加

{

valh2a=valh2a+1;

if(valh2a>=24)

valh2a=0;

vala=valh2a; //二段时间时显示

data_change();

displaya();

}

else if(flag==0X10) //分加

{

valm2a=valm2a+1;

if(valm2a>=60)

valm2a=0;

vala=valm2a; //二段时间分显示

data_change();

displayb();

}

else if(flag==0X11) //秒加

{

vals2a=vals2a+1;

if(vals2a>=60)

vals2a=0;

vala=vals2a; //二段时间秒显示

data_change();

displayc();

}

}

else

{ //减

if(flag==0X01)

{

valh2a=valh2a-1;

if(valh2a<0)

valh2a=23;

vala=valh2a; //二段时间时显示

data_change();

displaya();

}

else if(flag==0X10)

{

valm2a=valm2a-1;

if(valm2a<0)

valm2a=59;

vala=valm2a; //二段时间秒显示

data_change();

displayb();

}

else if(flag==0X11)

{

vals2a=vals2a-1;

if(vals2a<0)

vals2a=59;

vala=vals2a; //段时间秒显示

data_change();

displayc();

}

}break;

case 3:

if(adddecb)

{

if(flag==0X01) //时加

{

valh3a=valh3a+1;

if(valh3a>=24)

valh3a=0;

vala=valh3a; //二段时间时显示

data_change();

displaya();

}

else if(flag==0X10) //分加

{

valm3a=valm3a+1;

if(valm3a>=60)

valm3a=0;

vala=valm3a; //二段时间分显示

data_change();

displayb();

}

else if(flag==0X11) //秒加

{

vals3a=vals3a+1;

if(vals3a>=60)

vals3a=0;

vala=vals3a; //二段时间秒显示

data_change();

displayc();

}

}

else

{ //减

if(flag==0X01)

{

valh3a=valh3a-1;

if(valh3a<0)

valh3a=23;

vala=valh3a; //二段时间时显示

data_change();

displaya();

}

else if(flag==0X10)

{

valm3a=valm3a-1;

if(valm3a<0)

valm3a=59;

vala=valm3a; //二段时间秒显示

data_change();

displayb();

}

else if(flag==0X11)

{

vals3a=vals3a-1;

if(vals3a<0)

vals3a=59;

vala=vals3a; //段时间秒显示

data_change();

displayc();

}

}break;

case 4:

if(adddecb)

{

if(flag==0X01) //时加

{

valh1b=valh1b+1;

if(valh1b>=24)

valh1b=0;

vala=valh1b; //一段时间时显示

data_change();

displaya();

}

else if(flag==0X10) //分加

{

valm1b=valm1b+1;

if(valm1b>=60)

valm1b=0;

vala=valm1b; //一段时间分显示

data_change();

displayb();

}

else if(flag==0X11) //秒加

{

vals1b=vals1b+1;

if(vals1b>=60)

vals1b=0;

vala=vals1b; //一段时间秒显示

data_change();

displayc();

}

}

else

{ //减

if(flag==0X01)

{

valh1b=valh1b-1;

if(valh1b<0)

valh1b=23;

vala=valh1b; //一段时间时显示

data_change();

displaya();

}

else if(flag==0X10)

{

valm1b=valm1b-1;

if(valm1b<0)

valm1b=59;

vala=valm1b; //一段时间秒显示

data_change();

displayb();

}

else if(flag==0X11)

{

vals1b=vals1b-1;

if(vals1b<0)

vals1b=59;

vala=vals1b; //一段时间秒显示

data_change();

displayc();

}

}break;

case 5:

if(adddecb)

{

if(flag==0X01) //时加

{

valh2b=valh2b+1;

if(valh2b>=24)

valh2b=0;

vala=valh2b; //二段时间时显示

data_change();

displaya();

}

else if(flag==0X10) //分加

{

valm2b=valm2b+1;

if(valm2b>=60)

valm2b=0;

vala=valm2b; //二段时间分显示

data_change();

displayb();

}

else if(flag==0X11) //秒加

{

vals2b=vals2b+1;

if(vals2b>=60)

vals2b=0;

vala=vals2b; //二段时间秒显示

data_change();

displayc();

}

}

else

{ //减

if(flag==0X01)

{

valh2b=valh2b-1;

if(valh2b<0)

valh2b=23;

vala=valh2b; //二段时间时显示

data_change();

displaya();

}

else if(flag==0X10)

{

valm2b=valm2b-1;

if(valm2b<0)

valm2b=59;

vala=valm2b; //二段时间秒显示

data_change();

displayb();

}

else if(flag==0X11)

{

vals2b=vals2b-1;

if(vals2b<0)

vals2b=59;

vala=vals2b; //段时间秒显示

data_change();

displayc();

}

}break;

case 6: //

if(adddecb)

{

if(flag==0X01) //时加

{

valh3b=valh3b+1;

if(valh3b>=24)

valh3b=0;

vala=valh3b; //二段时间时显示

data_change();

displaya();

}

else if(flag==0X10) //分加

{

valm3b=valm3b+1;

if(valm3b>=60)

valm3b=0;

vala=valm3b; //二段时间分显示

data_change();

displayb();

}

else if(flag==0X11) //秒加

{

vals3b=vals3b+1;

if(vals3b>=60)

vals3b=0;

vala=vals3b; //二段时间秒显示

data_change();

displayc();

}

}

else

{ //减

if(flag==0X01)

{

valh3b=valh3b-1;

if(valh3b<0)

valh3b=23;

vala=valh3b; //二段时间时显示

data_change();

displaya();

}

else if(flag==0X10)

{

valm3b=valm3b-1;

if(valm3b<0)

valm3b=59;

vala=valm3b; //二段时间秒显示

data_change();

displayb();

}

else if(flag==0X11)

{

vals3b=vals3b-1;

if(vals3b<0)

vals3b=59;

vala=vals3b; //段时间秒显示

data_change();

displayc();

}

break;

case 7:

if(adddecb)

{ //

valh=valh+1;

if(valh>=24)

valh=0;

vala=valh; //时显示

data_change();

displayh();

}

else

{ //

valh=valh-1;

if(valh<0)

valh=23;

vala=valh; //时显示

data_change();

displayh();

}

}break;

case 8:

if(adddecb)

{ //

valm=valm+1;

if(valm>=60)

valm=0;

vala=valm; //分显示

data_change();

displaym();

}

else

{ //

valm=valm-1;

if(valm<0)

valm=59;

vala=valm; //分显示

data_change();

displaym();

} break;

case 9:

if(adddecb)

{ //

vals=vals+1;

if(vals>=60)

vals=0;

vala=vals; //秒显示

data_change();

displays();

}

else

{

vals=vals-1;

if(vals<0)

vals=59;

vala=vals; //秒显示

data_change();

displays();

} break;

default :break;

}

}

/*----------功能判断子程序------------*/

/*一二三段时间开 关 校时 分 秒-9位计数*/

void function()

{

if(func==1) //功能设置循环置为1

{

lcd_init(); /*液晶复位*/

disptest(); //一段时间开

dis_one();

dis_time();

dis_open();

vala=valh1a; //一段时间时显示

data_change();

displaya();

vala=valm1a; //一段时间分显示

data_change();

displayb();

vala=vals1a; //一段时间秒显示

data_change();

displayc();

}

if(func==2) //功能设置循环置为2

{

lcd_init(); /*液晶复位*/

disptest(); //二段时间开

dis_two();

dis_time();

dis_open();

vala=valh2a; //一段时间时显示

data_change();

displaya();

vala=valm2a; //二段时间分显示

data_change();

displayb();

vala=vals2a; //二段时间秒显示

data_change();

displayc();

}

if(func==3) //功能设置循环置为3

{

lcd_init(); /*液晶复位*/

disptest(); //三段时间开

dis_three();

dis_time();

dis_open();

vala=valh3a; //三段时间时显示

data_change();

displaya();

vala=valm3a; //三段时间分显示

data_change();

displayb();

vala=vals3a; //三段时间秒显示

data_change();

displayc();

}

if(func==4) //功能设置循环置为4

{

lcd_init(); /*液晶复位*/

disptest(); //一段时间 关

dis_one();

dis_time();

dis_close();

vala=valh1b; //一段时间时显示

data_change();

displaya();

vala=valm1b; //一段时间分显示

data_change();

displayb();

vala=vals1b; //一段时间秒显示

data_change();

displayc();

}

if(func==5) //功能设置循环置为4

{

lcd_init(); /*液晶复位*/

disptest(); //二段时间 关

dis_two();

dis_time();

dis_close();

vala=valh2b; //一段时间时显示

data_change();

displaya();

vala=valm2b; //二段时间分显示

data_change();

displayb();

vala=vals2b; //二段时间秒显示

data_change();

displayc();

}

if(func==6) //功能设置循环置为4

{

lcd_init(); /*液晶复位*/

disptest(); //三段时间 关

dis_three();

dis_time();

dis_close();

vala=valh3b; //三段时间时显示

data_change();

displaya();

vala=valm3b; //三段时间分显示

data_change();

displayb();

vala=vals3b; //三段时间秒显示

data_change();

displayc();

}

if(func==7) //功能设置循环置为4

{

lcd_init(); /*液晶复位*/

disptest(); //时设置

display_hour();

}

if(func==8) //功能设置循环置为4

{

lcd_init(); /*液晶复位*/

disptest(); //分设置

display_minuter();

}

if(func==9) //功能设置循环置为4

{

lcd_init(); /*液晶复位*/

disptest(); //秒设置

display_second();

}

}

/*************功能设置函数**************/

/*****功能,加减键设定各界面参数*********/

void funset()

{

while(func) //进入功能设置流程

{

if(func==0) //功能计数器为0返回主程序

break; //功能标志大于等于6功能计数器归零

delay(50); //延时等待

if(!HOUR_ADD) //检测按键加

{ //数据处理

delay(30);

adddecbit=1; //加减处理标志置1

yms=0X01; //时分秒判断标志 时为01

addfunt(func,yms,adddecbit); //调用加减处理功能子函数 func界面号adddecbit加减标志

}

else if(!HOUR_DEC) //检测按键减

{ //数据处理

delay(30);

adddecbit=0; //加减处理标志置0

yms=0X01; //时分秒判断标志 时为01

addfunt(func,yms,adddecbit); //调用加减处理功能子函数 func界面号adddecbit加减标志

}

else if(!MINUTER_ADD) //检测按键加

{ //数据处理

delay(30);

adddecbit=1; //加减处理标志置1

yms=0X10; //时分秒判断标志 分为01

addfunt(func,yms,adddecbit); //调用加减处理功能子函数 func界面号adddecbit加减标志

}

else if(!MINUTER_DEC) //检测按键减

{ //数据处理

delay(30);

adddecbit=0; //加减处理标志置0

yms=0X10; //时分秒判断标志 分为01

addfunt(func,yms,adddecbit); //调用加减处理功能子函数 func界面号adddecbit加减标志

}

else if(!SECOND_ADD) //检测按键加

{ //数据处理

delay(30);

adddecbit=1; //加减处理标志置1

yms=0X11; //时分秒判断标志 秒为11

addfunt(func,yms,adddecbit); //调用加减处理功能子函数 func界面号adddecbit加减标志

}

else if(~!SECOND_DEC) //检测按键减

{ //数据处理

delay(30);

adddecbit=0; //加减处理标志置0

yms=0X11; //时分秒判断标志 秒为11

addfunt(func,yms,adddecbit); //调用加减处理功能子函数 func界面号adddecbit加减标志

} //ENTER_KEY

else if(!ENTER_KEY) //检测确定键

{

WRIEEPROM_DEALWITH(func);

}

if(!SET_KEY) //再检测功能键

{

func++; //功能标志加一

delay(150);

if(func>=10) //功能标志大于等于10归0

{

func=0; //功能计数器归零

lcd_init(); //清除液晶显示

displayAdvertising();

delay(2000);

}

function(); //刷新功能显示界面

}

delay(100);

nop();

}

EA=1;

ET0=1;

} //

/************************************/

void main()

{

P0M0=0;

P0M1=0;

P1M0=0;

P1M1=0;

P2M0=0;

P2M1=0;

P3M0=0;

P3M1=0;

P4M0=0;

P4M1=0;

P5M0=0;

P5M1=0;

OUT1=1;

OUT2=1;

OUT3=1;

// m=HEX2BCD(17);

// write_byte(DS3231_YEAR,m); //修改年

// m=HEX2BCD(7);

// write_byte(DS3231_MONTH,m); //修改月

// m=HEX2BCD(18);

// write_byte(DS3231_DAY,m); //修改日

lcd_init(); /*液晶复位*/

displayAdvertising();

delay(5000);

displayymtm(); //显示年月时分

AUXR=0X7F; //STC系列的12T 设置

TMOD&=0xF0; //设置定时器模式

TL0=0x00; //设置定时初值

TH0=0x4C; //设置定时初值

ET0=1;

TR0=1;

EA=1;

lcd_init(); /*液晶复位*/

red_eeprom();

open1_flag=1;

open2_flag=1;

open3_flag=1;

while(1)

{

get_show_date();

get_show_time(); //显示时间

delayus(50000);

if(!SET_KEY) //功能键

{

for(;kcounter<10;) //按键循环5次

{

if(!SET_KEY) //按键低电平

{

kcounter++; //按键计数器加一

kstatus++; //按键状态标志加一

delay(10); //延时

}

else if(~!SET_KEY) //按键高电平

{

kcounter++; //按键计数器加一

kstatus=0; //按键状态标志归零

delay(10); //延时

}

}

if(kstatus>=8) /*按键状态标志大于等于3为有效值*/

{ /*循环检测 */

func=1; // 功能循环标志

lcd_init(); //清除显示

EA=0;

ET0=0;

function(); // 功能判断子程序 功能设置散转

delay(500);

disptest(); //显示func值

funset(); //进入功能设置界面

}

kcounter=0; //按键循环标志归零

kstatus=0; //按键状态标志归零

}

}

}

/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

Build target 'Target 1'

compiling prog-2.c...

linking...

*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS

SEGMENT: ?PR?_DELAYMS?PROG_2

*** WARNING L16: UNCALLED SEGMENT, IGNORED FOR OVERLAY PROCESS

SEGMENT: ?PR?_MODIFYTIME?PROG_2

*** WARNING L15: MULTIPLE CALL TO SEGMENT

SEGMENT: ?PR?_WRITE_COM?PROG_2

CALLER1: ?PR?TIMER0?PROG_2

CALLER2: ?C_C51STARTUP

*** WARNING L15: MULTIPLE CALL TO SEGMENT

SEGMENT: ?PR?_WRITE_DATA?PROG_2

CALLER1: ?PR?TIMER0?PROG_2

CALLER2: ?C_C51STARTUP

Program Size: data=97.7 xdata=0 code=6504

creating hex file from "prog-2"...

"prog-2" - 0 Error(s), 4 Warning(s).

相关推荐
Neil今天也要学习3 小时前
永磁同步电机控制算法--基于数据驱动的超局部无模型预测电流控制MFPC及改进
单片机·嵌入式硬件·算法
在岸上走的鱼4 小时前
ISE 14.7安装到80%(82%或者83%)卡主
嵌入式硬件·硬件工程
Python小老六5 小时前
STM32(ARM32)烧录方式详解:串口、JTAG、SWD
stm32·单片机·嵌入式硬件
CHENG-JustDoIt5 小时前
嵌入式开发 | ARM Cortex-M 系列中M3、M4、M23 和 M33四款处理器的深度对比分析
arm开发·单片机·嵌入式硬件·arm
国科安芯6 小时前
多相交错并联系统的时钟同步精度与输入纹波抵消效应研究
网络·单片机·嵌入式硬件·fpga开发·性能优化
清风6666666 小时前
基于51单片机的双档交流电压表设计与实现
单片机·嵌入式硬件·毕业设计·51单片机·课程设计·期末大作业
17(无规则自律)20 小时前
LubanCat 2烧录一个新镜像后开发环境搭建
linux·嵌入式硬件·考研·软件工程
张槊哲20 小时前
IIC图解
单片机·嵌入式硬件
DLGXY1 天前
STM32(十九)——软件/硬件IIC读写MPU6050
stm32·单片机·嵌入式硬件