搜索
bottom↓
回复: 0

iic仿真不出来,求大神指导

[复制链接]

出0入0汤圆

发表于 2013-9-26 20:08:53 | 显示全部楼层 |阅读模式
#include<iom16v.h>
#include<macros.h>
#include"main.h"

#define SDA_H   (PORTC|=0x02)
#define SDA_L        (PORTC&=0xFD)
#define SCL_H        (PORTC|=0x01)
#define SCL_L        (PORTC&=0xFE)
#define SDA_OUT   (DDRC|=0x02)
#define SDA_IN             (DDRC&=0xFD)
#define SCL_OUT           (DDRC|=0x01)
#define SDA_CHK    (PINC&0x02)
#define DEV_ADDR  0xA0




void init_IIC(void)
{
         SDA_OUT;
         SCL_OUT;
         SDA_H;
         delay_us(1);
         SCL_H;
         delay_us(1);
}


void IIC_start(void)
{
         SDA_H;
         delay_us(1);
         SCL_H;
         delay_us(1);
         SDA_L;
         delay_us(1);
         
}


void IIC_stop(void)
{
         SDA_L;
         delay_us(1);
         SCL_H;
         delay_us(1);
         SDA_H;
         delay_us(1);
         
}


void IIC_ack(void)
{
         uchar i=0;
         
         SCL_L;
         delay_us(1);
         SDA_IN;
         delay_us(1);
         SCL_H;
         
         while((0!=SDA_CHK)&&(i<250))
         {
                          i++;
                        _NOP();
         }
         SCL_L;
         SDA_OUT;
         delay_us(1);
         SDA_H;
         delay_us(1);
}


void IIC_noack(void)
{
         SDA_H;
         delay_us(1);
         SCL_H;
         delay_us(1);
         SCL_L;
         delay_us(1);
}

void IIC_write_byte(uchar dat)
{
         uchar i,tmp;
         tmp=dat;
         
         for(i=0;i<8;i++)
         {
                          SCL_L;
                        delay_us(1);
                        if(tmp&0x80)
                        {
                                         SDA_H;
                        }else
                        {
                                          SDA_L;
                        }
                        tmp<<1;
                        delay_us(1);
                        SCL_H;
                        delay_us(1);
                       
         }
         SCL_L;
         delay_us(1);
         SDA_H;
         delay_us(1);
         
}


uchar IIC_read_byte(void)
{
                  uchar i,dat;
               
                SCL_L;
                delay_us(1);
                SDA_IN;
                delay_us(1);
                for(i=0;i<8;i++)
                {
                                 SCL_H;
                                delay_us(1);
                                dat=dat<<1;
                                if(0!=SDA_CHK)
                                {
                                                 dat++;
                                }
                                SCL_L;
                                delay_us(1);
                               
                }
                SDA_OUT;
                delay_us(1);
                return(dat);
}


void write_IIC(uchar addr,uchar dat)
{
         IIC_start();
         IIC_write_byte(DEV_ADDR);
         IIC_ack();
         IIC_write_byte(addr);
         IIC_ack();
         IIC_write_byte(dat);
         IIC_ack();
         IIC_stop();
         
}

uchar read_IIC(uchar addr)
{
          uchar tmp=0;
          
          
          IIC_start();
          IIC_write_byte(DEV_ADDR);
          IIC_write_byte(addr);
          IIC_ack();
          IIC_start();
          IIC_write_byte(DEV_ADDR+1);
          IIC_ack();
          tmp=IIC_read_byte();
          IIC_noack();
          IIC_stop();
          return(tmp);
          
}


#include<iom16v.h>
#include<macros.h>
#include"main.h"
#include"delay.h"
#include"iic.h"

#define DAT_ADDR  0x03
uchar g_ucdat;


void display(uchar dat)
{
         PORTA=1;
         PORTB=(dat%10);
         delay_ms(5);
         PORTA=2;
         PORTB=(dat/10);
         delay_ms(5);
}



#pragma interrupt_handler int0_isr:iv_INT0
void int0_isr(void)
{
         g_ucdat++;
}



void port_init(void)
{
         DDRA=0xFF;
         PORTA=0xFF;
         DDRB=0xFF;
         PORTB=0xFF;
         DDRC=0xFF;
         PORTC=0xFF;
         DDRD=0xF0;
         PORTD=0xFF;
         
}



void main(void)
{
         uchar tmp=0;
         g_ucdat=0;
         
         CLI();
         port_init();
         init_IIC();
         
         
         MCUCR=0x02;
         GICR=0x40;
         TIMSK=0x00;
         SEI();
         
         
         tmp=read_IIC(DAT_ADDR);
         if(tmp==0xFF)
         {
                          tmp=1;
                        write_IIC(DAT_ADDR,tmp);
                        delay_ms(10);
                       
         }
         g_ucdat=tmp;
         
         while(1)
         {
                           if(tmp!=g_ucdat)
                         {
                                          if(g_ucdat>99)
                                        {
                                                         g_ucdat=0;
                                        }
                                        tmp=g_ucdat;
                                        write_IIC(DAT_ADDR,tmp);
                                       
                         }
         }
         display(tmp);
}

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-27 00:15

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表