stm32f103VE使用固件库用软件IIC向ili9341写命令、写数据、读数据程序
时间: 2023-06-23 22:10:02 浏览: 127
以下是使用STM32固件库实现软件IIC向ILI9341写命令、写数据、读数据的程序。
首先,需要定义相关的引脚和时钟:
```c
#define SDA_PIN GPIO_Pin_7
#define SDA_PORT GPIOB
#define SCL_PIN GPIO_Pin_6
#define SCL_PORT GPIOB
#define I2C_SPEED 100000
#define I2C_TIMEOUT 1000
```
然后,需要初始化IIC总线:
```c
void I2C_init(void)
{
GPIO_InitTypeDef GPIO_InitStructure;
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB, ENABLE);
GPIO_InitStructure.GPIO_Pin = SDA_PIN;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_OD;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(SDA_PORT, &GPIO_InitStructure);
GPIO_InitStructure.GPIO_Pin = SCL_PIN;
GPIO_Init(SCL_PORT, &GPIO_InitStructure);
GPIO_SetBits(SDA_PORT, SDA_PIN);
GPIO_SetBits(SCL_PORT, SCL_PIN);
}
```
写命令和写数据的函数可以使用以下代码:
```c
void I2C_write_byte(uint8_t data)
{
uint8_t i;
GPIO_ResetBits(SCL_PORT, SCL_PIN);
for (i = 0; i < 8; i++)
{
if (data & 0x80)
GPIO_SetBits(SDA_PORT, SDA_PIN);
else
GPIO_ResetBits(SDA_PORT, SDA_PIN);
data <<= 1;
GPIO_SetBits(SCL_PORT, SCL_PIN);
GPIO_ResetBits(SCL_PORT, SCL_PIN);
}
}
void ILI9341_write_command(uint8_t cmd)
{
GPIO_ResetBits(SDA_PORT, SDA_PIN);
GPIO_SetBits(SCL_PORT, SCL_PIN);
GPIO_ResetBits(SCL_PORT, SCL_PIN);
I2C_write_byte(0x00);
I2C_write_byte(cmd);
}
void ILI9341_write_data(uint8_t data)
{
GPIO_ResetBits(SDA_PORT, SDA_PIN);
GPIO_SetBits(SCL_PORT, SCL_PIN);
GPIO_ResetBits(SCL_PORT, SCL_PIN);
I2C_write_byte(0x40);
I2C_write_byte(data);
}
```
读数据的函数可以使用以下代码:
```c
uint8_t ILI9341_read_data(void)
{
uint8_t data = 0;
uint8_t i;
GPIO_ResetBits(SCL_PORT, SCL_PIN);
GPIO_SetBits(SDA_PORT, SDA_PIN);
for (i = 0; i < 8; i++)
{
data <<= 1;
GPIO_SetBits(SCL_PORT, SCL_PIN);
if (GPIO_ReadInputDataBit(SDA_PORT, SDA_PIN))
data |= 0x01;
GPIO_ResetBits(SCL_PORT, SCL_PIN);
}
return data;
}
```
需要注意的是,ILI9341在读取数据时需要在写入数据之前发送一个读命令。下面是读取数据的完整函数:
```c
uint8_t ILI9341_read_byte(void)
{
uint8_t data;
GPIO_ResetBits(SDA_PORT, SDA_PIN);
GPIO_SetBits(SCL_PORT, SCL_PIN);
GPIO_ResetBits(SCL_PORT, SCL_PIN);
I2C_write_byte(0x00);
GPIO_SetBits(SDA_PORT, SDA_PIN);
GPIO_SetBits(SCL_PORT, SCL_PIN);
GPIO_ResetBits(SCL_PORT, SCL_PIN);
data = ILI9341_read_data();
return data;
}
```
这样,就可以使用软件IIC向ILI9341写命令、写数据、读数据了。
阅读全文