#include "iom16v.h"
#include "macros.h"
#define uchar unsigned char
#define uint unsigned int
/*******************************************
TWSR中數(shù)據(jù)的各種狀態(tài),#include "iom16v.h"
#include "macros.h"
#define uchar unsigned char
#define uint unsigned int
/*******************************************
TWSR中數(shù)據(jù)的各種狀態(tài),參照mega 16手冊(cè)172頁(yè)
*******************************************/
//主模式啟動(dòng)狀態(tài)
#define START 0X08//啟動(dòng)總線
#define RESTART 0X10//再啟動(dòng)總線
//主機(jī)發(fā)送模式各種狀態(tài)
#define MT_SLA_ACK 0X18//SLA_W寫(xiě)地址已發(fā)送,收到應(yīng)答位
#define MT_SLA_NACK 0X20//SLA_W寫(xiě)地址已發(fā)送,收到非應(yīng)答位
#define MT_DATA_ACK 0X28//寫(xiě)數(shù)據(jù)已發(fā)送,收到應(yīng)答位
#define MT_DATA_NACK 0X30//寫(xiě)數(shù)據(jù)已發(fā)送,收到非應(yīng)答位
#define MT_ARB_LOST 0X38//SLA_W或者數(shù)據(jù)仲裁失敗
//主接收模式各種狀態(tài)
#define MR_ARB_LOST 0X38//SLA_W或者數(shù)據(jù)仲裁失敗
#define MR_SLA_ACK 0X40//SLA_R已發(fā)送,收到應(yīng)答位
#define MR_SLA_NACK 0X48//SLA_R已發(fā)送,收到非應(yīng)答位
#define MR_DATA_ACK 0X50//收到數(shù)據(jù),返回應(yīng)答位
#define MR_DATA_NACK 0X58//收到數(shù)據(jù),返回非應(yīng)答位
//IIC操作
#define Start() (TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN))
#define Stop() (TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN))
#define TestACK() (TWSR&0Xf8)//TWSR前五位狀態(tài)
#define Send() (TWCR=BIT(TWINT)|BIT(TWEN))
#define SendAck() (TWCR|=BIT(TWEA))
#define SendNoAck() (TWCR&=~BIT(TWEA))
#define ReadNoAck() (TWCR=BIT(TWEN)|BIT(TWINT))
#define ReadAck() (TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA))
#define Wait() while(!(TWCR&BIT(TWINT)))//等待TWINT置1
uint i;
////////////////////////////////////
void twi_init()
{
TWBR=0X12;
TWSR=0;
TWCR=0X44;
}
////////////////////////////////////////////////////////////////寫(xiě)函數(shù)
uchar write_data(uchar add, uchar data,uchar data1)
{
Start();
Wait();
if(TestACK()!=START)
{
PORTA=0x01;
}
TWDR=add;
Send();
Wait();
if(TestACK()!=MT_SLA_ACK)
{
PORTA=0x04;
}
TWDR=data;
Send();
Wait();
if(TestACK()!=MT_DATA_ACK)
{
PORTA=0x10;
}
TWDR=data1;
Send();
Wait();
if(TestACK()!=MT_DATA_ACK)
{
PORTA=0x20;
}
Stop();
delay(1);
}
//////////////////////讀函數(shù)//////////////////////////////////////////////////
uchar Read(uchar data)
{
uchar team;
Start();
Wait();
if(TestACK()!=START)
{show(8,1);
PORTA=0xfe;
}
TWDR=0x90;
Send();
Wait();
if(TestACK()!=MT_SLA_ACK)
{show(8,1);
PORTA=0xfb;
}
TWDR=data;
Send();
Wait();
if(TestACK()!=MT_DATA_ACK)
{show(8,1);
PORTA=0xff;
}
Start();
Wait();
if(TestACK()!=RESTART)
{show(8,1);
PORTA=0xff;
}
TWDR=0x91;
Send();
Wait();
if(TestACK()!=MR_SLA_ACK)
{show(8,1);
PORTA=0xff;
}
ReadNoAck();
Wait();
delay(1);
if(TestACK()!=MR_DATA_NACK)
{show(0,1);
PORTA=0xff;
}
team=TWDR;
Stop();
return team;show(8,0);
}
///////////////////////////////////////////////////////////////////////
const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
const table1[]={0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void show(uchar j,uchar k)
{
DDRB=0XFF;
DDRD=0X03;
PORTD=0X02;
PORTB=table[j];
PORTD=0X01;
PORTB=table1[k];
delay(1);
}
///////////////////////////////////////////////////////////
main()
{
uint a=0,temp;
twi_init();
DDRA=0XFF;
while(1){
a++;
write_data(0x90,0x44,a);
if(a>200) {a=0;}
temp=Read(0x42);
show(temp/100,1);
show(temp%100/10,2);
show(temp%100%10,3);
}
*******************************************/
//主模式啟動(dòng)狀態(tài)
#define START 0X08//啟動(dòng)總線
#define RESTART 0X10//再啟動(dòng)總線
//主機(jī)發(fā)送模式各種狀態(tài)
#define MT_SLA_ACK 0X18//SLA_W寫(xiě)地址已發(fā)送,收到應(yīng)答位
#define MT_SLA_NACK 0X20//SLA_W寫(xiě)地址已發(fā)送,收到非應(yīng)答位
#define MT_DATA_ACK 0X28//寫(xiě)數(shù)據(jù)已發(fā)送,收到應(yīng)答位
#define MT_DATA_NACK 0X30//寫(xiě)數(shù)據(jù)已發(fā)送,收到非應(yīng)答位
#define MT_ARB_LOST 0X38//SLA_W或者數(shù)據(jù)仲裁失敗
//主接收模式各種狀態(tài)
#define MR_ARB_LOST 0X38//SLA_W或者數(shù)據(jù)仲裁失敗
#define MR_SLA_ACK 0X40//SLA_R已發(fā)送,收到應(yīng)答位
#define MR_SLA_NACK 0X48//SLA_R已發(fā)送,收到非應(yīng)答位
#define MR_DATA_ACK 0X50//收到數(shù)據(jù),返回應(yīng)答位
#define MR_DATA_NACK 0X58//收到數(shù)據(jù),返回非應(yīng)答位
//IIC操作
#define Start() (TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN))
#define Stop() (TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN))
#define TestACK() (TWSR&0Xf8)//TWSR前五位狀態(tài)
#define Send() (TWCR=BIT(TWINT)|BIT(TWEN))
#define SendAck() (TWCR|=BIT(TWEA))
#define SendNoAck() (TWCR&=~BIT(TWEA))
#define ReadNoAck() (TWCR=BIT(TWEN)|BIT(TWINT))
#define ReadAck() (TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWEA))
#define Wait() while(!(TWCR&BIT(TWINT)))//等待TWINT置1
uint i;
////////////////////////////////////
void twi_init()
{
TWBR=0X12;
TWSR=0;
TWCR=0X44;
}
////////////////////////////////////////////////////////////////寫(xiě)函數(shù)
uchar write_data(uchar add, uchar data,uchar data1)
{
Start();
Wait();
if(TestACK()!=START)
{
PORTA=0x01;
}
TWDR=add;
Send();
Wait();
if(TestACK()!=MT_SLA_ACK)
{
PORTA=0x04;
}
TWDR=data;
Send();
Wait();
if(TestACK()!=MT_DATA_ACK)
{
PORTA=0x10;
}
TWDR=data1;
Send();
Wait();
if(TestACK()!=MT_DATA_ACK)
{
PORTA=0x20;
}
Stop();
delay(1);
}
//////////////////////讀函數(shù)//////////////////////////////////////////////////
uchar Read(uchar data)
{
uchar team;
Start();
Wait();
if(TestACK()!=START)
{show(8,1);
PORTA=0xfe;
}
TWDR=0x90;
Send();
Wait();
if(TestACK()!=MT_SLA_ACK)
{show(8,1);
PORTA=0xfb;
}
TWDR=data;
Send();
Wait();
if(TestACK()!=MT_DATA_ACK)
{show(8,1);
PORTA=0xff;
}
Start();
Wait();
if(TestACK()!=RESTART)
{show(8,1);
PORTA=0xff;
}
TWDR=0x91;
Send();
Wait();
if(TestACK()!=MR_SLA_ACK)
{show(8,1);
PORTA=0xff;
}
ReadNoAck();
Wait();
delay(1);
if(TestACK()!=MR_DATA_NACK)
{show(0,1);
PORTA=0xff;
}
team=TWDR;
Stop();
return team;show(8,0);
}
///////////////////////////////////////////////////////////////////////
const table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d, 0x07,
0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
const table1[]={0x00,0xfe,0xfd,0xfb,0xf7,0xef,0xdf};
void delay(uint ms)
{
uint i,j;
for(i=0;i<ms;i++)
{
for(j=0;j<1141;j++);
}
}
void show(uchar j,uchar k)
{
DDRB=0XFF;
DDRD=0X03;
PORTD=0X02;
PORTB=table[j];
PORTD=0X01;
PORTB=table1[k];
delay(1);
}
///////////////////////////////////////////////////////////
main()
{
uint a=0,temp;
twi_init();
DDRA=0XFF;
while(1){
a++;
write_data(0x90,0x44,a);
if(a>200) {a=0;}
temp=Read(0x42);
show(temp/100,1);
show(temp%100/10,2);
show(temp%100%10,3);
}
}
Powered by 單片機(jī)教程網(wǎng)