📄 ac15-3.c
字号:
#include <iom8v.h>
#include <macros.h>
//-----------------------------------------------
#define uchar unsigned char
#define uint unsigned int
//TWI状态定义
//MT 主方式传输 MR 主方式接收
#define START 0x08
#define RE_START 0x10
#define MT_SLA_ACK 0x18
#define MT_SLA_NOACK 0x20
#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
#define rd_device_add 0xa1
#define wr_device_add 0xa0
#define DS12_CONTROL_PORT PORTB
#define CS PB3
#define CS_ON() ( DS12_CONTROL_PORT &= ~(1<<CS) )
#define CS_OFF() ( DS12_CONTROL_PORT |= (1<<CS) )
//常用TWI操作(主模式写和主模式读)
#define Start() (TWCR=(1<<TWINT)|(1<<TWSTA)|(1<<TWEN))
#define Stop() (TWCR=(1<<TWINT)|(1<<TWSTO)|(1<<TWEN))
#define Wait() {while(!(TWCR&(1<<TWINT)));}
#define TestAck() (TWSR&0xf8)
#define SetAck() (TWCR|=(1<<TWEA))
#define SetNoAck() (TWCR&=~(1<<TWEA))
#define Twi() (TWCR=(1<<TWINT)|(1<<TWEN))
#define Write8Bit(x) {TWDR=(x);TWCR=(1<<TWINT)|(1<<TWEN);}
#define xtal 8
flash unsigned char dis_7[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90};
flash unsigned char position[]={0x10,0x20};
unsigned char dis_buff[2]={0,0},posit;
//========函数声明=========
void port_init(void);
void delay_ms(unsigned int time);
void delay_us(int time);
//=======================
void Delay_2us()
{
NOP();NOP();NOP();
}
void _delay_us(unsigned int xus)
{
while (xus--)
Delay_2us();
}
void delay_ms(unsigned int xms) //crystal=8MHz
{
unsigned int i,j; //variable:declare Word
for(i=0; i<xms; i++)
for(j=0; j<498;j++)
{
NOP();NOP();NOP();NOP();
NOP();NOP();NOP();NOP();NOP();
}
}
void display(unsigned char adc1) // 2 位LED 数码管动态扫描函数
{
dis_buff[1]=adc1 /10;
dis_buff[0]=adc1 %10;
//PORTB = 0x00;
for(posit=0; posit<2;posit++)
{
PORTD = dis_7[dis_buff[posit]];
PORTB = position[posit];
_delay_us(100);
//PORTB &= ~position[posit];
}
}
/********************端口初始化******************/
void port_init(void)
{
//PORTA = 0x00;
//DDRA = 0xFF;
// PORTB = 0x00;
DDRB = 0xFF;
// PORTC = 0x00;
DDRC = 0x30;
// PORTD = 0xFF;
DDRD = 0xFF;
}
/******************************************
I2C总线读一个字节
如果读失败返回0
*******************************************/
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;
}
/******************************************
I2C总线写一个字节
返回0:写成功
返回非0:写失败
*******************************************/
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;
}
void twi_init(void)
{
TWCR= 0X00; //disable twi
TWBR= 0x12; //set bit rate
TWSR= 0x01; //set prescale
TWCR= 0x04; //enable twi
}
//******************************************
void main(void)
{
uchar key_val,wr_val=0,rd_val,i,j;
uint k;
port_init();
CS_OFF();
delay_ms(10);
delay_ms(10);
//twi_init();
while(1)
{
rd_val=12;
//for(i=1; i<255;i++)
//{
// i2c_Write(i,i);
// _delay_us(20);
//adc_to_disbuffer1(16);
//
//}
for( j=1; j<255;j++)
{
for( k=1; k<1025;k++)
{
rd_val=i2c_Read(j);
display(rd_val);
//delay_ms(1);
// _delay_us(5);
}
}
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -