#include "iom16v.h" #include "macros.h" #define uchar unsigned char #define uint unsigned int /******************************************* TWSR中數據的各種狀態,#include"iom16v.h" #include "macros.h" #define uchar unsigned char #define uint unsigned int /******************************************* TWSR中數據的各種狀態,參照mega 16手冊172頁 *******************************************/ //主模式啟動狀態 #define START 0X08//啟動總線 #define RESTART 0X10//再啟動總線 //主機發送模式各種狀態 #define MT_SLA_ACK 0X18//SLA_W寫地址已發送,收到應答位 #define MT_SLA_NACK 0X20//SLA_W寫地址已發送,收到非應答位 #define MT_DATA_ACK 0X28//寫數據已發送,收到應答位 #define MT_DATA_NACK 0X30//寫數據已發送,收到非應答位 #define MT_ARB_LOST 0X38//SLA_W或者數據仲裁失敗 //主接收模式各種狀態 #define MR_ARB_LOST 0X38//SLA_W或者數據仲裁失敗 #define MR_SLA_ACK 0X40//SLA_R已發送,收到應答位 #define MR_SLA_NACK 0X48//SLA_R已發送,收到非應答位 #define MR_DATA_ACK 0X50//收到數據,返回應答位 #define MR_DATA_NACK 0X58//收到數據,返回非應答位 //IIC操作 #define Start()(TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN)) #define Stop()(TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN)) #define TestACK() (TWSR&0Xf8)//TWSR前五位狀態 #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; } ////////////////////////////////////////////////////////////////寫函數 uchar write_data(uchar add, uchardata,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); } //////////////////////讀函數////////////////////////////////////////////////// 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); } }參照mega 16手冊172頁 *******************************************/ //主模式啟動狀態 #define START 0X08//啟動總線 #define RESTART 0X10//再啟動總線 //主機發送模式各種狀態 #define MT_SLA_ACK 0X18//SLA_W寫地址已發送,收到應答位 #define MT_SLA_NACK 0X20//SLA_W寫地址已發送,收到非應答位 #define MT_DATA_ACK 0X28//寫數據已發送,收到應答位 #define MT_DATA_NACK 0X30//寫數據已發送,收到非應答位 #define MT_ARB_LOST 0X38//SLA_W或者數據仲裁失敗 //主接收模式各種狀態 #define MR_ARB_LOST 0X38//SLA_W或者數據仲裁失敗 #define MR_SLA_ACK 0X40//SLA_R已發送,收到應答位 #define MR_SLA_NACK 0X48//SLA_R已發送,收到非應答位 #define MR_DATA_ACK 0X50//收到數據,返回應答位 #define MR_DATA_NACK 0X58//收到數據,返回非應答位 //IIC操作 #define Start()(TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN)) #define Stop()(TWCR=BIT(TWINT)|BIT(TWSTO)|BIT(TWEN)) #define TestACK() (TWSR&0Xf8)//TWSR前五位狀態 #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; } ////////////////////////////////////////////////////////////////寫函數 uchar write_data(uchar add, uchardata,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); } //////////////////////讀函數////////////////////////////////////////////////// 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); } }
|