一. 簡介
這是FPGA之旅的第十一例了。在前面的例子中,已經對OLED有了一個基礎的了解,本例將介紹如何在OLED上實現字符的顯示,為后面的例程做準備。
顯示字符需要先使用字摸軟件取模,將得到的字摸數據存儲到寄存器當中,這個過程可以利用Python生成。然后設置好顯示的XY坐標,最后發送字符數據即可。對于字符占兩個page的話,也就是字符高度大于8的情況,中間還需要重新設置page。
二. 字摸軟件簡介
字摸軟件選用PCtoLCD2002,這個比較常用,也是比較方便,界面如下圖所示。
點擊選項,在彈出的界面中,對生成的字符數據進行設置,為了方便python進行解析,特意設置生成格式如
下。
設置好后,×掉,設置好字寬和字高后,輸入需要生成的字符數據,然后點擊生成字摸就可以在文本框中看到生成的數據,然后點擊保存字摸,就可以將字摸數據保存到TXT文件中了。字摸軟件的介紹就到這里了。
三. Python程序編寫
想著,大家對python可能不太了解,程序就不貼出來,可以作為一個工具來用,對每個字符生成如下的always塊,字體大小為16*16,方便FPGA讀取。
always@(posedge clk or negedge rst)
begin
if(rst == 1'b0)
begin
data1[0]=8'h00;
data1[1] = 8'h40;
data1[2] = 8'h64;
data1[3] = 8'h1C;
data1[4] = 8'h8A;
data1[5] = 8'h6C;
data1[6] = 8'h1C;
data1[7] = 8'h04;
data1[8] = 8'hFC;
data1[9] = 8'h8A;
data1[10] = 8'h5C;
data1[11] = 8'h64;
data1[12] = 8'h54;
data1[13] = 8'h54;
data1[14] = 8'h10;
data1[15] = 8'h00;
end
end
四. 字符顯示模塊
這里演示的是8*16大小的字符(中途沒有換行操作,便于理解顯示的過程),也就是顯示一個字符,需要向OLED發送16次IIC請求。
(一) 模塊信號列表
現在這個模塊和初始化模塊一樣,信號列表都是一樣的。當字符請求來了,就把顯示的字符數據發送出去。
module OLED_ShowFont(
input sys_clk,
input rst_n,
input ShowFont_req, //字符顯示請求
input write_done, //iic一組數據寫完成
output[23:0] ShowFont_Data, //字符顯示數據
output ShowFont_finish //字符顯示完成
);
(二). 具體代碼實現
1. 顯示一個8*16大小的字符,需要先指定對應的XY坐標,也就是page數和Column地址,發送三個命令即可。
2. 隨后發送16byte的字符數據,就完成了一個支符的顯示。
always@(*)
begin
case(showfont_index)
'd0 showfont_data_reg <= {8'h78,8'h00,8'hB0 + 8'h03}; //'d3代表顯示的起始頁地址為4
'd1: showfont_data_reg <= {8'h78,8'h00,8'h00 + 8'h02}; //'d2代表顯示的起始column的低四位為2
'd2: showfont_data_reg <= {8'h78,8'h00,8'h10 + 8'h02}; //'d2代表顯示的起始column的高四位為2
//即顯示的column的起始地址為8'h22,即'd34
default: showfont_data_reg <= {8'h78,8'h40,fontdata};//顯示的數據
endcase
end
OLED_FontData OLED_FontData_HP(
.sys_clk (sys_clk),
.rst_n (rst_n),
.index (showfont_index - 'd3),
.data (fontdata)
);
3. 發送完3byte+16byte的數據后,即顯示結束,也就是當showfont_index == 18的時候,并且在第19個數據剛剛寫完的時候。
(三). OLED_TOP模塊改動
這部分的修改也很少,只需要添加一個狀態,在OLED初始化完成后,進入字符顯示狀態,最后進入空閑態即可,其他的添加和初始化部分一樣。
always@(*)
begin
case(state)
OLED_INIT:
if(init_finish == 1'b1)
next_state <= OLED_ShowFont;
else
next_state <= OLED_INIT;
OLED_ShowFont:
if(showfont_finish == 1'b1)
next_state <= OLED_IDLE;
else
next_state <= OLED_ShowFont;
OLED_IDLE:
next_state <= OLED_IDLE;
default: next_state <= OLED_INIT;
endcase
end
這里就進行了一個簡單的字符顯示例程,當然在實際使用的時候,會復雜很多,例如有多個不同大小的字符進行顯示,以及動態顯示字符等等情況,但核心的寫法可以參考本例。
顯示效果如下
審核編輯:湯梓紅
-
FPGA
+關注
關注
1629文章
21729瀏覽量
603008 -
OLED
+關注
關注
119文章
6198瀏覽量
224103 -
python
+關注
關注
56文章
4792瀏覽量
84628 -
顯示字符
+關注
關注
0文章
3瀏覽量
7247
原文標題:FPGA驅動OLED顯示字符
文章出處:【微信號:FPGA之旅,微信公眾號:FPGA之旅】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
相關推薦
評論