/***定时器三时段输出自动控制器 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).