找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 2863|回复: 2
收起左侧

avr ATMega32驱动aw9523b 让led显示,adc数据让led依次亮起,为什么程序跑不起来

[复制链接]
ID:370192 发表于 2018-7-12 14:36 | 显示全部楼层 |阅读模式
代码如下,各位大神请指教

#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);
}
                                                                                                                                                                                          
}

回复

使用道具 举报

ID:370192 发表于 2018-7-13 17:07 | 显示全部楼层
没人我自己答一波.找了两天,终于发现按键逻辑不用配置输出,按键就可以进去,但是进去了无限循环,然后又需要跳出来,用一个break语句解决
回复

使用道具 举报

ID:370192 发表于 2018-7-13 17:11 | 显示全部楼层
按键引脚不用设置输出,按键就可以用了,然后进入循环出不来,不可以重复选择别的状态,用break跳出旧可以了循环里面用m计数.再次进入就可以跳到别的状态了.
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表