久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

專注電子技術學習與研究
當前位置:單片機教程網 >> MCU設計實例 >> 瀏覽文章

LED陣列之FPGA顯示

作者:kb129   來源:kb129   點擊數:  更新時間:2014年06月08日   【字體:
   LED陣列已經普遍使用在我們生活中,出去逛逛隨處可見。不太清楚業內是使用什么來控制顯示的,估計用單片機,畢竟便宜多了。作為一個搞電子的,一定要了解LED陣列顯示。我的理解:LED陣列顯示主要有兩種:靜態顯示,滾動顯示。

一:靜態顯示    

  LED陣列顯示有些類似于數碼管顯示,都是掃描顯示。這里略講講原理:在我們看到的LED陣列顯示一個畫面或是一行字,其實在硬件顯示的時候,應該是一行一行或是一列一列來顯示。例如8*8led陣列,在我使用過程中,顯示方式是一列一列的顯示,也就是先點亮第一列led,其他列都不亮,然后點亮第二列led,其他列都不亮,依次到第八列,然后又回來點亮第一列,以此循環。這樣就能實現led陣列的靜態顯示。

二:左移或右移顯示   

      led滾動顯示是一個不容易理解的顯示方式。實際使用中,可以看到,led陣列都是一行字緩慢的向左或是向右移動。

      顯示方法:一列一列顯示。(如果是上下移動,則選擇一行一行顯示)

思考的方向:單獨考慮每一列數值的改變,先考慮第一列在滾動顯示過程中數值有哪些。

舉例說明:


就像上圖我們要滾動顯示一個字母T,從最上面圖1一直右移到最后一個圖,然后又回到了圖1,這就是典型的滾動循環顯示。
按照上面的思考方法來做,假定最左邊為第一列,最右邊為第八列。首先考慮在滾動顯示中第一列的數據變化:

    8'h00,  8'h00,  8'h00,  8'h40,  8'h40,  8'h7e,  8'h40,  8'h40

第二列數據變化:

    8'h40,   8'h00, 8'h00,  8'h00,  8'h40,  8'h40,  8'h7e,  8'h40

對比第一列數據和第二列數據,會發現第一列第一張圖的數據8'h00,是第二列第二張圖的數據8'h00.


由此可知:對于右移滾動循環顯示,所有列的數據都是同樣的,也就是,如果把列出現的所有數據存在一個數組或是庫里面,所有列的數據都可以在該數組或是庫取。這就誕生了網上很多字模軟件,我們只要知道第一張圖上面所有列的數據,然后存在一個數組里面,顯示的時候只需要每一列取不同的值即可。

具體代碼沒有保存,故不貼出來。

三:最外圍順時針滾動顯示

      之所以特別說說這個顯示,是因為上周末,和朋友逛校園。走到體育館,她指著體育館門口的led,跟我講,最外圍的那一圈一直在順時針旋轉怎么做到的。當時覺得很少見,琢磨難道是橫著的設置為左右移動,豎著的設置為上下移動。接著就想,那么怎么在同一個顯示中,既使用上下移動模式,又使用左右移動模式,想了很久。昨晚自己在紙上亂畫了一下,發現方法還是和上面一樣。


其實在旋轉過程中,每一列的數據還是周期發生變化,

拿第一列(最左邊一列)舉例:變化的值為:8'h99, 8'h33,8'h66,8'hCC.這樣就可以將問題轉換到第二種顯示,所以在led陣列顯示中,如果是一列一列的顯示,需要著重考慮每一列的數據的變化;如果是一行一行的顯示,需要著重考慮的是每一行的數據變化。

verilog代碼為:(其中中行為1,列為0則led亮)

//pro : 8*8 led show
//data: 2014-04-23 qs336
//info: this is a pro exe that play the show of 8*8 led
module led88(
    input                     clk,
    output     reg [7:0] R,   //this is row
    output     reg [7:0] L
);
integer cnt1,cnt2,cnt3;
reg clk_lk,clk_h;
reg [2:0] p;
reg [1:0] i;
reg [7:0] char0[3:0];
reg [7:0] char1[3:0];
reg [7:0] char2[3:0];
reg [7:0] char3[3:0];
reg [7:0] char4[3:0];
reg [7:0] char5[3:0];
reg [7:0] char6[3:0];
reg [7:0] char7[3:0];

always@(posedge clk )
begin
      char0[0] <= 8'b1001_1001; char0[1] <= 8'b0011_0011; char0[2] <= 8'b0110_0110; char0[3]<= 8'b1100_1100;
      char1[0] <= 8'b1000_0001; char1[1] <= 8'b1000_0000; char1[2] <= 8'b0000_0000; char1[3] <= 8'b0000_0001;
      char2[0] <= 8'b0000_0000; char2[1] <= 8'b1000_0000; char2[2] <= 8'b1000_0001; char2[3] <= 8'b0000_0001;
      char3[0] <= 8'b0000_0000; char3[1] <= 8'b0000_0001; char3[2] <= 8'b1000_0001; char3[3] <= 8'b1000_0000;
      char4[0] <= 8'b1000_0001; char4[1] <= 8'b0000_0001; char4[2] <= 8'b0000_0000; char4[3] <= 8'b1000_0000;
      char5[0] <= 8'b1000_0001; char5[1] <= 8'b1000_0000; char5[2] <= 8'b0000_0000; char5[3] <= 8'b0000_0001;
      char6[0] <= 8'b0000_0000; char6[1] <= 8'b1000_0000; char6[2] <= 8'b1000_0001; char6[3] <= 8'b0000_0001;
      char7[0] <= 8'b0110_0110; char7[1] <= 8'b0011_0011; char7[2] <= 8'b1001_1001; char7[3] <= 8'b1100_1100;
 if(cnt1==8'd124)
       begin
                 cnt1 <= 0;
                 if(cnt2==8'd199)
                 begin
                       clk_lk <= ~clk_lk;
                       cnt2 <= 0;
                 end
                else cnt2 <= cnt2+1;
       end
 else cnt1 <= cnt1+1;
end

always@(posedge clk_lk)
begin
         if(cnt3==8'd70)
         begin
              cnt3   <= 0;
              clk_h  <= ~clk_h;
         end
         else  cnt3 <= cnt3+1;
         if(p==3'b111) p <= 0;
         else                p <= p+1;

end
always@(p)
case(p)
    3'b000:begin    
                    L <= 8'b1111_1110;
                    R[7:0] <= char0[i];
               end
    3'b001:begin    
                    L <= 8'b1111_1101;
                    R[7:0] <= char1[i];  
               end  
    3'b010:begin    
                    L <= 8'b1111_1011;
                    R[7:0] <= char2[i];  
              end 
    3'b011:begin    
                    L <= 8'b1111_0111;
                    R[7:0] <= char3[i];   
              end 
    3'b100:begin    
                    L <= 8'b1110_1111;
                    R[7:0] <= char4[i];   
               end 
    3'b101:begin    
                     L <= 8'b1101_1111;
                     R[7:0] <= char5[i];   
              end    
     3'b110:begin    
                     L <= 8'b1011_1111;
                     R[7:0] <= char6[i];   
                end    
      3'b111:begin    
                     L <= 8'b0111_1111;
                     R[7:0] <= char7[i];  
                 end      
endcase

always@(posedge clk_h)
begin
        i <= i+1;

end

endmodule
其實led陣列顯示有很多種方法,上面介紹的是一個很容易理解的方法,可以以此為基本來靈活改變顯示方法。

關閉窗口

相關文章

主站蜘蛛池模板: 欧美日韩亚洲天堂 | 伊人久久久久久久久久 | 日韩激情网站 | 97成人在线 | 国产三级成人 | 在线观看日韩 | 天天做天天爽 | av免费看片 | 精品网站999www| 一区二区免费视频 | 亚洲一区二区精品视频 | 国产欧美日韩 | 免费a在线 | 开心激情站 | 日日干夜夜撸 | 国产成人在线播放 | 日韩精品视频网站 | 三级视频在线 | 黄色免费av | 国产逼逼| 欧美精品成人 | a级黄色片 | 日韩视频在线免费观看 | 欧美区一区二 | 超碰91在线 | 亚洲精品www久久久久久广东 | 日韩黄色在线视频 | 羞羞在线视频 | 国产视频成人 | 九九精品在线视频 | 草草网| 精品一区二区视频 | 在线观看日韩av | 久久精品欧美一区二区 | 国产在线视频91 | 日韩在线一区二区三区 | 日韩精品一区二区三区四区 | 日日干日日操 | 五月婷婷色综合 | 亚洲香蕉视频 | 成人深夜视频 |