本帖最后由 lingzijue 于 2013-6-24 21:35 编辑
大家帮忙看一下什么问题 仿真没有问题 但是实物不行 整的老郁闷了 高手给找找原因
#include <iom16v.h>
#include<macros.h>
#define uchar unsigned char
#define uint unsigned int
#define START 0X08 //start已成功发送
#define RESTART 0X10 //restart已成功发送
#define MT_SLA_ACK 0X18 //加载数据已发送ack
#define MT_SLA_NACK 0X20 //加载数据已发送nack
#define MT_DAT_ACK 0X28 //数据已发送ack
#define MT_DAT_NACK 0X30 //数据已发送nack
#define SL_SLA_ACK 0X40 //从机数据已加载发送ack
#define SL_SLA_NACK 0X48 //从机数据已加载发送nack
#define SL_DAT_ACK 0X50 //从机数据已发送ack
#define SL_DAT_NACK 0X58 //从机数据已发送nack
#define start() TWCR=BIT(TWINT)|BIT(TWSTA)|BIT(TWEN) //发送开始信号
#define restart() TWCR=BIT(TWINT)|BIT(TWEN)|BIT(TWSTA) //发送重新开始信号
#define wait() while(!(TWCR&(BIT(TWINT)))) //等待信号
#define state() (TWSR&0XF8) //寄存器TWSR状态提取
#define stop() TWCR=BIT(TWEN)|BIT(TWINT)|BIT(TWSTO) //停止信号
#define writebyte(temp) {TWDR=(temp);TWCR=BIT(TWINT)|BIT(TWEN);} //写数据
#define r_direction 0xa1 //读的器件地址
#define w_direction 0xa0 //写的器件地址
#define jia() ((PIND&0X01)==0X00)
#define jian() ((PIND&0X02)==0X00)
#define xie() ((PIND&0X04)==0X00)
#define du() ((PIND&0X08)==0X00)
__flash uchar Disp_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x40}; //段码控制
//此表为8个数码管位选控制, 共阴数码管 1-8个 -
__flash uchar dispbit[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdF,0xbF,0x7F};
uchar table[]={0,0,0,0};
uint b=0;
void delay(uint n)//延时1毫秒
{
uint i,j;
for(i=0;i<n;i++)
for(j=0;j<1141;j++);
}
//显示函数
void display()
{
uint i,s;
s=b;
table[0]=s/1000;
table[1]=s%1000/100;
table[2]=s%100%100/10;
table[3]=s%1000%100%10;
for(i=0;i<4;i++)
{
PORTA=Disp_Tab[table];
PORTB=dispbit;
delay(5);
PORTA=0x00;
}
}
uchar write_data(uchar dat,uchar addr) //向iic写数据
{
start();
wait();
if(state()!=START)
return 1;
writebyte(w_direction);
wait();
if(state()!=MT_SLA_ACK)
return 1;
writebyte(addr);
wait();
if(state()!=MT_DAT_ACK)
return 1;
writebyte(dat);
wait();
if(state()!=MT_DAT_ACK)
return 1;
delay(10);
stop();
return 0;
}
uchar read_data(uchar addr) //从iic中读取数据
{
uchar temp;
start();
wait();
delay(10);
if(state()!=START)
return 11;
writebyte(w_direction);
wait();
if(state()!=MT_SLA_ACK)
return 1;
writebyte(addr);
wait();
if(state()!=MT_DAT_ACK)
return 1;
restart();
wait();
if(state()!=RESTART)
return 1;
writebyte(r_direction);
wait();
if(state()!=SL_SLA_ACK)
return 1;
TWCR=BIT(TWINT)|BIT(TWEN);
wait();
if(state()!=SL_DAT_NACK)
return 1;
temp=TWDR;
delay(10);
stop();
return temp;
}
//端口初始化
void smg_init(void)
{
DDRC=0Xff;
PORTC=0Xff;
DDRA=0Xff;
PORTA=0Xff;
DDRB=0Xff;
PORTB=0Xff;
DDRD=0X00;
PORTD=0Xff;
}
void twi_init() //twi的初始化
{
TWCR=0X44; //启动twi功能
TWBR=0X20; //设置波特率为主机模式
TWSR=0; //清空状态寄存器
}
void main(void)
{
smg_init();
twi_init();
while(1)
{
key();
display();
}
}
void key()
{
uchar i;
if(jia())
{
b++;
}
if(jian())
{
b--;
}
if(xie())
{
write_data(b,0x05);
}
if(du())
{
b=read_data(0x05);
}
} |