#include <STC15F2K60S2.H>
#include "intrins.h"
// 0 1 2 3 4 5 6 7 8 9 black 标准字库 共阴极
u8 code LED_Value[]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F, 0x00};
u8 code LED_smduan[]={0x01,0x02,0x04,0x08,0x10,0x20,0x40,0x80}; //位码
sbit SER =P4^0; // SER 数据输入
sbit RCLK =P5^4; // RCLk 数据锁存
sbit SRCLK =P4^3; // SRCLK 数据移位
#define LED_Black 0x0a
#define Timer0_Reload 1000 //us
u8 LED[4]; //显示缓冲
u8 display_index; //显示位索引
u8 t_1ms;
u16 ADC_Result=0;
u16 ADC_Value[3];
u8 count=0;
void LED_Scan(void);
void Send_595(u8 dat);
void LED_Display(void);
void main(void)
{
u16 i;
u8 ADC_Flag ;
P0M0 = 0x00;P0M1 = 0x00;
P1M0 = 0x00;P1M1 = 0x00;
P2M0 = 0x00;P2M1 = 0x00;
P3M0 = 0x00;P3M1 = 0x00;
P4M0 = 0x00;P4M1 = 0x00;
P5M0 = 0x00;P5M1 = 0x00;
P1M0|=(1<<4); P1M1|=(1<<4);//P14开漏
TH0 = (65536-Timer0_Reload)/ 256;
TL0 = (65536-Timer0_Reload) % 256;
ET0 = 1;
TR0 = 1;
EA = 1;
// CLK_DIV&=~(1<<5);
P1ASF=(1<<4);//P14做ADC
ADC_CONTR=0x80; //ADC上电
for(i=0;i<1000;i++);
while(1)
{
ADC_CONTR=0x88|(0x04);//启动ADC,并选择通道4
_nop_();
_nop_();
_nop_();
_nop_();
ADC_Flag=0;
while(ADC_Flag==0)
{
ADC_Flag=ADC_CONTR&0x10;
}
ADC_CONTR=0x84;
}
}
void timer0_ISR (void) interrupt 1
{
t_1ms++;
LED_Display();
LED_Scan();
if(t_1ms==5)
{
ADC_Value[count++]=(((u16)ADC_RES << 2) | (ADC_RESL & 3));
if(count==3)
{
ADC_Result=((ADC_Value[0]+ADC_Value[1]+ADC_Value[2])/3);
count=0;
}
t_1ms=0;
}
}
void LED_Scan(void)
{
if(ADC_Result>= 1000) LED[0] = ADC_Result/1000;
else LED[0]=LED_Black;
if(ADC_Result>= 100) LED[1] = ADC_Result%1000/100;
else LED[1]=LED_Black;
if(ADC_Result>= 10) LED[2] = ADC_Result%100/10;
else LED[2]=LED_Black;
LED[3] =ADC_Result%10;
}
void Send_595(u8 dat)
{
u8 i;
for(i=0;i<8;i++)
{
dat<<=1;
SER=CY;
SRCLK=0;
SRCLK=1;
}
}
void LED_Display(void)
{
Send_595(~LED_smduan[display_index]); //输出位码
Send_595(LED_Value[LED[display_index]]); //输出段码
RCLK=0;
RCLK=1;
if(++display_index >= 4) display_index =0;
}