stm32通过iic驱动1602显示字符的程序怎么写
时间: 2023-12-22 21:04:09 浏览: 75
你好,以下是一份基于STM32通过IIC驱动1602显示字符的程序:
```
#include "stm32f10x.h"
#define SCL GPIO_Pin_8
#define SDA GPIO_Pin_9
#define SCL_H GPIO_SetBits(GPIOB,SCL)
#define SCL_L GPIO_ResetBits(GPIOB,SCL)
#define SDA_H GPIO_SetBits(GPIOB,SDA)
#define SDA_L GPIO_ResetBits(GPIOB,SDA)
void Delay_IIC()
{
Delay_us(1);
}
void Delay_us(u32 cnt)
{
u32 i=8*cnt;
while(i--)
{
__nop();
}
}
void IIC_Start()
{
SDA_H;
SCL_H;
Delay_IIC();
SDA_L;
Delay_IIC();
SCL_L;
Delay_IIC();
}
void IIC_Stop()
{
SDA_L;
SCL_H;
Delay_IIC();
SDA_H;
Delay_IIC();
}
u8 IIC_SendByte(u8 DataByte)
{
u8 i;
for (i=0; i<8; i++)
{
if (DataByte & 0x80)
{
SDA_H;
}
else
{
SDA_L;
}
DataByte <<= 1;
SCL_H;
Delay_IIC();
SCL_L;
Delay_IIC();
}
SDA_H;
SCL_H;
Delay_IIC();
if(GPIO_ReadInputDataBit(GPIOB,SDA)==SET) return 0;
else return 1;
}
void IIC_WriteCmd(u8 cmd)
{
IIC_Start();
IIC_SendByte(0x78); //写地址
if(!IIC_SendByte(0x00)) //写数据模式
{
IIC_Stop();
return;
}
IIC_SendByte(cmd); //写指令
IIC_Stop();
}
void IIC_WriteData(u8 Data)
{
IIC_Start();
IIC_SendByte(0x78); //写地址
if(!IIC_SendByte(0x40)) //写数据模式
{
IIC_Stop();
return;
}
IIC_SendByte(Data); //写数据
IIC_Stop();
}
void LCD_Init()
{
RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOB,ENABLE);
GPIO_InitTypeDef GPIO_InitStructure;
GPIO_InitStructure.GPIO_Pin = SCL | SDA;
GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;
GPIO_InitStructure.GPIO_Speed = GPIO_Speed_50MHz;
GPIO_Init(GPIOB, &GPIO_InitStructure);
Delay_us(50000);
IIC_WriteCmd(0x38); //8位总线,2线显示,5x8点阵
IIC_WriteCmd(0x08); //显示关闭
IIC_WriteCmd(0x01); //清屏
Delay_us(2000);
IIC_WriteCmd(0x06); //写入字符后地址+1
IIC_WriteCmd(0x0c); //显示开并闪烁关闭
}
void LCD_ShowChar(u8 X,u8 Y,u8 Data)
{
u8 HS,LS;
HS=Data>>4;
LS=Data<<4; LS>>4;
IIC_WriteCmd(0x80|X); //设定Y行X列
IIC_WriteData(HS);
IIC_WriteData(LS);
}
int main(void)
{
LCD_Init();
LCD_ShowChar(0,0,'H');
LCD_ShowChar(1,0,'e');
LCD_ShowChar(2,0,'l');
LCD_ShowChar(3,0,'l');
LCD_ShowChar(4,0,'o');
while(1);
}
```
注意:本程序仅供参考,请根据自己的需求进行修改和调试。
阅读全文