⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cat1161.c.bak

📁 压缩包中包括多个常用的汇编
💻 BAK
字号:
/****************************************************************************/
/*                                                                          */
/*               Copyright (c) 2005, 老树工作室                             */
/*                   All rights reserved.                                   */
/*                                                                          */
/*      http://www.saintone.net      Email:hxm0902@163.com                  */
/*      QQ:112431149                 Tel:010-62966630                       */
/*                                                                          */
/****************************************************************************/
/****************************************************************************/
/* 文件名:cat1161.c                                                        */
/* 版  本:Version 1.0                                                      */
/* 描  述:cat1161的eeprom读写试验代码                                      */
/* 作  者:spot                                                             */
/* 函  数:                                                                 */
/*         iic_wait                                                         */
/*         iic_start                                                        */
/*         iic_stop                                                         */
/*         iic_ack                                                          */
/*         iic_no_ack                                                       */
/*         iic_wait_ack                                                     */
/*         iic_send_byte                                                    */
/*         iic_receive_byte                                                 */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
#include <reg52.h>
#include <absacc.h>
#include <intrins.h>
#include "../includes/types.h"

sbit SDA = P0^5;           /* iic数据传送位 */
sbit SCL = P0^4;           /* iic时钟控制位 */

/* 函数声明 */
void iic_wait(void);       /* iic延时       */
void iic_start(void);      /* 开启iic总线   */
void iic_stop(void);       /* 关闭iic总线   */
void iic_ack(void);        /* 发送ACK信号   */
void iic_no_ack(void);     /* 发送NOACK信号 */
bit iic_wait_ack(void);    /* 等待ACK信号   */
void iic_send_byte(u_char demand);               /* MCU向iic设备发送一个字节 */
u_char iic_receive_byte(void);                   /* MCU从iic设备接收一个字节 */
void write_iic_data(u_char write_data[], u_char address, u_char num); /* 向iic设备写入N个字节 */
void read_iic_data(u_char read_data[], u_char address, u_char num);   /* 从iic设备读取N个字节 */
/* 声明结束 */

/* iic延时       */
void iic_wait(void)
{
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
    _nop_();
}

/* 开启iic总线   */
void iic_start(void)
{
    SDA = 1;
    SCL = 1;
    iic_wait();
    SDA = 0;
    iic_wait();
    SCL = 0;
}

/* 关闭iic总线   */
void iic_stop(void)
{
    SDA=0;
    SCL=0;
    iic_wait();
    SCL=1;
    iic_wait();
    SDA=1;
}

/* 发送ACK信号   */
void iic_ack(void)
{
    SDA=0;
    iic_wait();
    SCL=1;
    iic_wait();
    SCL=0;
}

/* 发送NOACK信号 */
void iic_no_ack(void)
{
    SDA=1;
    iic_wait();
    SCL=1;
    iic_wait();
    SCL=0;
}

/****************************************************************************/
/* 函数名:iic_wait_ack                                                     */
/* 功  能:等待ACK信号                                                      */
/* 作  者:spot                                                             */
/* 输  入:无                                                               */
/* 输  出:1-ACK         0-ERROR                                            */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
bit iic_wait_ack(void)
{
    u_char errtime=255;

    SDA=1;
    iic_wait();
    SCL=1;
    iic_wait();

    while(SDA)
    {
        errtime--;
        if(!errtime)
            return 0;
    }

    SCL=0;
    return 1;
}

/****************************************************************************/
/* 函数名:iic_send_byte                                                    */
/* 功  能:MCU向iic设备发送一个字节                                         */
/* 作  者:spot                                                             */
/* 输  入:                                                                 */
/*         sbyte                  待发送的字节数据                          */
/*                                                                          */
/* 输  出:无                                                               */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
void iic_send_byte(u_char sbyte)
{
    u_char i = 8;

    while(i--)
    {
        SCL = 0;
        _nop_();
        SDA = (bit)(sbyte&0x80);
        sbyte <<= 1;
        iic_wait();
        SCL = 1;
        iic_wait();
    }

    SCL=0;
}

/****************************************************************************/
/* 函数名:iic_receive_byte                                                 */
/* 功  能:MCU从iic设备接收一个字节                                         */
/* 作  者:spot                                                             */
/* 输  入:无                                                               */
/* 输  出:ddata   接收数据                                                 */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
u_char iic_receive_byte(void)
{
    u_char i=8;
    u_char ddata=0;

    SDA=1;
    while(i--)
    {
        ddata <<= 1;
        SCL=0;
        iic_wait();
        SCL=1;
        iic_wait();
        ddata |= SDA;
    }
    SCL=0;
    return ddata;
}

/****************************************************************************/
/* 函数名:write_iic_data                                                   */
/* 功  能:向iic设备写入N个字节                                             */
/* 作  者:spot                                                             */
/* 输  入:                                                                 */
/*         write_data              存放写入字节的数组                       */
/*         address                 指定从address处开始写入                  */
/*         num                     写入的字节数                             */
/*                                                                          */
/* 输  出:无                                                               */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
void write_iic_data(u_char write_data[], u_char address, u_char num)
{
    u_char n;

    iic_start();
    iic_send_byte(0xa0);
    iic_wait_ack();
    iic_send_byte(address);
    iic_wait_ack();

    for(n=0; n<num; n++)
    {
        iic_send_byte(write_data[n]);
        iic_wait_ack();
    }

    iic_stop();
}

/****************************************************************************/
/* 函数名:read_iic_data                                                    */
/* 功  能:从iic设备读取N个字节                                             */
/* 作  者:spot                                                             */
/* 输  入:                                                                 */
/*         read_data               存放读取字节的数组                       */
/*         address                 指定从address处开始读取                  */
/*         num                     读取的字节数                             */
/*                                                                          */
/* 输  出:无                                                               */
/*                                                                          */
/* 历史记录:                                                               */
/*  spot          2005-06-20     Creat Inital version. (Version 1.0)        */
/****************************************************************************/
void read_iic_data(u_char read_data[], u_char address, u_char num)
{
    u_char n;

    iic_start();
    iic_send_byte(0xa0);
    iic_wait_ack();
    iic_send_byte(address);
    iic_wait_ack();

    iic_start();
    iic_send_byte(0xa1);
    iic_wait_ack();

    for (n=0; n<num; n++)
    {
    	read_data[n] = iic_receive_byte();

    	if (n != (num - 1))     /* 最后一个数据不应答 */
    	{
    	    iic_ack();
    	}
    }

    iic_no_ack();
    iic_stop();
}

main()
{
    u_char test_write[16];
    u_char test_read[16];
    u_int i;

    /* 单步调试,可以观看写入数据与读出数据结果 */
    while(1)
    {
    	for (i=0; i<16; i++)
    	{
    	    test_read[i]  = 0;
            test_write[i] = i;
    	}
    	write_iic_data(test_write, 0, 16);
       
        read_iic_data(test_read, 0, 16);

    	for (i=0; i<16; i++)
    	{
    	    test_write[i] = i + 16;
    	    test_read[i]  = 0;
    	}
    	write_iic_data(test_write, 16, 16);
       
    	read_iic_data(test_read, 16, 16);
    	read_iic_data(test_read, 0, 16);
    }
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -