I2C学习之STC15F204EA---GPIO端口模拟--简单控制PCF8574AT

发布者:梅花居士最新更新时间:2017-11-29 来源: eefocus关键字:I2C  STC15F204EA  GPIO  端口模拟  PCF8574AT 手机看文章 扫描二维码
随时随地手机看文章

一定要记得加4.7K左右的上拉电阻----与器件类型不同导致的地址不一样!


------------------------------------------------------i2c.h----------头文件-----------------------

#ifndef __I2C_H
#define __I2C_H

#define I2C_SCL_1()  P32=1 //SCL = 1 
#define I2C_SCL_0()  P32=0 //SCL = 0  

#define I2C_SDA_1()  P33=1 //SDA = 1 
#define I2C_SDA_0()  P33=0 //SDA = 0 

#define I2C_SDA_READ()  (P33 != 0)//读SDA口线状态 

void i2c_Start(void);
void i2c_Stop(void);
void i2c_SendByte(unsigned char _ucByte);
unsigned char i2c_ReadByte(void);
unsigned char i2c_WaitAck(void);
void i2c_Ack(void);
void i2c_NAck(void);

unsigned char I2C_PCF8574_ByteWrite(unsigned char _pWriteBuf, unsigned char _usAddress);

#endif

------------------------------------------i2c.c--------------源文件-----------------------

#include "typedef.h"       //包含一些基本头文件
#include "i2c.h"

static void i2c_Delay(void)
{
    unsigned char i;

    for (i = 0; i < 10; i++);
}
void i2c_Start(void)
{
//当SCL高电平时,SDA出现一个下跳沿表示I2C总线启动信号 
    I2C_SDA_1();
    I2C_SCL_1();
    i2c_Delay();
    I2C_SDA_0();
    i2c_Delay();
    I2C_SCL_0();
    i2c_Delay();
}
void i2c_Stop(void)
{
// 当SCL高电平时,SDA出现一个上跳沿表示I2C总线停止信号 
    I2C_SDA_0();
    I2C_SCL_1();
    i2c_Delay();
    I2C_SDA_1();
}
void i2c_SendByte(unsigned char _ucByte)
{
    unsigned char i;

// 先发送字节的高位bit7  
    for (i = 0; i < 8; i++)
    {
        if (_ucByte & 0x80)
        {
            I2C_SDA_1();
        }
        else
        {
            I2C_SDA_0();
        }
        i2c_Delay();
        I2C_SCL_1();
        i2c_Delay();
        I2C_SCL_0();
        if (i == 7)
        {
            I2C_SDA_1(); // 释放总线
        }
        _ucByte <<= 1;// 左移一个bit  
        i2c_Delay();
    }
}
unsigned char i2c_ReadByte(void)
{
    unsigned char i;
    unsigned char value;

// 读到第1个bit为数据的bit7 
    value = 0;
    for (i = 0; i < 8; i++)
    {
        value <<= 1;
        I2C_SCL_1();
        i2c_Delay();
        if (I2C_SDA_READ())
        {
            value++;
        }
        I2C_SCL_0();
        i2c_Delay();
    }
    return value;
}
/*
*********************************************************************************************************
* 函 数 名: i2c_WaitAck
* 功能说明: CPU产生一个时钟,并读取器件的ACK应答信号
* 形    参:无
* 返 回 值: 返回0表示正确应答,1表示无器件响应
*********************************************************************************************************
*/
unsigned char i2c_WaitAck(void)
{
    unsigned char re;

    I2C_SDA_1();/* CPU释放SDA总线 */
    i2c_Delay();
    I2C_SCL_1();/* CPU驱动SCL = 1, 此时器件会返回ACK应答 */
    i2c_Delay();
    if (I2C_SDA_READ())/* CPU读取SDA口线状态 */
    {
        re = 1;
    }
    else
    {
        re = 0;
    }
    I2C_SCL_0();
    i2c_Delay();
    return re;
}
/*
*********************************************************************************************************
* 函 数 名: i2c_Ack
* 功能说明: CPU产生一个ACK信号
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_Ack(void)
{
    I2C_SDA_0();// CPU驱动SDA = 0  
    i2c_Delay();
    I2C_SCL_1();// CPU产生1个时钟  
    i2c_Delay();
    I2C_SCL_0();
    i2c_Delay();
    I2C_SDA_1();// CPU释放SDA总线 
}
/*
*********************************************************************************************************
* 函 数 名: i2c_NAck
* 功能说明: CPU产生1个NACK信号
* 形    参:无
* 返 回 值: 无
*********************************************************************************************************
*/
void i2c_NAck(void)
{
    I2C_SDA_1();// CPU驱动SDA = 1  
    i2c_Delay();
    I2C_SCL_1();// CPU产生1个时钟  
    i2c_Delay();
    I2C_SCL_0();
    i2c_Delay();
}
unsigned char I2C_PCF8574_ByteWrite(unsigned char _pWriteBuf, unsigned char _usAddress)
{
    unsigned char m;
    unsigned char usAddr;

    usAddr = _usAddress;
    i2c_Stop();
    for (m = 0; m < 100; m++)
    {
        i2c_Start();
        i2c_SendByte(usAddr);// 此处是写指令 
        if (i2c_WaitAck() == 0)
            break;
    }
    if (m  == 100)
    goto cmd_fail;// 器件写超时 
    i2c_SendByte(_pWriteBuf);
        if (i2c_WaitAck() != 0)
    goto cmd_fail;//器件无应答 

//命令执行成功,发送I2C总线停止信号 
    i2c_Stop();
    return 1;

cmd_fail: //命令执行失败后,切记发送停止信号,避免影响I2C总线上其他设备 
    i2c_Stop();//发送I2C总线停止信号
    return 0;
}

-----------------------------------main.c----------主函数---------------------

#include "typedef.h"
#include "i2c.h"

void main(void)
{
    while(1)
    {
        I2C_PCF8574_ByteWrite(0xaa,0x72);
        i=200;
        while(i--);

        I2C_PCF8574_ByteWrite(0xf3,0x70);

        i=200;
        while(i--);             

    }

}





关键字:I2C  STC15F204EA  GPIO  端口模拟  PCF8574AT 引用地址:I2C学习之STC15F204EA---GPIO端口模拟--简单控制PCF8574AT

上一篇:四个按键对常用数值调整代码
下一篇:初次下载STC15F204EA遇到的失败问题

推荐阅读最新更新时间:2024-03-16 15:47

STM8L学习笔记-GPIO端口操作(一)
STM8与STM32一样提供了固件库函数,不过没有STM32的库完善,给的说明文档是chm格式的,名字是stm8l15x_stdperiph_lib_um.chm,这个官网有下载. GPIO寄存器有: 输出寄存器(ODR), 输入寄存器(IDR), 方向寄存器(DDR), 控制寄存器1(CR1), 控制寄存器2(CR2); 后面三个寄存器组和可以配置为8种GPIO的模式. 而固件库函数给出了8种模式,在上面的基础上加入了输出高/输出低电平的状态。 GPIO_Mode_In_FL_No_IT浮空输入无中断 GPIO_Mode_In_PU_No_I上拉输入无中断 GPIO_Mode_In_FL_IT 浮空输入
[单片机]
STM32的八种GPIO工作方式详解
STM32的GPIO介绍 STM32引脚说明 GPIO是通用输入/输出端口的简称,是STM32可控制的引脚。GPIO的引脚与外部硬件设备连接,可实现与外部通讯、控制外部硬件或者采集外部硬件数据的功能。 STM32F103ZET6芯片为144脚芯片,包括7个通用目的的输入/输出口(GPIO)组,分别为GPIOA、GPIOB、GPIOC、GPIOD、GPIOE、GPIOF、GPIOG,同时每组GPIO口组有16个GPIO口。通常简略称为PAx、PBx、PCx、PDx、PEx、PFx、PGx,其中x为0-15。 STM32的大部分引脚除了当GPIO使用之外,还可以复用位外设功能引脚(比如串口),这部分在【STM32】STM32端
[单片机]
STM32的八种<font color='red'>GPIO</font>工作方式详解
单片机模拟I2C总线通信的几个关键程序
I2C总线由数据线SDA和时钟线SCL两条线构成通信线路,既可以发送数据,也可以接收数据。以下为单片机模拟I2C总线通信的几个关键程序: 1、总线初始化 void main() { SCl=1; delay(); SDA=1; delay(); } //将总线都拉高以释放总线 2、启动信号 void start() { SDA=1; delay(); SCL=1; delay(); SDA=0; delay(); } //SCL在高电平期间,SDA一个下降沿启动信号 3、应答信号 void respons() { uchar i=0; SCL=1; dela
[单片机]
TI - MCU - MSP430使用指南12 -> GPIO
GPIO即通用输入输出接口,是MCU最基本的功能,可以控制I/O口的高低电平,输入输出或映射到其他模块等功能。 如下图所示,为MSP430FR2355芯片的引脚图: 在图中,每个引脚后标注的则是每个引脚具备的复用功能,GPIO是基本功能,除去电源,地,时钟等引脚,每个引脚都可作为通用IO口使用,那么如何按照自己的要求配置每个引脚的功能呢? 下面就描述下GPIO引脚相关的寄存器(MSP430FR2xx/FR4xx): 注:并非每个MSP430 MCU都包含下属所有的寄存器,根据MCU功能的复杂性决定,具体包含的寄存器名称和数量,请查看每个芯片的datasheet和user’s guide。 首先先整体看一下GP
[单片机]
TI - MCU - MSP430使用指南12 -> <font color='red'>GPIO</font>
I2C接口进入busy状态不能退出
问题:该问题发生在 STM32F103VDT6 器件上。在其产品设计中,使用了 STM32 的一个 I2C 接口与一个 EEPROM 通信。在系统靠性测试中发现,经过长时间运行后,STM32 会出现不能读写 EEPROM 的现象。通过 NRST 管脚对 STM32 进行复位,复位后该现象依旧存在。关掉电源,然后重新上电,现象消失。通过进一步测试发现,如果对 STM32反复做复位操作,会很容易复现 这一现象。 调研:修改软件,通过打印监控 I2C 通信程序的流程,及 I2C 接口的各个寄存器的状态。当出现上述现象时,I2C接口的状态寄存器 SR2中的 Busy 位置‘1’,状态寄存器 SR1 中的 ARLO 位置‘1’。用示波
[嵌入式]
在Proteus 6.9中调试I2C设备的方法
刚开始调试TWI总线与AT24C02连接时,因为我是第1次以硬件的方式实现I2C,因此走了几天的弯路。今天完全调试通了。写些调试经验,省得以后有人继续走弯路。 可以这么说,利用Proteus调试I2C还是很方便的,比如在图纸上连接好MEGA8和AT24C02后,如果要看I2C调试情况,可以用两种方法: 第1种方法是在I2C总线上多连接一个I2C Debugger仪器,在仿真调试期中,该仪器可以显示I2C数据传送时间、S(START状态)、Sr(ReStart状态)、A(Ask响应)、N (No ask状态)、P(Stop状态)、数据(同时显示数据的16进制值和每位的值)。通过查看I2C Debugger窗口的显示,可以知道
[单片机]
PIC单片机I2C的应用(24LC02)
I2C总线特点 I2C总线最主要的优点是其简单性和有效性。由于接口直接在组件之上,因此I2C总线占用的空间非常小,减少了电路板的空间和芯片管脚的数量,降低了互联成本。总线的长度可高达25英尺,并且能够以10Kbps的最大传输速率支持40个组件。I2C总线的另一个优点是,它支持多主控(multimastering), 其中任何能够进行发送和接收的设备都可以成为主总线。一个主控能够控制信号的传输和时钟频率。当然,在任何时间点上只能有一个主控。 2 I2C总线工作原理 I2C总线上的数据稳定规则,SCL为高电平时SDA上的数据保持稳定,SCL为低电平时允许SDA变化。如果SCL处于高电平时,SDA上产生下降沿,则认为是起始位,
[单片机]
PIC单片机<font color='red'>I2C</font>的应用(24LC02)
TI新推三款4通道I2C与SMBus多路复用器及开关产品
德州仪器(TI)日前宣布推出三款全新的4位双向转换(电平转换)I2C、SMBus多路复用器与开关,即PCA9544A、PCA9545A与PCA9546A。三款器件均支持2.5V、3.3V与5V总线之间的电压电平转换,这对混合电压I2C系统来说是必不可少的。 由于计算与便携式电子产品等多种系统应用逐渐采用日益盛行的I2C双线通信总线标准,因而能够支持混合电压I2C系统的I2C与SMBus兼容型多路复用器及开关变得越来越重要。TI全新的4通道双向开关由I2C总线控制,可支持2.5V、3.3V与5V总线之间的电压接口。每个上游通道(SCL/SDA)扇出至4个下游通道,其中根据可编程控制寄存器的容量大小能够对单个SCn/SDn通道或通道
[新品]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 学习ARM开发(16)
    ARM有很多东西要学习,那么中断,就肯定是需要学习的东西。自从CPU引入中断以来,才真正地进入多任务系统工作,并且大大提高了工作效率。采 ...
  • 学习ARM开发(17)
    因为嵌入式系统里全部要使用中断的,那么我的S3C44B0怎么样中断流程呢?那我就需要了解整个流程了。要深入了解,最好的方法,就是去写程序 ...
  • 学习ARM开发(18)
    上一次已经了解ARM的中断处理过程,并且可以设置中断函数,那么它这样就可以工作了吗?答案是否定的。因为S3C44B0还有好几个寄存器是控制中 ...
  • 嵌入式系统调试仿真工具
    嵌入式硬件系统设计出来后就要进行调试,不管是硬件调试还是软件调试或者程序固化,都需要用到调试仿真工具。 随着处理器新品种、新 ...
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
  • 学习ARM开发(2)
  • 学习ARM开发(4)
  • 学习ARM开发(6)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved