#define CS_DA PORTB7
/*******************************************************************************
/DA输出值计算
/******************************************************************************/
void da_task (int value)
{
uint valueDA=0;
valueDA=V_DA0+K_DA*value;
if(valueDA>0x0fff)
valueDA=0x0fff;
valueDA=0x0FFF-valueDA;
da_driver(valueDA);
}
//DA输出驱动
void da_driver(uint byte)
{
uchar j=0,i=0;
uint DA_shift=0;
SPCR&=~(1<<SPE);//关spi
PORTB|=(1<<PORTB5); //时钟高
PORTB|=(1<<CS_DA); //on CS
for(i=0;i<20;i++);
PORTB&=~(1<<PORTB5); //时钟低
DA_shift=byte<<4;//127-byte1;
for (j=0;j<12;j++) //
{
if(DA_shift&0x8000)
PORTB|=(1<<PORTB3);
else
PORTB&=~(1<<PORTB3);
DA_shift<<=1;
for(i=0;i<20;i++);
PORTB|=(1<<PORTB5); //时钟高
for(i=0;i<50;i++);
PORTB&=~(1<<PORTB5); //时钟低
}
for(i=0;i<50;i++);
PORTB&=~(1<<CS_DA); //off CS
for(i=0;i<50;i++);
SPCR|=(1<<SPE);
}