?? icc_s.c
字號:
/**************************************************************************
文件名:icc_s.c
功 能;半雙工 同步 串行通訊 從機例程
采用中斷/查詢方式
MCU :Mega16L
晶 振:內部8MHz
硬 件:主機 從機
PC0(SCL)--- PC0(SCL)
PC1(SDA)--- PC1(SDA)
說 明:從機地址000 1000
連 線:主機PORTD與LED相連
運行說明:從機完成傳輸后,都會點亮LED,LED的亮暗與從機發送的數據相對應
將/*...*/注釋部分的注釋符去掉,將中斷程序和主程序變為注釋,
可以運行查詢方式
已通過實驗驗證!
**************************************************************************/
#include <avr/io.h>
#include <avr/signal.h>
#include <avr/delay.h>
#include <avr/wdt.h>
#include <compat/twi.h>
#define uchar unsigned char
#define uint unsigned int
#define ulint unsigned long int
#define slave 0x10
#define read 1
#define write 0
uchar k=0,j=0xf0,l,c=0x00;
uchar rbuf[100];
void Initial_IO(void)
{SREG&=0xEF; //關全局中斷
DDRC=0x00;
PORTC=(1<<PC0)|(1<<PC1);
DDRD=0xff;
PORTD=0xff;
/********看門狗設置*********/
wdt_enable(WDTO_250MS);//看門狗定時器開啟,定時時間1.0s
/*******全局中斷使能********/
SREG=SREG|0x80;
}
//初始化TWI從機模式
void Initial_TWI_s(void)
{TWAR=slave|(1<<TWGCE); //設置從機地址,使能廣播應答
TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
//清除TWI中斷標志位,使能應答,使能TWI,使能TWI中斷
//TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);
}
int main(void)
{Initial_IO();
Initial_TWI_s();
while(1)
{wdt_reset();
_delay_ms(100);}
}
SIGNAL(SIG_2WIRE_SERIAL)
{uchar i,c;
i=TW_STATUS;
wdt_reset();
switch(i)
{case TW_SR_SLA_ACK: //TW_STATUS=0x60,收到本機SLA+W,ACK已返回
//清TWINT,下一步接收數據,返回ACK
break;
case TW_SR_DATA_ACK: //TW_STATUS=0x80,以前SLA+W被尋址,收到數據,ACK已返回
//接收數據
c=TWDR;
//清TWINT,下一步接收數據,返回ACK
break;
case TW_ST_SLA_ACK: //TW_STATUS=0xa8,收到本機SLA+R,ACK已返回
//下一步發送數據,清TWINT,接收NACK或ACK
TWDR=++j;
break;
case TW_ST_DATA_ACK: //TW_STATUS=0xb8,發送數據,ACK已收到
//下一步發送數據,清TWINT,接收NACK或ACK
TWDR=j;
break;
case TW_ST_DATA_NACK://TW_STATUS=0xc0,發送數據,NACK已收到
//清TWINT,下一步接收停止或重新發送信號
break;
case TW_SR_STOP: //TW_STATUS=0xA0,清TWINT,收到STOP或RESTART
break;
default: break;
}
TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN)|(1<<TWIE);
while(1)
{PORTD=j;
wdt_reset();
_delay_ms(100);
SREG=SREG|0x80;
}
}
/*
int main(void)
{uchar i;
Initial_IO();
Initial_TWI_s();
while(1)
{wdt_reset();
while(!(TWCR&(1<<TWINT)));
i=TW_STATUS;
switch(i)
{case TW_SR_SLA_ACK: //TW_STATUS=0x60,收到本機SLA+W,ACK已返回
//清TWINT,下一步接收數據,返回ACK
break;
case TW_SR_DATA_ACK: //TW_STATUS=0x80,以前SLA+W被尋址,收到數據,ACK已返回
//接收數據
c=TWDR;
//清TWINT,下一步接收數據,返回ACK
break;
case TW_ST_SLA_ACK: //TW_STATUS=0xa8,收到本機SLA+R,ACK已返回
//下一步發送數據,清TWINT,接收NACK或ACK
TWDR=j;
break;
case TW_ST_DATA_ACK: //TW_STATUS=0xb8,發送數據,ACK已收到
//下一步發送數據,清TWINT,接收NACK或ACK
TWDR=j;
break;
case TW_ST_DATA_NACK://TW_STATUS=0xc0,發送數據,NACK已收到
//清TWINT,下一步停止發送
break;
case TW_SR_STOP: //TW_STATUS=0xA0,清TWINT,收到STOP或RESTART
break;
default: break;
}
TWCR=(1<<TWINT)|(1<<TWEA)|(1<<TWEN);
PORTD=c;
_delay_ms(100);
}
}*/
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -