#include <avr/io.h>
#define F_CPU 12000000UL
#include "util/delay.h"
#include <avr/interrupt.h>
/*********************按键定义*******************************************************/
#define K1 PORTB&=0X01;
#define K2 PORTB&=0X02;
#define K3 PORTB&=0X04;
#define K4 PORTB&=0X08;
/************a******t24c02读写地址********************************************************/
#define rd_device_add 0xa1
#define wr_device_add 0xa0
/***************************MT主式方式传输 MR主式方式接收***********************************/
#define START 0X08
#define RE_START 0X10
#define MT_SLA_ACK 0X18
#define MT_DATA_ACK 0X28
#define MT_DATA_NOACK 0X30
#define MR_SLA_ACK 0X40
#define MR_SLA_NOACK 0X48
#define MR_DATA_ACK 0x50
#define MR_DATA_NOACK 0X58
/************************常用TWI操作(主模式写和主模式读)************************************/
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN)) //产生START信号
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN)) //产生STOP信号
#define Wait() {while(!(TWCR&(1<<TWINT)));} //等待当前操作完成
#define TestACK() (TWSR&0xF8) //取出状态码
#define SetACK() (TWCR|=(1<<TWEA)) //产生ACK
#define SetNoAck() (TWCR&=~(1<<TWEA))
//#define Writebyte(twi_d) {TWDR=(twi_d);TWCR=(1<<TWINT)|(1<<TWEN);} //发送一个字节(twi_d为写入的数据)
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN)) //启动I2C读,返回noack
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);} //发送一个字节(twi_d为写入的数据)
//#define Twi_Ack() (TWCR=(1<<TWINT)|(1<<TWEN)|(1<<TWEA)) //启动I2C读,返回ack
unsigned char Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
unsigned char dispbit[8]={0x00,0x10,0x20,0x30,0x40,0x50,0x60,0x70}; //位选控制 查表的方法控制
unsigned int LedNumVal=10;
void port_init()
{
DDRA = 0XFF;
DDRC = 0XFC;
DDRB = 0X00;
PORTA = 0XFF;
PORTB = 0XFF;
PORTC = 0X00;
}
void twi_init(void)
{
TWBR=0X20;
TWSR=0;
//TWCR=0X44;
}
/******************************I2C总线写一个字节***************************************/
unsigned char i2c_Write(unsigned char RomAddress,unsigned char Wdata)
{
Start();
Wait();
if(TestACK()!=START)
return 1;
Write8Bit(wr_device_add);
Wait();
if(TestACK()!=MT_SLA_ACK)
return 1;
Write8Bit(RomAddress);
Wait();
if(TestACK()!=MT_DATA_ACK)
return 1;
Write8Bit(Wdata);
Wait();
if(TestACK()!=MT_DATA_ACK)
return 1;
Stop();
_delay_ms(10);
return 0;
}
/********************* I2C总线读一个字节*************************/
unsigned char i2c_Read(unsigned char RomAddress)
{
unsigned char temp;
Start();
Wait();
if (TestACK()!=START)
return 0;
Write8Bit(wr_device_add);
Wait();
if (TestACK()!=MT_SLA_ACK)
return 0;
Write8Bit(RomAddress);
Wait();
if (TestACK()!=MT_DATA_ACK)
return 0;
Start();
Wait();
if (TestACK()!=RE_START)
return 0;
Write8Bit(rd_device_add);
Wait();
if(TestACK()!=MR_SLA_ACK)
return 0;
Twi();
Wait();
if(TestACK()!=MR_DATA_NOACK)
return 0;
temp=TWDR;
Stop();
return temp;
}
void led_show(void)
{
unsigned char i;
unsigned char LEDOUT[4];
unsigned char LedNumVal;
i2c_Write(0x01,0x03);
i2c_Read(0x01);
LedNumVal=i2c_Read(0x01);
LEDOUT[0]=Disp_Tab[LedNumVal%10000/1000];
LEDOUT[1]=Disp_Tab[LedNumVal%1000/100];
LEDOUT[2]=Disp_Tab[LedNumVal%100/10];
LEDOUT[3]=Disp_Tab[LedNumVal%10];
/*LEDOUT[4]=Disp_Tab[LedNumVal2%10000/1000];
LEDOUT[5]=Disp_Tab[LedNumVal2%1000/100];
LEDOUT[6]=Disp_Tab[LedNumVal2%100/10];
LEDOUT[7]=Disp_Tab[LedNumVal2%10];*/
for (i=0;i<4;i++)
{
PORTC=dispbit[i];
PORTA=LEDOUT[i];
//PORTA=0x06;
_delay_ms(3);
}
}
int main(void)
{
port_init();
twi_init();
while(1)
{
led_show();
}
}
|