#include <STC15F2K60S2.H>
#include "absacc.h"
#include "iic.h"
#include "onewire.h"
sbit S4 = P3^3;
sbit S5 = P3^2;
sbit S6 = P3^1;
sbit S7 = P3^0;
unsigned char code Seg_code[] = {0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
unsigned int F_count = 0, F_dat = 0, C_dat = 0;
unsigned int F_last = 0, C_last = 0;
unsigned char V_dat = 0, V_threshold = 10, set_threshold = 0, dis_mode = 0, sys_mode = 0;
unsigned char V_last = 0;
unsigned char LED_dat = 0xff;
//unsigned
void DDelay(unsigned int t);
void Key();
void Display();
void Timer0Init(void) //计数器@12.000MHz
{
AUXR &= 0x7F; //定时器时钟12T模式
TMOD &= 0xF0;
TMOD |= 0x04; //设置计数器模式
TL0 = 0xFF; //设置定时初值
TH0 = 0xFF; //设置定时初值
TF0 = 0; //清除TF0标志
ET0 = 1;
EA = 1;
TR0 = 1; //定时器0开始计时
}
void Timer1Init(void) //50毫秒@12.000MHz
{
AUXR &= 0xBF; //定时器时钟12T模式
TMOD &= 0x0F; //设置定时器模式
TL1 = 0xB0; //设置定时初值
TH1 = 0x3C; //设置定时初值
TF1 = 0; //清除TF1标志
ET1 = 1;
TR1 = 1; //定时器1开始计时
}
void ReadRb2()
{
IIC_Start();
IIC_SendByte(0x90);
IIC_WaitAck();
IIC_SendByte(0x03);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0x91);
IIC_WaitAck();
V_dat = IIC_RecByte() * 50 / 255;
IIC_SendAck(1);
IIC_Stop();
}
unsigned char ReadEEPROM(unsigned char addr)
{
unsigned char tmp;
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_Start();
IIC_SendByte(0xa1);
IIC_WaitAck();
tmp = IIC_RecByte();
IIC_SendAck(1);
IIC_Stop();
return tmp;
}
void WriteEEPROM(unsigned char addr, unsigned char dat)
{
IIC_Start();
IIC_SendByte(0xa0);
IIC_WaitAck();
IIC_SendByte(addr);
IIC_WaitAck();
IIC_SendByte(dat);
IIC_WaitAck();
IIC_Stop();
}
void WriteData()
{
WriteEEPROM(0x00, 0xaa);
DDelay(500);
WriteEEPROM(0x01, (unsigned char)(C_dat>>8));
DDelay(500);
WriteEEPROM(0x02, (unsigned char)C_dat);
DDelay(500);
WriteEEPROM(0x03, V_dat);
DDelay(500);
WriteEEPROM(0x04, (unsigned char)(F_dat>>16));
DDelay(500);
WriteEEPROM(0x05, (unsigned char)(F_dat>>8));
DDelay(500);
WriteEEPROM(0x06, (unsigned char)F_dat);
}
void ReadData()
{
C_last = ReadEEPROM(0x01);
C_last = (C_last<<8) + ReadEEPROM(0x02);
V_last = ReadEEPROM(0x03);
F_last = ReadEEPROM(0x04);
F_last = (F_last<<8) + ReadEEPROM(0x05);
F_last = (F_last<<8) + ReadEEPROM(0x06);
}
void InitSystem()
{
XBYTE[0x8000] = 0xff;
XBYTE[0xa000] = 0x00;
XBYTE[0xe000] = 0xff;
Timer0Init();
Timer1Init();
if(ReadEEPROM(0x00) == 0xaa)
ReadData();
else
WriteData();
}
void main()
{
InitSystem();
while(1)
{
Key();
Display();
}
}
void DDelay(unsigned int t)
{
while(t--);
}
void DisplayBit(unsigned char pos, unsigned char dat)
{
XBYTE[0xe000] = 0xff;
XBYTE[0xc000] = 0x01 << pos;
XBYTE[0xe000] = dat;
}
void Display_V()
{
if(sys_mode == 0)
{
DisplayBit(0, 0xc1);
DDelay(500);
DisplayBit(1, 0xff);
}
else
{
DisplayBit(0, 0x89);
DDelay(500);
DisplayBit(1, 0xc1);
}
DDelay(500);
DisplayBit(2, 0xff);
DDelay(500);
DisplayBit(3, 0xff);
DDelay(500);
DisplayBit(4, 0xff);
DDelay(500);
DisplayBit(5, 0xff);
DDelay(500);
if(sys_mode == 0)
{
DisplayBit(6, Seg_code[V_dat/10] & 0x7f);
DDelay(500);
DisplayBit(7, Seg_code[V_dat%10]);
}
else
{
DisplayBit(6, Seg_code[V_last/10] & 0x7f);
DDelay(500);
DisplayBit(7, Seg_code[V_last%10]);
}
DDelay(500);
XBYTE[0xe000] = 0xff;
}
void Display_F()
{
if(sys_mode == 0)
{
DisplayBit(0, 0x8e);
DDelay(500);
DisplayBit(1, 0xff);
}
else
{
DisplayBit(0, 0x89);
DDelay(500);
DisplayBit(1, 0x8e);
}
DDelay(500);
DisplayBit(2, 0xff);
DDelay(500);
if(sys_mode == 0)
{
DisplayBit(3, Seg_code[F_dat/10000]);
DDelay(500);
DisplayBit(4, Seg_code[F_dat%10000/1000]);
DDelay(500);
DisplayBit(5, Seg_code[F_dat%1000/100]);
DDelay(500);
DisplayBit(6, Seg_code[F_dat%100/10]);
DDelay(500);
DisplayBit(7, Seg_code[F_dat%10]);
}
else
{
DisplayBit(3, Seg_code[F_last/10000]);
DDelay(500);
DisplayBit(4, Seg_code[F_last%10000/1000]);
DDelay(500);
DisplayBit(5, Seg_code[F_last%1000/100]);
DDelay(500);
DisplayBit(6, Seg_code[F_last%100/10]);
DDelay(500);
DisplayBit(7, Seg_code[F_last%10]);
}
DDelay(500);
XBYTE[0xe000] = 0xff;
}
void Display_C()
{
if(sys_mode == 0)
{
DisplayBit(0, 0xc6);
DDelay(500);
DisplayBit(1, 0xff);
}
else
{
DisplayBit(0, 0x89);
DDelay(500);
DisplayBit(1, 0xc6);
}
DDelay(500);
DisplayBit(2, 0xff);
DDelay(500);
DisplayBit(3, 0xff);
DDelay(500);
if(sys_mode == 0)
{
DisplayBit(4, Seg_code[C_dat/1000]);
DDelay(500);
DisplayBit(5, Seg_code[C_dat%1000/100] & 0x7f);
DDelay(500);
DisplayBit(6, Seg_code[C_dat%100/10]);
DDelay(500);
DisplayBit(7, Seg_code[C_dat%10]);
}
else
{
DisplayBit(4, Seg_code[C_dat/1000]);
DDelay(500);
DisplayBit(5, Seg_code[C_last%1000/100] & 0x7f);
DDelay(500);
DisplayBit(6, Seg_code[C_last%100/10]);
DDelay(500);
DisplayBit(7, Seg_code[C_last%10]);
}
DDelay(500);
XBYTE[0xe000] = 0xff;
}
void Display_P()
{
DisplayBit(0, 0x8c);
DDelay(500);
DisplayBit(1, 0xff);
DDelay(500);
DisplayBit(2, 0xff);
DDelay(500);
DisplayBit(3, 0xff);
DDelay(500);
DisplayBit(4, 0xff);
DDelay(500);
DisplayBit(5, 0xff);
DDelay(500);
DisplayBit(6, Seg_code[V_threshold/10] & 0x7f);
DDelay(500);
DisplayBit(7, Seg_code[V_threshold%10]);
DDelay(500);
XBYTE[0xe000] = 0xff;
}
void Display()
{
C_dat = rd_temperature();
ReadRb2();
if(set_threshold == 0)
switch(dis_mode)
{
case 0:
if(sys_mode == 0)
{
LED_dat |= 0x7f;
LED_dat &= 0xfb;
}
else
LED_dat |= 0x7f;
Display_V();
break;
case 1:
if(sys_mode == 0)
{
LED_dat |= 0x7f;
LED_dat &= 0xfd;
}
else
LED_dat |= 0x7f;
Display_F();
break;
case 2:
if(sys_mode == 0)
{
LED_dat |= 0x7f;
LED_dat &= 0xfe;
}
else
LED_dat |= 0x7f;
Display_C();
break;
}
else
{
LED_dat |= 0x7f;
Display_P();
}
XBYTE[0x8000] = LED_dat;
}
void Key()
{
if(S4 == 0)
{
if(set_threshold == 0)
if(dis_mode == 2)
dis_mode = 0;
else if(dis_mode < 2)
dis_mode ++; // 0-C, 1-V, 2-F
}
else if(S5 == 0)
{
WriteData();
}
else if(S6 == 0)
{
if(set_threshold == 0)
sys_mode = (sys_mode == 0);
else
{
if(V_threshold < 50)
V_threshold ++;
else
V_threshold = 1;
}
}
else if(S7 == 0)
{
set_threshold = (set_threshold == 0);
}
while(S4==0||S5==0||S6==0||S7==0)
Display();
}
void T0_server() interrupt 1
{
F_count++;
}
void T1_server() interrupt 3
{
static unsigned int ms1 = 0, ms2 = 0, ms3 = 0;
if(++ms1 == 10)
{
ms1 = 0;
F_dat = F_count * 2;
F_count = 0;
}
if(V_dat > V_threshold)
{
if(++ms3 == 4)
{
ms3 = 0;
LED_dat = (LED_dat & 0x7f) | ~(LED_dat | 0x7f);
}
}
else
LED_dat |= 0x80;
if(S6 == 0 && set_threshold == 1)
{
if(ms2 < 16)
ms2++;
if(ms2 == 16)
{
if(V_threshold < 50)
V_threshold ++;
else
V_threshold = 1;
}
}
else
{
ms2 = 0;
}
}