一個(gè)帶小數(shù)點(diǎn)的數(shù)碼管的所有8個(gè)發(fā)光二極管的正極或負(fù)極有一個(gè)公共端,通常必須接GND(共陰極數(shù)碼管)或者接VCC(共陽極數(shù)碼管),而另一個(gè)非公共端的8個(gè)引腳就留給用戶的I/O直接控制了。
所以,你做實(shí)驗(yàn)之前要明白自己的開發(fā)板的數(shù)碼管是共陽極的還是共陰極的,由于板子是師兄留給我的,我就不知道我的板子是共陽極的還是供陰極的,所以顯示數(shù)字出現(xiàn)亂碼時(shí),我就花了很長時(shí)間確定是共陽極的還是共陰極的,亂碼是這個(gè)原因還是引腳約束出問題了等等,很煩惱,當(dāng)然,最后成功的顯示數(shù)字之后,心里還是很舒服的。
我的Spartan-6 FPGA開發(fā)板中的數(shù)碼管是共陽極的,因此段選是低電平有效,也就是低電平時(shí),每一段對(duì)應(yīng)的發(fā)光二極管點(diǎn)亮。
如下圖是數(shù)碼管的示意圖:
如果是共陰極的,那么譯碼表為:
每個(gè)數(shù)字或字符的編碼是怎么得到的呢?
如下表:
上表舉了0、1這兩個(gè)數(shù)字的編碼方式,應(yīng)該很明白了吧,從dot開始到a,依次編碼,亮為1,滅為0,如此規(guī)律,可以找到各個(gè)數(shù)字或字符對(duì)應(yīng)的16進(jìn)制編碼,該16進(jìn)制編碼最高位賦值給dot,然后是g、f依次到a,這樣的話,就應(yīng)該到時(shí)候分配引腳的時(shí)候,dot引腳對(duì)應(yīng)的編碼位數(shù)是最高位,a引腳對(duì)應(yīng)的是編碼位數(shù)的最低位。
不明白這一點(diǎn),弄錯(cuò)了,就會(huì)出現(xiàn)亂碼。
上面說的是共陰極的情況,那么共陽極的情況呢?對(duì)應(yīng)的編碼是多少呢?
可知根據(jù)規(guī)律自己推,這里就直接給出了:
下面說說這個(gè)實(shí)驗(yàn)的要求,由于只是初步了解數(shù)碼管的段選片選,所以就不要求那么復(fù)雜了,相對(duì)簡(jiǎn)單一些:
看看你的開發(fā)板上有幾個(gè)數(shù)碼管,讓它們同時(shí)顯示數(shù)字從0 到 F。
下面給出我的FPGA設(shè)計(jì)的Verilog HDL硬件描述語言:
這個(gè)代碼是特權(quán)同學(xué)的,我改動(dòng)了下,適應(yīng)我的FPGA開發(fā)板,(數(shù)碼管是共陽極的,片選是低電平有效,8個(gè)數(shù)碼管。)
`timescale 1ns / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company:
// Engineer:
//
// Create Date: 14:03:17 08/17/2018
// Design Name:
// Module Name: leg_seg7
// Project Name:
// Target Devices:
// Tool versions:
// Description:
//
// Dependencies:
//
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
//
//////////////////////////////////////////////////////////////////////////////////
module led_seg7(
clk,rst_n,
sm_cs1_n,sm_db
);
input clk; // 50MHz
input rst_n; // 復(fù)位信號(hào),低有效
output[7:0] sm_cs1_n; //數(shù)碼管片選信號(hào),低有效
output[7:0] sm_db; //8段數(shù)碼管(包括小數(shù)點(diǎn))
reg[24:0] cnt; //計(jì)數(shù)器,最大可以計(jì)數(shù)到2的25次方*20ns=640ms
always @ (posedge clk or negedge rst_n)
if(!rst_n) cnt 《= 25‘d0;
else cnt 《= cnt+1’b1; //循環(huán)計(jì)數(shù)
reg[3:0] num; //顯示數(shù)值
always @ (posedge clk or negedge rst_n)
if(!rst_n) num 《= 4‘d0;
else if(cnt == 25’h1ffffff) num 《= num+1‘b1; //每640ms增一
//-------------------------------------------------------------------------------
/* 共陽級(jí) :帶小數(shù)點(diǎn)
;0, 1, 2, 3, 4, 5, 6, 7,
db C0, F9, A4, B0, 99, 92, 82, F8
;8, 9, a, b, c, d, e, f , 滅
db 80, 90, 88, 83, C6, A1, 86, 8E, ff*/
parameter seg0 = 7’hC0,
seg1 = 7‘hF9,
seg2 = 7’hA4,
seg3 = 7‘hB0,
seg4 = 7’h99,
seg5 = 7‘h92,
seg6 = 7’h82,
seg7 = 7‘hF8,
seg8 = 7’h80,
seg9 = 7‘h90,
sega = 7’h88,
segb = 7‘h83,
segc = 7’hC6,
segd = 7‘hA1,
sege = 7’h86,
segf = 7‘h8E;
reg[7:0] sm_dbr; //8段數(shù)碼管(包括小數(shù)點(diǎn))
always @ (num)
case (num) //NUM值顯示在數(shù)碼管上
4’h0: sm_dbr 《= seg0;
4‘h1: sm_dbr 《= seg1;
4’h2: sm_dbr 《= seg2;
4‘h3: sm_dbr 《= seg3;
4’h4: sm_dbr 《= seg4;
4‘h5: sm_dbr 《= seg5;
4’h6: sm_dbr 《= seg6;
4‘h7: sm_dbr 《= seg7;
4’h8: sm_dbr 《= seg8;
4‘h9: sm_dbr 《= seg9;
4’ha: sm_dbr 《= sega;
4‘hb: sm_dbr 《= segb;
4’hc: sm_dbr 《= segc;
4‘hd: sm_dbr 《= segd;
4’he: sm_dbr 《= sege;
4‘hf: sm_dbr 《= segf;
default: ;
endcase
assign sm_db = sm_dbr;
assign sm_cs1_n = 8’b0000_0000; //數(shù)碼管常開
endmodule
對(duì)上述代碼需要解釋的是片選信號(hào)有8個(gè),低電平有效,我把8個(gè)數(shù)碼區(qū)的片選全部賦值為0了,這樣8個(gè)數(shù)碼管就全部有效,同步顯示0到F.(片選的意思是選擇哪一個(gè)數(shù)碼管有效)
這是我的數(shù)碼管的電路圖:
更多關(guān)于BJ-EPM240學(xué)習(xí)板之?dāng)?shù)碼管顯示實(shí)驗(yàn)請(qǐng)看視頻。
-
FPGA
+關(guān)注
關(guān)注
1643文章
21923瀏覽量
612358 -
數(shù)碼管
+關(guān)注
關(guān)注
32文章
1888瀏覽量
92101
發(fā)布評(píng)論請(qǐng)先 登錄
數(shù)碼管的結(jié)構(gòu)與原理
基于FPGA實(shí)現(xiàn)數(shù)碼管顯示

數(shù)碼管的使用方法和接線步驟
簡(jiǎn)述led數(shù)碼管的類型和顯示原理
數(shù)碼管顯示屏的靜態(tài)顯示編程是什么
數(shù)碼管顯示屏的作用和功能是什么
驅(qū)動(dòng)器數(shù)碼管顯示不良原因
什么原因造成數(shù)碼管顯示錯(cuò)誤
8位數(shù)碼管怎么不顯示數(shù)字
7段數(shù)碼管共陰共陽如何顯示數(shù)字
數(shù)碼管怎么看共陰共陽標(biāo)記
數(shù)碼管驅(qū)動(dòng)芯片引腳功能
數(shù)碼管驅(qū)動(dòng)芯片原理是什么
CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)四:數(shù)碼管動(dòng)態(tài)顯示

CW32數(shù)字電壓電流表軟件教程-實(shí)驗(yàn)三:數(shù)碼管顯示數(shù)字

評(píng)論