|
代碼如下,各位大神請指教
#include <iom32v.h>
#include <macros.h>
#define uchar unsigned char
#define uint unsigned int
#define WD_DEVIC_ADDR 0xb6
#define RD_DEVIC_ADDR 0xb7
#define SLA_AW1 0X02
#define SLA_AW2 0X03
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#define MT_DATA_ACK 0x28
#define MT_DATA_NOACK 0x38
#define START 0x08
#define RE_START 0x10
#define MR_SLA_ACK 0x40
#define MR_SLA_NOACK 0x48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0x58
#define DATA1 0x79
#define DATA2 0xd5
#define DATA3 0xb6
#define DATA4 0xea
#define DATA5 0x2c
#define DATA6 0xc0
#define WD_DEVICE_FW 0x7f //aw9523 軟復位寄存器地址
#define WD_DEVICE_DG 0x11 //aw9523 燈光電流控制寄存器地址
#define Start() TWCR = (1<<TWINT)|(1<<TWSTA)|(1<<TWEN);
#define Wait() while (!(TWCR & (1<<TWINT)));
#define Stop() TWCR = (1<<TWINT)|(1<<TWEN)|(1<<TWSTO);
#define TestAck() (TWSR&=0xf8)
#define SetAck() (TWCR|=(1<<TWEN)
#define SetNoack() (TWCR&=~(1<<TWEN))
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN));
#define Write8Bit(x) {TWDR=(x); TWCR=(1<<TWINT)|(1<<TWEN);}
const a[] = {0xef,0xbf,0xbf,0xbf,0xbf,0xbf,0xbf,
0xbf,0xbf,0xb7,0xb3,0xb1,0x00};
const b[] = {0xfb,0xfb,0x3b,0x1b,0x0b,0x03,0x01,
0x00,0x00,0x00,0x00,0x00,0x00};
//燈依次亮起數據
void twi_init(void)
{
TWBR=0x20;
TWCR=0x04;
TWSR=0;
}
uchar IIC_Write(uchar addr,uchar wdata,uchar addr2,uchar wdata2)
{
Start();
Wait();
if(TestAck()!=START)
return 1;
Write8Bit(WD_DEVIC_ADDR);
Wait();
if(TestAck()!=MT_SLA_ACK)
return 1;
Write8Bit(addr);
Wait();
if(TestAck()!=MT_DATA_ACK)
return 1;
Write8Bit(wdata);
Wait();
if (TestAck()!=MT_DATA_ACK)
return 1;
Write8Bit(addr2);
Wait();
if(TestAck()!=MT_DATA_ACK)
return 1;
Write8Bit(wdata2);
Wait();
if (TestAck()!=MT_DATA_ACK)
return 1;
Stop();
return 0;
}
uchar IIC_read(uchar addr)
{
uchar temp1;
Start();
Wait();
if(TestAck()!=START)
return 1;
Write8Bit(WD_DEVIC_ADDR);
Wait();
if(TestAck()!=MR_SLA_ACK)
return 1;
Write8Bit(addr);
Wait();
if(TestAck()!=MR_SLA_ACK)
return 1;
Twi();
Wait();
if(TestAck()!=MR_DATA_NOACK)
return 1;
temp1=TWDR;
Stop();
return temp1;
}
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<8000;j++);
}
}
uchar key(void)
{
uchar m;
PORTC|=BIT(2);
DDRC|=BIT(2);
DDRC&=~BIT(2);
m=PINC;
m=m&0x04;
if(m=0x04)
{
return 0;
}
else
{
return 1;
}
}
/*void device_restart(void)
{
DDRC |= (1<<DDC4);
PORTC |= ~(1<<PORTC4);
delay(3);
PORTC |= (1<<PORTC4);
delay(1);
}*/
void main(void)
{
uchar c;
uchar m;
uint addata;
uchar n;
uint f;
c=0;
twi_init();
IIC_Write(0x12,0x00,0x13,0x00);
twi_init();
IIC_Write(0x11,0x03,0x26,0x7f);
twi_init();
IIC_Write(0x27,0x7f,0x28,0x7f);
DDRA &=~(1<<DDA0)|~(1<<DDA1)|~(1<<DDA2);
PORTA |=(1<<PORTA0)|(1<<PORTA1)|(1<<PORTA2);
DDRB |= (1<<DDB0)|(1<<DDB1)|(1<<DDB2);
while(key())
{
m=0;
switch(m)
{
case 0:
twi_init();
IIC_Write(SLA_AW1,0x00,SLA_AW2,0x00); //輸出燈光數據
twi_init();
IIC_read(SLA_AW1);
IIC_read(SLA_AW2);
break;
case 1:
twi_init();
IIC_Write(SLA_AW1,DATA1,SLA_AW2,DATA2); //輸出燈光數據
delay(2);
ADMUX=0x00;
PORTA &=~(1<<PORTA0);
ADCSRA=0X80;
ADCSRA|=BIT(ADSC);
while(!(ADCSRA&(BIT(ADIF))));
addata=ADCL;
addata=addata+ADCH*256;
twi_init();
IIC_read(SLA_AW1);
IIC_read(SLA_AW2);
break;
case 2:
twi_init();
IIC_Write(SLA_AW1,DATA3,SLA_AW2,DATA4); //輸出燈光數據
delay(2);
ADMUX=0x01;
PORTA &=~(1<<PORTA1);
ADCSRA=0X80;
ADCSRA|=BIT(ADSC);
while(!(ADCSRA&(BIT(ADIF))));
addata=ADCL;
addata=addata+ADCH*256;
twi_init();
IIC_read(SLA_AW1);
IIC_read(SLA_AW2);
break;
case 3:
twi_init();
IIC_Write(SLA_AW1,DATA5,SLA_AW2,DATA6); //輸出燈光數據
delay(2);
ADMUX=0x02;
PORTA &=~(1<<PORTA2);
ADCSRA=0X80;
ADCSRA|=BIT(ADSC);
while(!(ADCSRA&(BIT(ADIF))));
addata=ADCL;
addata=addata+ADCH*256;
twi_init();
IIC_read(SLA_AW1);
IIC_read(SLA_AW2);
break;
default :
m=0;
break;
}
m++;
f=addata;
if(f<=0x3f)
n=0;
else if ((f>0x3f)&(f<=0x7e))
n=1;
else if ((f>0x7e)&(f<=0xbd))
n=2;
else if ((f>0xbd)&(f<=0xfc))
n=3;
else if ((f>0xfc)&(f<=0x12b))
n=4;
else if ((f>0x12b)&(f<=0x16a))
n=5;
else if ((f>0x16a)&(f<=0x1a9))
n=6;
else if ((f>0x1a9)&(f<=0x1e8))
n=7;
else if ((f>0x1e8)&(f<=0x227))
n=8;
else if ((f>0x227)&(f<=0x266))
n=10;
else if ((f>0x266)&(f<=0x29d))
n=11;
else
n=12;
twi_init();
IIC_Write(SLA_AW1,a[n],SLA_AW2,b[n]);
twi_init();
IIC_read(SLA_AW1);
twi_init();
IIC_read(SLA_AW2);
}
}
|
|