#include "stc8g.h"
#include "main.h"

sbit PIN1 = P3^0;      //数码管
sbit PIN2 = P3^1;      //数码管
sbit PIN3 = P3^2;      //数码管
sbit PIN4 = P3^3;      //数码管
sbit PIN5 = P5^4;      //数码管

#define B1 0x0001
#define C1 0x0002

#define A2 0x0004
#define B2 0x0008
#define C2 0x0010
#define D2 0x0020
#define E2 0x0040
#define F2 0x0080
#define G2 0x0100

#define A3 0x0200
#define B3 0x0400
#define C3 0x0800
#define D3 0x1000
#define E3 0x2000
#define F3 0x4000
#define G3 0x8000

u16 display_num;


//第一个7段码从0~9对应的编码
code u16 digit1[11] =
{
    0,			//0 消隐    
    B1|C1,		//1       
};

//第二个7段码从0~9对应的编码
code u16 digit2[11] =
{
        A2|B2|C2|D2|E2|F2,         //0
        B2|C2,                     //1
        A2|B2|D2|E2|G2,            //2
        A2|B2|C2|D2|G2,            //3
        B2|C2|F2|G2,               //4
        A2|C2|D2|F2|G2,            //5
        A2|C2|D2|E2|F2|G2,        //6
        A2|B2|C2,                  //7
        A2|B2|C2|D2|E2|F2|G2,		//8
        A2|B2|C2|D2|F2|G2,        //9
        0,                  //黑 消隐
};

//第三个7段码从0~9对应的编码
code u16 digit3[11] =
{
        A3|B3|C3|D3|E3|F3,         //0
        B3|C3,                     //1
        A3|B3|D3|E3|G3,            //2
        A3|B3|C3|D3|G3,            //3
        B3|C3|F3|G3,               //4
        A3|C3|D3|F3|G3,            //5
        A3|C3|D3|E3|F3|G3,         //6
        A3|B3|C3,                  //7
        A3|B3|C3|D3|E3|F3|G3,      //8
        A3|B3|C3|D3|F3|G3,        //9
        0,                        //黑 消隐
};

//6个IO全部设为输入，关闭上拉
void ALL_IN (void)
{        
    P3M0 = 0x0f; P3M1 = 0x0f; 
    P5M0 = 0x10; P5M1 = 0x30; 
	P3PU = 0x00; P5PU = 0x00; 	
	P3 = 0x0f;	 P54 = 1;
}

void PIN1_OUT_L(void)
{
    PIN1 = 0;
}

void PIN2_OUT_L(void)
{
    PIN2 = 0;
}

void PIN3_OUT_L(void)
{
    PIN3 = 0;
}

void PIN4_OUT_L(void)
{
    PIN4 = 0;
}



void PIN1_OUT_H(void)
{
    P3PU |= 0x01; 
	P30 = 1;
}

void PIN2_OUT_H(void)
{
    P3PU |= 0x02; 
	P31 = 1;
}

void PIN3_OUT_H(void)
{
    P3PU |= 0x04;
	P32 = 1;	
}

void PIN4_OUT_H(void)
{
    P3PU |= 0x08; 
	P33 = 1;
}

void PIN5_OUT_H(void)
{
    P5PU |= 0x10; 
	P54 = 1;
}


void display(u8 num)
{
	u8 num1,num2,num3;
	if(num > 199) num = 199;
	num1 = num / 100;               //拆分出百位
	num2 = (num % 100) / 10;        //拆分出十位
	num3 = num % 10;                //拆分出个位                
	display_num = digit1[num1] | digit2[num2] | digit3[num3];    
}

void Timer0_Isr(void) interrupt 1
{
		static u8 sta; 
		ALL_IN();     //关闭数码管        
		switch (sta)
		{
				case 1:
						PIN1_OUT_L();
						if(display_num & B3) PIN2_OUT_H(); 
						if(display_num & D3) PIN3_OUT_H();
						if(display_num & F3) PIN4_OUT_H();
						if(display_num & G3) PIN5_OUT_H();                
						sta++;
						break;
				case 2:
						PIN2_OUT_L();
						if(display_num & B2) PIN3_OUT_H(); 
						if(display_num & D2) PIN4_OUT_H();
						if(display_num & E2) PIN5_OUT_H();
						if(display_num & A3) PIN1_OUT_H();                
						sta++;
						break;
				case 3:                
						PIN3_OUT_L();
						if(display_num & A2) PIN2_OUT_H();
						if(display_num & C2) PIN4_OUT_H();
						if(display_num & F2) PIN5_OUT_H();   
						if(display_num & C3) PIN1_OUT_H();                        
						sta++;
						break;
				case 4:        
						PIN4_OUT_L();
						if(display_num & B1) PIN3_OUT_H(); 
						if(display_num & C1) PIN2_OUT_H();
						if(display_num & G2) PIN5_OUT_H();
						if(display_num & E3) PIN1_OUT_H(); 				           
						sta = 1;
						break;
				default:
						sta = 1;
						break;
		}
}


void Timer0_Init(void)		//1毫秒@6.000MHz
{
	AUXR |= 0x80;			//定时器时钟1T模式
	TMOD &= 0xF0;			//设置定时器模式
	TL0 = 0x90;				//设置定时初始值
	TH0 = 0xE8;				//设置定时初始值
	TF0 = 0;				//清除TF0标志
	TR0 = 1;				//定时器0开始计时
	ET0 = 1;				//使能定时器0中断
}


void Timer1_Isr(void) interrupt 3
{
	u32 tmp;
	if(ADC_CONTR & 0x20)
	{
	    ADC_CONTR &= ~0x20;                     //清完成标志
        tmp = (u32)(ADC_RES * 331 / 256);       //读取ADC结果
		display((u8)tmp);
		ADC_CONTR |= 0x45;                      //再次启动AD转换		
	}	
}

void Timer1_Init(void)		//100毫秒@6.000MHz
{
	AUXR &= 0xBF;			//定时器时钟12T模式
	TMOD &= 0x0F;			//设置定时器模式
	TL1 = 0xB0;				//设置定时初始值
	TH1 = 0x3C;				//设置定时初始值
	TF1 = 0;				//清除TF1标志
	TR1 = 1;				//定时器1开始计时
	ET1 = 1;				//使能定时器1中断
}

void ADC_Init(void)
{
	ADCCFG &= 0x0f;		//数据左对齐，只取高8位
	ADCTIM = 0x3e;			//CSSETUP(0), CSHOLD(1), SMPDUTY(14)
	ADC_CONTR = 0x80;                           //使能ADC模块
	ADC_CONTR |= 0x45;                      //启动AD转换
}


void main(void)
{
	EAXSFR();		//扩展寄存器访问使能           	
    P0M0 = 0x00; P0M1 = 0x00; 
    P1M0 = 0x00; P1M1 = 0x00; 
    P2M0 = 0x00; P2M1 = 0x00; 
    P3M0 = 0x0f; P3M1 = 0x0f; 
    P4M0 = 0x00; P4M1 = 0x00; 
    P5M0 = 0x10; P5M1 = 0x30; 
    P6M0 = 0x00; P6M1 = 0x00; 
    P7M0 = 0x00; P7M1 = 0x00; 
	P3PU = 0x0f; 
    P5PU = 0x10; 
	Timer0_Init();
	Timer1_Init();
	ADC_Init();
	EA = 1;	
    while (1);
}


//end