在HC32F460的开发板上,提供了一个SPI接口的W25Q64存储芯片,由于其存储容量较大,故适宜做字库或图库来使用。 W25Q64的接口原理图见图1所示,其占用的MCU引脚如下: SCLK---PC6 SL-- PC7 IO0-- PD8 IO1-- PD9 IO2-- PD10 IO3-- PD11 图1 W25Q64接口
在结合OLED 屏及独立按键的情况下,我们可以将其构建为一个中文字库。 OLED 屏的接口原理图如图2所示,其占用的MCU引脚如下: SCL---PD0 SDA--- PD1 图2 OLED 屏接口
独立按键的接口原理图如图3所示,其占用的MCU引脚如下: KEY0---PD12 KEY1---PD13 KEY2---PD14 KEY3---PA4
图3 独立按键接口
实现FLASH读写及字库构建测试的关键程序如下:
OLED_Init();
OLED_Clear();
OLED_ShowString(0,0,"HC32F460 TEST",16);
OLED_ShowString(0,2,"OLED & W25Q64",16);
Ddl_Delay1ms(1000u);
OLED_Clear();
OLED_ShowCHinese(0,0,3);
OLED_ShowCHinese(16,0,4);
OLED_ShowCHinese(32,0,5);
OLED_ShowCHinese(48,0,6);
OLED_ShowCHinese(64,0,7);
OLED_ShowCHinese(0,2,8);
OLED_ShowCHinese(16,2,9);
OLED_ShowCHinese(32,2,10);
OLED_ShowCHinese(48,2,11);
OLED_ShowCHinese(64,2,12);
PORT_Init(SPI_NSS_PORT, SPI_NSS_PIN, &stcPortInit);
SPI_NSS_HIGH();
Sw2_Init();
Spi_Config();
bufferLen = (uint16_t)sizeof(txBuffer);
while (1)
{
if (1u == u8ExIntFlag)
{
OLED_Clear();
u8ExIntFlag = 0u;
LED0_OFF();
LED1_OFF();
memset(rxBuffer, 0l, sizeof(rxBuffer));
SpiFlash_Erase4KbSector(flashAddr);
SpiFlash_WritePage(flashAddr, (uint8_t*)&txBuffer[0], bufferLen);
SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer[0], bufferLen);
if (memcmp(txBuffer, rxBuffer, (uint32_t)bufferLen) != 0)
{
LED0_ON();
OLED_ShowString(0,2,"W25Q64 NO ",16);
}
else
{
LED1_ON();
OLED_ShowString(0,2,"W25Q64 OK ",16);
Ddl_Delay1ms(1000u);
for(i=0;i<16;i++)
{
OLED_ShowChar(i*8,0,txBuffer[i],16);
}
for(i=0;i<16;i++)
{
OLED_ShowChar(i*8,2,txBuffer[16+i],16);
}
}
Ddl_Delay1ms(1000u);
OLED_Clear();
flashAddr += FLASH_SRCTOR_SIZE;
if (flashAddr >= FALSH_MAX_ADDR)
{
flashAddr = 0u;
}
memset(rxBuffer, 0l, sizeof(rxBuffer));
SpiFlash_Erase4KbSector(flashAddr);
for(i=0;i<160;i++)
{
rxBuffer[i]=Hzk[i/16+6][i%16];
}
SpiFlash_WritePage(flashAddr, (uint8_t*)&rxBuffer[0], 160);
SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer[0], 160);
for(i=0;i<5;i++)
{
for(j=0;j<32;j++)
{
Hzm[j]=rxBuffer[i*32+j];
}
OLED_ShowCHinesel(i*16,0);
}
for(i=0;i<160;i++)
{
rxBuffer[i]=Hzk[i/16+16][i%16];
}
flashAddr=flashAddr+160;
SpiFlash_WritePage(flashAddr, (uint8_t*)&rxBuffer[0], 160);
SpiFlash_ReadData(flashAddr, (uint8_t*)&rxBuffer[0], 160);
for(i=0;i<5;i++)
{
for(j=0;j<32;j++)
{
Hzm[j]=rxBuffer[i*32+j];
}
OLED_ShowCHinesel(i*16,2);
}
}
}
经编译下载,该程序的运行效果如图4~图7所示。 图4 起始界面
图5 W25Q64基本测试
图6 信息读写测试
图7 字库读写测试
实现一维数组汉字显示的函数为: void OLED_ShowCHinesel(uint8_t x, uint8_t y)
{
uint8_t t;
OLED_Set_Pos(x,y);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzm[t],OLED_DATA);
}
OLED_Set_Pos(x,y+1);
for(t=0;t<16;t++)
{
OLED_WR_Byte(Hzm[16+t],OLED_DATA);
}
}
|