#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;
}
|