HC32F460,硬件IIC驱动OLED

关于OLED的具体介绍可参考STM32-OLED屏幕显示教程_stm32 oled_LJX的博客-CSDN博客

这里只贴了HC32F460的代码

首先是IIC初始化

static en_result_t Master_Initialize(void)
{
    en_result_t enRet;
    stc_i2c_init_t stcI2cInit;
    float32_t fErr;

    I2C_DeInit(I2C_UNIT);

    MEM_ZERO_STRUCT(stcI2cInit);
    stcI2cInit.u32ClockDiv = I2C_CLK_DIV2;
    stcI2cInit.u32Baudrate = I2C_BAUDRATE;
    stcI2cInit.u32SclTime = 0ul;
    enRet = I2C_Init(I2C_UNIT, &stcI2cInit, &fErr);

    I2C_BusWaitCmd(I2C_UNIT, Enable);

    return enRet;
}

接着是写OLED的函数,这里主要是注意写地址那是0X3C,而网上一般是说地址是0X78,我也就是这里卡了很久。

实际上地址只有七位,其中一位是读/写,也就是0X78的第一位其实不是地址,而是写。所以实际地址是0X3C,且HC32F460底层的I2C_TransAddr有对这个进行处理,也就要填实际的地址,不带最后的读/写,读/写由I2CDirTrans来控制。

static en_result_t OLED_WR_Byte(uint8_t *pu8TxData)
{
    en_result_t enRet;
    I2C_Cmd(I2C_UNIT, Enable);

    I2C_SoftwareResetCmd(I2C_UNIT, Enable);
    I2C_SoftwareResetCmd(I2C_UNIT, Disable);
    enRet = I2C_Start(I2C_UNIT,TIMEOUT);        //START
    if(Ok == enRet)
    {

        enRet = I2C_TransAddr(I2C_UNIT, (uint8_t)0x3C, I2CDirTrans, TIMEOUT);//地址

        if(Ok == enRet)
        {
            enRet = I2C_TransData(I2C_UNIT, pu8TxData, 2,TIMEOUT);
        }
        
        if(Ok != enRet)
        {
            I2C_Stop(I2C_UNIT,TIMEOUT);
            I2C_SoftwareResetCmd(I2C_UNIT, Enable);
            I2C_SoftwareResetCmd(I2C_UNIT, Disable);
        }
    }

    I2C_Stop(I2C_UNIT,TIMEOUT);
    I2C_Cmd(I2C_UNIT, Disable);

    return enRet;
}
void WriteCmd(int8_t dat)
{
    uint8_t u8TxBuf[2];
    u8TxBuf[0]=0x00;
    u8TxBuf[1]=dat;
    OLED_WR_Byte(u8TxBuf);
}

void WriteDat(int8_t dat)
{
    uint8_t u8TxBuf[2];
    u8TxBuf[0]=0x40;
    u8TxBuf[1]=dat;
    OLED_WR_Byte(u8TxBuf);    
}

void Drv_Oled_Init (void)
{
	
	// 根据数据手册提供的例程,初始化OLED
	Ddl_Delay1ms(200);   // 延时200ms 

	WriteCmd(0xAE); //display off
	WriteCmd(0x20);	//Set Memory Addressing Mode	
	WriteCmd(0x10);	//00,Horizontal Addressing Mode;01,Vertical Addressing Mode;10,Page Addressing Mode (RESET);11,Invalid
	WriteCmd(0xb0);	//Set Page Start Address for Page Addressing Mode,0-7
	WriteCmd(0xc8);	//Set COM Output Scan Direction
	WriteCmd(0x00); //---set low column address
	WriteCmd(0x10); //---set high column address
	WriteCmd(0x40); //--set start line address
	WriteCmd(0x81); //--set contrast control register
	WriteCmd(0xff); //áá?èμ÷?ú 0x00~0xff
	WriteCmd(0xa1); //--set segment re-map 0 to 127
	WriteCmd(0xa6); //--set normal display
	WriteCmd(0xa8); //--set multiplex ratio(1 to 64)
	WriteCmd(0x3F); //
	WriteCmd(0xa4); //0xa4,Output follows RAM content;0xa5,Output ignores RAM content
	WriteCmd(0xd3); //-set display offset
	WriteCmd(0x00); //-not offset
	WriteCmd(0xd5); //--set display clock divide ratio/oscillator frequency
	WriteCmd(0xf0); //--set divide ratio
	WriteCmd(0xd9); //--set pre-charge period
	WriteCmd(0x22); //
	WriteCmd(0xda); //--set com pins hardware configuration
	WriteCmd(0x12);
	WriteCmd(0xdb); //--set vcomh
	WriteCmd(0x20); //0x20,0.77xVcc
	WriteCmd(0x8d); //--set DC-DC enable
	WriteCmd(0x14); //
	WriteCmd(0xaf); //--turn on oled panel
 

}
void SetPos(unsigned char x,unsigned char y)  //设置起点坐标
{
	WriteCmd(0xb0+y);
	WriteCmd((x&0xf0)>>4|0x10); //取高位
	WriteCmd((x&0x0f)|0x01);    //取低位
}

void OLED_Fill(unsigned char Fill_Data)  //全屏填充
{
	unsigned char m,n;
	
	for(m=0;m<8;m++){
		WriteCmd(0xb0+m);
		WriteCmd(0x00);
		WriteCmd(0x10);
	
	  for(n=0;n<128;n++){
		WriteDat(Fill_Data);
		}
	}
}
void OLED_Clean(void)  //清屏
{
	OLED_Fill(0x00);
}
void OLED_ON(void)   //打开OLED
{
	WriteCmd(0X8D);   //设置电荷泵
	WriteCmd(0X14);   //开启电荷泵
	WriteCmd(0XAF);   //OLED唤醒
}
 
void OLED_OFF(void)  //关闭OLED
{
	WriteCmd(0X8D);   //设置电荷泵
	WriteCmd(0X10);   //关闭电荷泵
	WriteCmd(0XAE);   //关闭OLED
}

其他指令都和其他的一样,可直接复制

HC32F460芯片上有4路串口,驱动使用了HC32官方的库函数来实现。一般的初始化流程如下代码所示: ```c stc_usart_uart_init_t init; memset(&init, 0, sizeof(init)); init.enClkMode = UsartIntClkCkNoOutput; init.enClkDiv = UsartClkDiv_1; init.enDataLength= UsartDataBits8; init.enDirection = UsartDataLsbFirst; init.enStopBit = UsartOneStopBit; init.enParity = (en_usart_parity_t)parity; init.enSampleMode= UsartSampleBit8; init.enDetectMode= UsartStartBitFallEdge; init.enHwFlow = UsartRtsEnable; USART_UART_Init(hw->uart, &init); USART_SetBaudrate(hw->uart, baudrate); USART_FuncCmd(hw->uart, UsartTx, Enable); USART_FuncCmd(hw->uart, UsartRx, Enable); USART_FuncCmd(hw->uart, UsartRxInt, Enable); ``` HC32F460还提供了一个模板工程,支持IAR和MDK开发环境,内涵ADC、GPIO、外部中断、通用GPIO、FLASH读写、串口、定时器和看门狗驱动二次封装。使用该模板工程能够方便地进行开发。 在实际项目中,如果接入了一个RS485设备,可能会出现无法正常接收数据的问题。故障表现是MCU不进入接收中断。经过检查硬件,没有发现问题,示波器能够看到引脚有波形过来。最后通过Keil的外设查看窗口,发现UART的寄存器中SR的FE标记被置为1。这表示接收到的数据帧存在错误。 如果你需要更详细的信息,可以参考国产MCU华大HC32F460系列芯片的软硬件开发资料、SDK包和应用设计笔记。这些资料包括HC32F460 EVB介绍、仿真器、最小开发工程模板、硬件Demo板参考原理图、编程工具、集成开发环境支持包、驱动库及样例等。<span class="em">1</span><span class="em">2</span><span class="em">3</span><span class="em">4</span>
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值