找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 284|回复: 6
打印 上一主题 下一主题
收起左侧

谁有Microchip MCP23016芯片的iic通信使用demo

[复制链接]
跳转到指定楼层
楼主
ID:982089 发表于 2024-8-21 18:17 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
如题,目前网上比较少MCP23016的实用demo,MCP23017 MCP23018应该也可以,C语言的最佳,谢谢!

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:796531 发表于 2024-8-22 08:56 | 只看该作者
前几年在某一个宝上卖的模块有提供资料

MCP23017 IIC接口16路IO扩展模块资料v1.0.7z

5.63 MB, 下载次数: 3

回复

使用道具 举报

板凳
ID:404160 发表于 2024-8-22 14:55 | 只看该作者
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include "i2c.h" // 假设你有一个i2c库

#define MCP23016_ADDRESS 0x20 // MCP23016的I2C地址,根据连接的引脚可能有所不同

// 函数声明
void initMCP23016(void);
void setPinMode(uint8_t pin, uint8_t mode);
void writePin(uint8_t pin, uint8_t value);
uint8_t readPin(uint8_t pin);

int main(void) {
    // 初始化I2C总线
    if (!i2c_init()) {
        printf("I2C initialization failed.\n");
        return 1;
    }

    // 初始化MCP23016
    initMCP23016();

    // 设置所有引脚为输出模式
    for (int i = 0; i < 16; i++) {
        setPinMode(i, 0x00); // 0x00 表示GPIO模式,0x01 表示输入模式
    }

    // 循环写入和读取引脚状态
    while (1) {
        // 将引脚0设置为高电平
        writePin(0, 1);
        // 延时一段时间
        i2c_delay_ms(1000);
        // 将引脚0设置为低电平
        writePin(0, 0);
        // 延时一段时间
        i2c_delay_ms(1000);
    }

    return 0;
}

void initMCP23016(void) {
    // 写入IODIR寄存器设置所有引脚为输入或输出模式
    i2c_write_byte(MCP23016_ADDRESS, 0x00, 0xFF); // 0xFF 表示所有引脚为输入模式
}

void setPinMode(uint8_t pin, uint8_t mode) {
    // 根据引脚号计算IOCON寄存器的位
    uint8_t reg = (pin < 8) ? 0x0A : 0x0B;
    uint8_t bit = (pin % 8);
    uint8_t value = i2c_read_byte(MCP23016_ADDRESS, reg);
    value = (mode == 0x00) ? (value & ~(1 << bit)) : (value | (1 << bit));
    i2c_write_byte(MCP23016_ADDRESS, reg, value);
}

void writePin(uint8_t pin, uint8_t value) {
    // 根据引脚号计算GPIO寄存器的位
    uint8_t reg = (pin < 8) ? 0x14 : 0x15;
    uint8_t value_read = i2c_read_byte(MCP23016_ADDRESS, reg);
    value_read = (value == 0x01) ? (value_read | (1 << pin)) : (value_read & ~(1 << pin));
    i2c_write_byte(MCP23016_ADDRESS, reg, value_read);
}

uint8_t readPin(uint8_t pin) {
    // 根据引脚号计算GPINTEN寄存器的位
    uint8_t reg = (pin < 8) ? 0x0C : 0x0D;
    uint8_t bit = (pin % 8);
    uint8_t value = i2c_read_byte(MCP23016_ADDRESS, reg);
    return (value >> bit) & 0x01;
}
回复

使用道具 举报

地板
ID:1047187 发表于 2024-8-22 17:24 | 只看该作者
回复

使用道具 举报

5#
ID:982089 发表于 2024-8-28 16:10 | 只看该作者
paladina 发表于 2024-8-22 08:56
前几年在某一个宝上卖的模块有提供资料

感谢!
回复

使用道具 举报

6#
ID:982089 发表于 2024-8-28 16:10 | 只看该作者
飞云居士 发表于 2024-8-22 14:55
#include
#include
#include

感谢!
回复

使用道具 举报

7#
ID:982089 发表于 2024-8-28 16:10 | 只看该作者
如果在冬夜 发表于 2024-8-22 17:24
https://blog.csdn.net/u012388993/article/details/106386381   看下这个链接

感谢!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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