XOXOgossipgirl
void HDQ_write_char(unsigned char data);
unsigned char HDQ_read(void);
unsigned char bat_remain(void);
void HDQ_write_char(unsigned char data)
{
unsigned char i,j;
DDRA.7=1;
PORTA.7=0;
delay_us(200);
PORTA.7=1;
delay_us(50);
for(j=0;j<8;j++)
{
i=data&0x01;
if(i==0x01)
{
PORTA.7=0;
delay_us(25);
PORTA.7=1;
delay_us(180);
}
else
{
PORTA.7=0;
delay_us(125);
PORTA.7=1;
delay_us(80);
}
data=data>>1;
}
DDRA.7=0;
PORTA.7=1;
}
unsigned char HDQ_read(void)
{
unsigned char i,byte;
unsigned int j;
j=0;
byte=0;
for(i=0;i<8;i++)
{
while(PINA.7)
{
j++;
if(j>2560)return 0;
}
delay_us(50);
if(PINA.7)byte|=0x80;
if(i<7)byte=byte>>1;
delay_us(80);
}
return byte;
}
//return remain capacity (%)
unsigned char bat_remain(void)
{
unsigned char temp1,temp2;
unsigned int sum;
HDQ_write_char(0x0d);
temp1=HDQ_read();
HDQ_write_char(0x05);
temp2=HDQ_read();
if(temp2)
{
sum=temp1;
sum*=100;
sum/=temp2;
return (unsigned char)sum&0x00ff;
}
else
return 0;
}