一、题目要求
二、代码展示
#include <STC15F2K60S2.h>
#include "iic.h"
#include "ds1302.h"
#define uchar unsigned char
#define uint unsigned int
uchar Mode_Check = 0;
uchar Warning = 0;
uchar shidu;
uchar shijian[] = {0, 30, 8, 0, 0, 0, 0};
uchar shidu_yuzhi = 50;
Reset_Check = 0;
uchar code SMG_duanma[18] =
{0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,
0x88,0x80,0xc6,0xc0,0x86,0x8e,
0xbf,0x7f};
uchar code SMG_Dot_AC[10] =
{0X40,0X79,0X24,0X30,0X19,0X12,0X02,0X78,0X00,0X10};
void Initsys();
void SelectHC138(uchar channel);
void DisplaySMG_Bit(uchar pos, uchar value);
void SMG_Display();
void Delay_one_ms_SMG();
void Alone_Key_S6_S4();
void Delay_five_ms_Key();
void Alone_Key_Mode_Check();
void Mode_0();
void Mode_1();
uchar AD_read(uchar add);
uchar EEPROM_read(uchar add);
void EEPROM_write(uchar add, uchar dat);
void Init_DS1302();
void Read_DS1302();
void Mode_SMG_Display();
void Delay_five_ms_EEPROM();
void Reset_shidu_yuzhi_Display();
void Mode_Reset_shidu_yuzhi();
void Check_shidu();
void Mode_1_Warning();
void main()
{
Initsys();
Init_DS1302();
while(1)
{
Alone_Key_Mode_Check();
if(Mode_Check == 0)
{
Mode_0();
}
else if(Mode_Check != 0)
{
Mode_1();
}
}
}
void Mode_0()
{
SelectHC138(4);
P0 = 0XFE;
while(1)
{
Check_shidu();
Alone_Key_S6_S4();
Alone_Key_Mode_Check();
Mode_SMG_Display();
if(Mode_Check != 0)
{
break;
}
}
}
void Check_shidu()
{
Read_DS1302();
shidu = (uchar)(AD_read(0X03) * 0.39f);
if(shidu < shidu_yuzhi)
{
SelectHC138(5);
P0 = 0X10;
}
else
{
SelectHC138(5);
P0 = 0X00;
}
}
void Mode_Reset_shidu_yuzhi()
{
if(Reset_Check != 0)
{
while(1)
{
Reset_shidu_yuzhi_Display();
Alone_Key_S6_S4();
if(Reset_Check == 0)
{
break;
}
}
}
}
void Mode_1()
{
SelectHC138(4);
P0 = 0XFD;
while(1)
{
Mode_1_Warning();
Alone_Key_S6_S4();
Alone_Key_Mode_Check();
Mode_SMG_Display();
if(Mode_Check == 0)
{
break;
}
}
}
void Mode_1_Warning()
{
if(Warning != 0)
{
Read_DS1302();
shidu = (uchar)(AD_read(0X03) * 0.39f);
if(shidu < shidu_yuzhi)
{
SelectHC138(5);
P0 = 0X40;
}
else
{
SelectHC138(5);
P0 = 0X00;
}
}
}
void Alone_Key_Mode_Check()
{
if(P30 == 0)
{
Delay_five_ms_Key();
if(P30 == 0)
{
Mode_Check = ~Mode_Check;
}
while(!P30);
}
}
void Alone_Key_S6_S4()
{
if(P31 == 0)
{
Delay_five_ms_Key();
if(P31 == 0)
{
if(Mode_Check == 0)
{
Reset_Check = ~Reset_Check;
while(!P31);
Mode_Reset_shidu_yuzhi();
}
else if(Mode_Check != 0)
{
Warning = ~Warning;
}
}
while(!P31);
}
else if(P32 == 0)
{
Delay_five_ms_Key();
if(P32 == 0)
{
if(Mode_Check == 0 && Reset_Check != 0)
{
shidu_yuzhi = shidu_yuzhi + 1;
EEPROM_write(0X10, shidu_yuzhi);
Delay_five_ms_EEPROM();
}
else if(Mode_Check != 0)
{
SelectHC138(5);
P0 = 0X10;
}
}
while(!P32);
}
else if(P33 == 0)
{
Delay_five_ms_Key();
if(P33 == 0)
{
if(Mode_Check == 0 && Reset_Check != 0)
{
shidu_yuzhi = shidu_yuzhi - 1;
EEPROM_write(0X10, shidu_yuzhi);
Delay_five_ms_EEPROM();
}
else if(Mode_Check != 0)
{
SelectHC138(5);
P0 = 0X00;
}
}
while(!P33);
}
}
void SelectHC138(uchar channel)
{
switch(channel)
{
case 4:
P2 = (P2 & 0X1F) | 0X80;
break;
case 5:
P2 = (P2 & 0X1F) | 0Xa0;
break;
case 6:
P2 = (P2 & 0X1F) | 0Xc0;
break;
case 7:
P2 = (P2 & 0X1F) | 0Xe0;
break;
case 0:
P2 = (P2 & 0X1F) | 0X00;
break;
}
}
void Initsys()
{
SelectHC138(5);
P0 = 0X00;
SelectHC138(4);
P0 = 0XFF;
SelectHC138(6);
P0 = 0XFF;
SelectHC138(7);
P0 = 0XFF;
EEPROM_write(0X10, shidu_yuzhi);
Delay_five_ms_EEPROM();
}
void DisplaySMG_Bit(uchar pos, uchar value)
{
SelectHC138(6);
P0 = 0X01 << pos;
SelectHC138(7);
P0 = value;
}
void Delay_one_ms_SMG()
{
uint j;
for(j = 845; j > 0; j--);
}
void Delay_five_ms_Key()
{
uint i,j;
for(i = 0; i < 5; i++)
for(j = 845; j > 0; j--);
}
void Delay_five_ms_EEPROM()
{
uint i,j;
for(i = 0; i < 5; i++)
for(j = 845; j > 0; j--);
}
void Init_DS1302()
{
uchar i, add;
add = 0X80;
Write_Ds1302(0X8e, 0X00);
for(i = 0; i < 7; i++)
{
Write_Ds1302(add, shijian[i]);
add = add + 2;
}
Write_Ds1302(0X8e, 0X80);
}
void Read_DS1302()
{
uchar i, add;
add = 0X81;
Write_Ds1302(0X8e, 0X00);
for(i = 0; i < 7; i++)
{
shijian[i] = Read_Ds1302(add);
add = add + 2;
}
Write_Ds1302(0X8e, 0X80);
}
uchar AD_read(uchar add)
{
uchar temp;
IIC_Start();
IIC_SendByte(0X90);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0X91);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_Stop();
return temp;
}
uchar EEPROM_read(uchar add)
{
uchar temp;
IIC_Start();
IIC_SendByte(0XA0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_Stop();
IIC_Start();
IIC_SendByte(0XA1);
IIC_WaitAck();
temp = IIC_RecByte();
IIC_Stop();
return temp;
}
void EEPROM_write(uchar add, uchar dat)
{
IIC_Start();
IIC_SendByte(0XA0);
IIC_WaitAck();
IIC_SendByte(add);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
void Mode_SMG_Display()
{
Read_DS1302();
shidu = (uchar)(AD_read(0X03) * 0.39f);
DisplaySMG_Bit(0, SMG_duanma[shijian[2] / 10]);
Delay_one_ms_SMG();
DisplaySMG_Bit(1, SMG_duanma[shijian[2] % 10]);
Delay_one_ms_SMG();
DisplaySMG_Bit(2, SMG_duanma[16]);
Delay_one_ms_SMG();
DisplaySMG_Bit(3, SMG_duanma[shijian[1] / 10]);
Delay_one_ms_SMG();
DisplaySMG_Bit(4, SMG_duanma[shijian[1] % 10]);
Delay_one_ms_SMG();
DisplaySMG_Bit(6, SMG_duanma[shidu / 10]);
Delay_one_ms_SMG();
DisplaySMG_Bit(7, SMG_duanma[shidu % 10]);
Delay_one_ms_SMG();
P0 = 0XFF;
}
void Reset_shidu_yuzhi_Display()
{
shidu_yuzhi = EEPROM_read(0X10);
DisplaySMG_Bit(0, SMG_duanma[16]);
Delay_one_ms_SMG();
DisplaySMG_Bit(1, SMG_duanma[16]);
Delay_one_ms_SMG();
DisplaySMG_Bit(6, SMG_duanma[shidu_yuzhi / 10]);
Delay_one_ms_SMG();
DisplaySMG_Bit(7, SMG_duanma[shidu_yuzhi % 10]);
Delay_one_ms_SMG();
}