#include "reg52.h"
#include "ds1302.h"
#include "onewire.h"
#include "absacc.h"
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;
unsigned int k7 = 0; //S7的状态标识符
unsigned int k6 = 0; //S6的状态标识符
unsigned char clock[3] = {1,1,0}; //闹钟时间,秒分时
unsigned int clock_f = 0;
unsigned char duanma[18] = {0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x80,0xc6,0xc0,0x86,0x8e,0xbf,0x7f}; //段码
unsigned char write_DS1302_addr[7] = {0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //写地址
unsigned char read_DS1302_addr[7] = {0x81,0x83,0x85,0x87,0x89,0x8b,0x8d}; //读地址
unsigned char timer[7] = {80,89,35}; //初始时间 21年、周二、4月12日、23:59:50
unsigned int t_dat; //温度
unsigned int smg_f = 0; //数码管闪烁标识符
unsigned int led_f = 0; //LED闪烁标识符
unsigned int count_clo = 0;
unsigned int count_smg = 0;
//======================初始化函数=============================
void Initsystem()
{
XBYTE[0x8000] = 0xff;
XBYTE[0xa000] = 0x00;
XBYTE[0xc000] = 0xff;
XBYTE[0xe000] = 0xff;
}
//======================timer[i]++和--函数=====================
unsigned char BCDtoTEN (unsigned char dat)
{
dat = (dat /16) * 10 + (dat % 16);
return dat;
}
unsigned char Timeradd(unsigned char dat)
{
dat = dat + 1;
switch(dat)
{
case 10:
dat = 16;break; //BCD的10
case 26:
dat = 32;break; //BCD的20
case 42:
dat = 48;break; //BCD的30
case 58:
dat = 64;break; //BCD的40
case 74:
dat = 80;break; //BCD的50
case 90:
dat = 96;break; //BCD的60
}
return dat;
}
unsigned char Timerminus(unsigned char dat)
{
dat = dat - 1;
switch(dat)
{
case 79:
dat = 73;break;
case 63:
dat = 57;break;
case 47:
dat = 41;break;
case 31:
dat = 25;break;
case 15:
dat = 9;break;
case -1:
dat = 89;break;
}
return dat;
}
//======================时钟函数===============================
void DS1302_confing()
{
unsigned char n;
Write_Ds1302_Byte(0x8e,0x00);
for (n = 0;n < 3;n++)
{
Write_Ds1302_Byte(write_DS1302_addr[n],timer[n]);
}
Write_Ds1302_Byte(0x8e,0x80);
}
void readtime()
{
unsigned char n;
for (n = 0;n < 3;n++)
{
timer[n] = Read_Ds1302_Byte(read_DS1302_addr[n]);
}
}
//======================温度函数===============================
void delay_tem(unsigned int t)
{
while(t--);
}
void read_temperature()
{
unsigned char LSB,MSB;
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0x44);
delay_tem(1000);
init_ds18b20();
Write_DS18B20(0xcc);
Write_DS18B20(0xbe);
LSB = Read_DS18B20();
MSB = Read_DS18B20();
init_ds18b20();
t_dat = 0x0000;
t_dat = MSB;
t_dat <<= 8;
t_dat = t_dat | LSB;
if ((t_dat & 0xf800) == 0x0000)
{
t_dat >>= 4;
//t_dat = t_dat * 10;
//t_dat += (LSB & 0x0f) * 0.625;
}
}
//======================数码管相关函数=========================
void delay_smg(unsigned int t)
{
while(t--);
}
void display_smg(unsigned char pos,unsigned char value)
{
XBYTE[0xc000] = 0x01 << pos;
XBYTE[0xe000] = value;
}
void allsmg()
{
XBYTE[0xc000] = 0xff;
XBYTE[0xe000] = 0xff;
}
void display_smg1302()
{
readtime();
if ((k7 == 1 & smg_f == 1) | (k7 == 0) | (k7 == 2) | (k7 == 3))
{
display_smg(0,duanma[timer[2] / 16]);
delay_smg(300);
display_smg(1,duanma[timer[2] % 16]);
delay_smg(300);
}
display_smg(2,duanma[16]);
delay_smg(300);
if ((k7 == 2 & smg_f == 1) | (k7 == 0) | (k7 == 1) | (k7 == 3))
{
display_smg(3,duanma[timer[1] / 16]);
delay_smg(300);
display_smg(4,duanma[timer[1] % 16]);
delay_smg(300);
}
display_smg(5,duanma[16]);
delay_smg(300);
if ((k7 == 3 & smg_f == 1) | (k7 == 0) | (k7 == 2) | (k7 == 1))
{
display_smg(6,duanma[timer[0] / 16]);
delay_smg(300);
display_smg(7,duanma[timer[0] % 16]);
delay_smg(300);
}
allsmg();
delay_smg(300);
}
void display_smgclock()
{
if ((smg_f == 1 & k6 == 1) | k6 == 2 | k6 == 3)
{
display_smg(0,duanma[clock[2] / 10]);
delay_smg(300);
display_smg(1,duanma[clock[2] % 10]);
delay_smg(300);
}
display_smg(2,duanma[16]);
delay_smg(300);
if ((smg_f == 1 & k6 == 2) | k6 == 1 | k6 == 3)
{
display_smg(3,duanma[clock[1] / 10]);
delay_smg(300);
display_smg(4,duanma[clock[1] % 10]);
delay_smg(300);
}
display_smg(5,duanma[16]);
delay_smg(300);
if ((smg_f == 1 & k6 == 3) | k6 == 1 | k6 == 2)
{
display_smg(6,duanma[clock[0] / 10]);
delay_smg(300);
display_smg(7,duanma[clock[0] % 10]);
delay_smg(300);
}
allsmg();
delay_smg(300);
}
void display_smg18B20()
{
read_temperature();
display_smg(0,0xff);
delay_smg(300);
display_smg(1,0xff);
delay_smg(300);
display_smg(2,0xff);
delay_smg(300);
display_smg(3,0xff);
delay_smg(300);
display_smg(4,0xff);
delay_smg(300);
display_smg(5,duanma[t_dat / 10]);
delay_smg(300);
display_smg(6,duanma[t_dat % 10]);
delay_smg(300);
display_smg(7,duanma[12]);
delay_smg(300);
allsmg();
delay_smg(300);
}
//======================定时器=================================
void init_time()
{
TMOD = 0x01;
TH0 = (65535 - 10000) / 256; //10ms
TL0 = (65535 - 10000) % 256;
EA = 1;
ET0 = 1;
TR0 = 1;
}
void service_time() interrupt 1
{
TH0 = (65535 - 10000) / 256; //10ms
TL0 = (65535 - 10000) % 256;
count_smg++;
if (count_smg == 100)
{
count_smg = 0;
if (smg_f == 0)
{
smg_f = 1;
}
else if (smg_f == 1)
{
smg_f = 0;
}
}
if (clock_f == 1)
{
count_clo++;
}
if (count_clo % 20 == 0)
{
if (led_f == 0)
{
led_f = 1;
}
else if (led_f == 1)
{
led_f = 0;
}
}
if (count_clo >= 500)
{
count_clo = 0;
clock_f = 0;
led_f = 0;
}
}
//======================按键相关函数===========================
void scankeys()
{
if (S7 == 0)
{
if (k7 == 0)
{
k7 = 1;
}
else if (k7 == 1)
{
k7 = 2;
}
else if (k7 == 2)
{
k7 = 3;
}
else if (k7 == 3)
{
k7 = 0;
}
if (clock_f == 1)
{
led_f = 0;
clock_f = 0;
count_clo = 0;
}
while (S7 == 0);
}
if (S6 == 0)
{
if (k6 == 0)
{
k6 = 1;
}
else if (k6 == 1)
{
k6 = 2;
}
else if (k6 == 2)
{
k6 = 3;
}
else if (k6 == 3)
{
k6 = 0;
}
if (clock_f == 1)
{
led_f = 0;
clock_f = 0;
count_clo = 0;
}
while (S6 == 0);
}
if (S5 == 0)
{
if (k7 == 1)
{
timer[2] = Timeradd(timer[2]);
if (timer[2] >= 96)
{
timer[2] = 0;
}
}
else if (k7 == 2)
{
timer[1] = Timeradd(timer[1]);
if (timer[1] >= 96)
{
timer[1] = 0;
}
}
else if (k7 == 3)
{
timer[0] = Timeradd(timer[0]);
if (timer[0] >= 96)
{
timer[0] = 0;
}
}
if (k6 == 1)
{
clock[2] ++;
if (clock[2] == 24)
{
clock[2] = 0;
}
display_smgclock();
}
else if (k6 == 2)
{
clock[1] ++;
if (clock[1] == 61)
{
clock[1] = 0;
}
display_smgclock();
}
else if (k6 == 3)
{
clock[0] ++;
if (clock[0] == 61)
{
clock[0] = 0;
}
display_smgclock();
}
if (clock_f == 1)
{
led_f = 0;
clock_f = 0;
count_clo = 0;
}
while (S5 == 0);
}
if (S4 == 0)
{
if (k7 == 0 & k6 == 0)
{
while(S4 == 0)
{
display_smg18B20();
}
}
if (k7 == 1)
{
timer[2] = Timerminus(timer[2]);
if (timer[2] == 89)
{
timer[2] = 35;
}
}
else if (k7 == 2)
{
timer[1] = Timerminus(timer[1]);
}
else if (k7 == 3)
{
timer[0] = Timerminus(timer[0]);
}
if (k6 == 1)
{
clock[2] --;
if (clock[2] < 0)
{
clock[2] = 23;
}
display_smgclock();
}
else if (k6 == 2)
{
clock[1] --;
if (clock[1] < 0)
{
clock[1] = 60;
}
display_smgclock();
}
else if (k6 == 3)
{
clock[0] --;
if (clock[0] < 0)
{
clock[0] = 60;
}
display_smgclock();
}
if (clock_f == 1)
{
led_f = 0;
clock_f = 0;
count_clo = 0;
}
while (S4 == 0);
}
}
//======================LED相关函数============================
void LEDrunning()
{
if (BCDtoTEN (timer[2]) == clock[2] & BCDtoTEN (timer[1]) == clock[1] & BCDtoTEN (timer[0]) == clock[0])
{
clock_f = 1;
}
if (clock_f == 1)
{
if (led_f == 0)
{
XBYTE[0x8000] = 0xff;
}
else if (led_f == 1)
{
XBYTE[0x8000] = 0xfe;
}
}
}
//======================主函数=================================
void main()
{
Initsystem();
DS1302_confing();
init_time();
while(1)
{
scankeys();
LEDrunning();
if (k6 != 0)
{
display_smgclock();
}
else
{
display_smg1302();
}
}
}