電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 1448|回復(fù): 0
收起左側(cè)

基于S08P-Lite開(kāi)發(fā)板的字庫(kù)構(gòu)建及使用

[復(fù)制鏈接]

578

主題

858

帖子

4821

積分

四級(jí)會(huì)員

Rank: 4

積分
4821
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2022-7-16 08:15:30 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
在S08P-Lite開(kāi)發(fā)板上,配置有一個(gè)4MB的W25Q32存儲(chǔ)器,可作為字庫(kù)或圖庫(kù)來(lái)使用,其接口電路如圖1所示。




圖1 W25Q32接口電路
那該如何構(gòu)建字庫(kù)和圖庫(kù)呢?
方法主要有2個(gè),一個(gè)是用數(shù)組做緩沖的中轉(zhuǎn)存儲(chǔ);另一種是使用串行通訊來(lái)把文件中的傳送給MCU來(lái)進(jìn)行轉(zhuǎn)存。
為了便于說(shuō)明,這里以數(shù)組的形式來(lái)進(jìn)行轉(zhuǎn)儲(chǔ)。
具體處理過(guò)程如下:
1. 首先將字庫(kù)的內(nèi)容存入數(shù)組,其形式為:
unsigned charF8X16[]=
{
0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//sp0
0x00,0x00,0x00,0xF8,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x33,0x30,0x00,0x00,0x00,//!1
0x00,0x10,0x0C,0x06,0x10,0x0C,0x06,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"2
0x40,0xC0,0x78,0x40,0xC0,0x78,0x40,0x00,0x04,0x3F,0x04,0x04,0x3F,0x04,0x04,0x00,//#3
0x00,0x70,0x88,0xFC,0x08,0x30,0x00,0x00,0x00,0x18,0x20,0xFF,0x21,0x1E,0x00,0x00,//$4
...
0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,//|92
0x00,0x02,0x02,0x7C,0x80,0x00,0x00,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,//}93
0x00,0x06,0x01,0x01,0x02,0x02,0x04,0x04,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//~94
}
即每個(gè)字符占用16個(gè)字節(jié),共有95個(gè)字符。
2. 編組分批轉(zhuǎn)存(原因說(shuō)明: 使用OLED屏分頁(yè)顯示(按鍵控制或延時(shí)處理)16*2=32 96/32=3屏)
S08P-Lite開(kāi)發(fā)板所使用的MCU為MC9S08PT60,其閃存容量為60KB。
若能把該數(shù)組的全部字庫(kù)存下并進(jìn)行編譯下載,則可以一次性完成轉(zhuǎn)儲(chǔ)。
但本人所用的CW似乎有些問(wèn)題,一旦代碼得到16KB,就會(huì)在下載后無(wú)法運(yùn)行,故只能分為3次將將字庫(kù)的內(nèi)容轉(zhuǎn)存到W25Q32中,即每次數(shù)組中的字符數(shù)為32個(gè)。
分批轉(zhuǎn)存的程序?yàn)椋?br /> void FlashW25Q32_CREAT(void)
{
uint8_ti,j,k;
uint8_t deviceID;
uint8_treturnResult;
uint16_ttestResult = 0;
printf("FlashW25Q32 CREAT: BEGINS\n");
deviceID = flash_read_deviceid();
printf("FlashW25Q32 CREAT: read device ID is 0x%x\n",deviceID);
printf("FlashW25Q32 CREAT: erase flash sector 0\n"); // 4KB=1sector
returnResult = flash_sector_erase(0);
for(j=0; j<32; j++)
{
for (i=0; i<16; i++)
{
u8FlashReadBuffer = 0;
u8FlashWriteBuffer = F8X16[i+j*16]; // 數(shù)組轉(zhuǎn)存
}
for (i=0; i<16; i++)
{
printf(" 0x%x", u8FlashWriteBuffer); // 寫入內(nèi)容顯示驗(yàn)證
}
printf("\n");
returnResult = flash_write_sector(512+j*16, u8FlashWriteBuffer, 16);
returnResult = flash_read_data(512+j*16, u8FlashReadBuffer, 16);
for(i=0; i<16; i++)
{
printf(" 0x%x", u8FlashReadBuffer); // 讀取內(nèi)容顯示驗(yàn)證
}
printf("\n");
}
printf("FlashW25Q32 CREAT: PASSED\n");
printf("\n");
return;
}
復(fù)制代碼
由于W25Q32的一個(gè)扇區(qū)為4KB,而字符庫(kù)的大小為96*16=1536個(gè)字節(jié),所以一個(gè)扇區(qū)完全可以存放下,因此除了第一次相應(yīng)進(jìn)行擦除外,其他2次需將擦除處理的引腳屏蔽。
編譯下載后,其執(zhí)行效果如圖2和圖3所示,其中單行數(shù)據(jù)為寫入內(nèi)容,雙行數(shù)據(jù)為讀取內(nèi)容,經(jīng)核實(shí)讀寫一致。




圖2 執(zhí)行效果1




圖3 執(zhí)行效果2
3.整體讀取驗(yàn)證
對(duì)于分批轉(zhuǎn)存來(lái)說(shuō),需要進(jìn)行一次整體讀取驗(yàn)證,若是能一次性完成轉(zhuǎn)存則無(wú)需該處理。
整體讀取驗(yàn)證的函數(shù)為:
void FlashW25Q32_Test(void)
{
uint8_ti,j,k;
uint8_tdeviceID;
uint8_treturnResult;
uint16_ttestResult = 0;
printf("FlashW25Q32 test: BEGINS\n");
for(k=0;k<3; k++)
{
for(j=0; j<32; j++)
{
for(i=0; i<16; i++)
{
printf(" 0x%x", u8FlashReadBuffer);
}
printf("\n");
}
printf("FlashW25Q32 test: PASSED\n");
printf("\n");
return;
}
復(fù)制代碼
在執(zhí)行后,其運(yùn)行效果如圖4和圖5所示。




圖4 執(zhí)行效果3




圖5 執(zhí)行效果4
(注:為了便于處理,最后一行數(shù)據(jù)為無(wú)效數(shù)據(jù))
4.以O(shè)LED屏來(lái)顯示驗(yàn)證
我們建立字庫(kù)的目的是為了OLED屏的顯示,為此需要把讀取數(shù)組字庫(kù)的程序轉(zhuǎn)換為讀取硬字庫(kù)的函數(shù)。
以O(shè)LED屏來(lái)進(jìn)行顯示驗(yàn)證的函數(shù)為:
void FlashW25Q32_oled(void)
{
uint8_t i,j,k,x,y;
uint8_treturnResult;
for(k=0;k<3; k++)
{
x=0;
y=0;
for (j=0; j<32; j++)
{
returnResult =flash_read_data(k*512+j*16, FlashReadBuffer, 16);
OLED_ShowCharp(x,y,FlashReadBuffer,16);
if(j==15)
{
y=2;
x=0;
}
else
x=x+8;
}
DelayMS(2000);
}
}
復(fù)制代碼
該函數(shù)的功能是從字庫(kù)中依次讀取字模,然后在分屏顯示在OLED屏上。
(注:OLED屏每屏可顯示的字符數(shù)為32,96/32=3,故字符庫(kù)的內(nèi)容需用3屏來(lái)顯示出來(lái)。)
讀取字庫(kù)來(lái)顯示的函數(shù)為:
void OLED_ShowCharp(uint8_t x,uint8_ty,uint8_t* chr,uint8_tChar_Size)
{
unsignedchari=0;
unsignedchar*c;
c=chr;
if(x>Max_Column-1)
{
x=0;
y=y+2;
}
if(Char_Size==16)
{
OLED_Set_Pos(x,y);
for(i=0;i<8;i++)
OLED_WR_Byte(FlashReadBuffer,OLED_DATA);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_WR_Byte(FlashReadBuffer[i+8],OLED_DATA);
}
}
復(fù)制代碼
分屏顯示的驗(yàn)證效果如圖6至圖8所示,經(jīng)審核處理正確。




圖6 分屏顯示效果1




圖7 分屏顯示效果2




圖8 分屏顯示效果3
5. 讀字庫(kù)進(jìn)行顯示
在分屏顯示的基礎(chǔ)上,我們?cè)賹⒊绦蚋脑斐煞献址@示的函數(shù)。
字符顯示函數(shù)為:
void OLED_ShowCharv(uint8_t x,uint8_ty,uint8_tchr,uint8_tChar_Size)
{
unsignedchari=0,c;
unsignedintp;
c=chr-' ';
p=c*16;
flash_read_data(p, FlashReadBuffer, 16);
if(x>Max_Column-1)
{
x=0;
y=y+2;
}
if(Char_Size==16)
{
OLED_Set_Pos(x,y);
for(i=0;i<8;i++)
OLED_WR_Byte(FlashReadBuffer,OLED_DATA);
OLED_Set_Pos(x,y+1);
for(i=0;i<8;i++)
OLED_WR_Byte(FlashReadBuffer[i+8],OLED_DATA);
}
}
復(fù)制代碼
字符串顯示函數(shù)為:
void OLED_ShowStringV(uint8_t x,uint8_ty,uint8_t*chr,uint8_tChar_Size)
{
unsignedcharj=0;
while(chr[j]!='\0')
{
OLED_ShowCharv(x,y,chr[j],Char_Size);
x+=8;
if(x>120)
{
x=0;
y+=2;
}
j++;
}
}
復(fù)制代碼
實(shí)現(xiàn)演示效果的主程序?yàn)椋?br /> void main(void)
{
Sys_Init();
EnableInterrupts;
MTIM1_Init();
LED_Init();
LED_Test();
PORT_PTAOE_PTAOE2= 1; //PTA2
PORT_PTAOE_PTAOE3= 1; //PTA3
FlashW25Q32_Init();
OLED_Init();
OLED_Clear();
OLED_ShowStringV(0,0,"MC9S08PT60",16);
OLED_ShowStringV(0,2,"0.91' OLED",16);
while(1);
}
復(fù)制代碼
經(jīng)編譯下載,其運(yùn)行效果如圖9所示。




圖9 讀取字庫(kù)的演示效果
有了以上的基礎(chǔ),我們還可以構(gòu)建中文字庫(kù)及圖庫(kù)等。

發(fā)表回復(fù)

本版積分規(guī)則


聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表