最近在玩車載液晶儀表,之前用Arduino+USART液晶,后來發(fā)現Arduino性能不夠,就轉向STM32。由于需要在液晶屏上顯示手機信息,先是采用了普通點陣字庫方案,個人感覺效果慘不忍睹,滿屏的鋸齒。翻遍網絡,沒發(fā)現比較合適的方案。
需要說明的是,我用的STM32板很簡單:STM32+FSMC+TFT5寸屏+SDIO,沒有擴展SDRAM,但是有個好處,可以用大容量TF卡,這也是這個方案可以實現的主要因素。啰嗦了一大堆,先上圖:
字體看起來非常舒服,沒有難看的鋸齒。
方案其實也比較土:
1、在PC上寫個字庫提取工具,和其他工具不一樣,這個工具提取的字模包含了抗鋸齒信息(其實就是灰度信息),每個像素需要1個字節(jié)來存儲,32*32點陣的字模就需要1024個字節(jié),假設有3萬個字模,也就占用30M左右的空間。但是我用的是TF卡,字庫信息對于TF卡容量來說幾乎可以忽略不計!
2、在STM32上的實現就更簡單了,直接讀取TF卡上的字模信息,與要顯示的顏色進行簡單運算后,直接輸出到TFT上就可以了。
附上顯示點陣漢字的代碼:
//*************** 顯示點陣漢字字符 ***********
int display_hz_char(int x,int y,u16 chr){
SD_Error Status = SD_OK;
int i,x1,y1;
BYTE buff[SECTOR_SIZE*2];
u32 sec_start=hz_sec_base+(0x33ff-0x2000+1+chr-0x4e00)*hz_sector_count; //漢字起始扇區(qū)
if((chr>=0x2000)&&(chr<=0x33ff)){
sec_start=hz_sec_base+(chr-0x2000)*hz_sector_count;
}
if((chr>=0xff00)&&(chr<=0xffef)){ //全角字符
sec_start=hz_sec_base+(0x33ff-0x2000+1+0x9fbf-0x4e00+1+chr-0xff00)*hz_sector_count;
}
Status = SD_ReadMultiBlocksEx(sec_start * SECTOR_SIZE, (uint32_t*)(&buff[0]), SECTOR_SIZE, 2,true); //讀取tf卡扇區(qū)數據
if (Status != SD_OK){
in_dma_reading=false;
return x;
}
while (DMA_GetFlagStatus(DMA2_FLAG_TC4) == RESET){}; //等待DMA讀操作完成
i=0;
Lcd_BlockWrite(x,x+dot_font_size-1,y,y+dot_font_size-1); //TFT塊寫入
for(y1=0;y1
*(__IO u16 *) (Bank1_LCD_D) = calc_alpha(dot_font_text_color,dot_font_bkg_color,buff);
}
else{ //背景色,用指定的背景色顯示
*(__IO u16 *) (Bank1_LCD_D) = font_bg_565;
}
i++;
if(i>=SECTOR_SIZE*2){ //一個32點陣字模需要占用2個扇區(qū)(1024個字節(jié))
i=0;
}
}
}
return x+dot_font_size;
}
最后附上pc端字模制作工具截圖: