久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

標題: avr ATMega32驅動aw9523b 讓led顯示,adc數據讓led依次亮起,為什么程序跑不起來 [打印本頁]

作者: abu89    時間: 2018-7-12 14:36
標題: avr ATMega32驅動aw9523b 讓led顯示,adc數據讓led依次亮起,為什么程序跑不起來
代碼如下,各位大神請指教

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


作者: abu89    時間: 2018-7-13 17:07
沒人我自己答一波.找了兩天,終于發現按鍵邏輯不用配置輸出,按鍵就可以進去,但是進去了無限循環,然后又需要跳出來,用一個break語句解決
作者: abu89    時間: 2018-7-13 17:11
按鍵引腳不用設置輸出,按鍵就可以用了,然后進入循環出不來,不可以重復選擇別的狀態,用break跳出舊可以了循環里面用m計數.再次進入就可以跳到別的狀態了.




歡迎光臨 (http://www.zg4o1577.cn/bbs/) Powered by Discuz! X3.1
主站蜘蛛池模板: 综合久久一区 | 日韩三级 | 亚洲第一成人影院 | 最新中文字幕一区 | 秋霞a级毛片在线看 | 在线精品一区二区 | 亚洲毛片在线观看 | 中文字幕一页二页 | 国产精品久久 | 日韩精品极品视频在线观看免费 | 欧美日韩亚洲国产 | 欧美一区二区在线 | 最新午夜综合福利视频 | 国产精品伦理一区 | 国产精品亚洲综合 | 成人综合一区二区 | 日韩精品一区二区三区 | 在线视频国产一区 | 国产精品毛片 | 国产精品91视频 | 欧美在线观看一区 | 久久精品国产一区 | 欧美一级在线观看 | 国产精品黄色 | 久久国产激情视频 | 欧美一级大片 | 国产精品亚洲片在线播放 | 欧美精品在欧美一区二区少妇 | av中文字幕在线播放 | 国产黄色精品在线观看 | 免费在线成人网 | 最新日韩精品 | 亚洲国产一区二区三区 | 欧美日韩成人在线 | 亚洲国产一区二区在线 | 日韩精品无码一区二区三区 | 国产乱码精品一区二三赶尸艳谈 | 欧美一级在线免费 | 一级片aaa | 日本网站免费观看 | 日韩欧美中文 |