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

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 3634|回復: 0
打印 上一主題 下一主題
收起左側

FPGA M07驅動LCD1602 display character例程源碼與資料

[復制鏈接]
跳轉到指定樓層
樓主
ID:240399 發(fā)表于 2018-5-24 15:19 | 只看該作者 |只看大圖 回帖獎勵 |倒序瀏覽 |閱讀模式
這是例程


全部資料51hei下載地址:
M07_LCD1602 display character.zip (18.18 MB, 下載次數(shù): 22)





Quartus 工程 qsf 文件管腳約束命令,把以下命令拷貝到新建 quartus 工程的 qsf 文件即可完成管腳約束(注
意信號名必須相同) :

3  實驗步驟
3.1  綜合
(1)運行綜合工具。   
(2)打開項目工程,項目工程存放于以軟件開發(fā)工具命名的文件夾中。   
(3)編譯運行或直接點擊下載,下載 FPGA 軟件到目標板。   
(4)查看軟件運行效果
3.2  仿真
請參考視頻講解。
主要命令:   
切換仿真路徑  cd {仿真庫路徑}    ,如:cd {F:\Verilog_demo\M06_Digital clock\clock\sim};
  run 100us:仿真運行時間長度 100us ;
do wave.do:運行波形文件;
vlog ../src/*.v:編譯 scr路徑下的所有 v文件
vsim:開始仿真命令
quit –sim:退出仿真

4  實驗結果
4.1  結果演示
4.1.1  MODELSIM  仿真演示

圖表  2 modelsim 仿真波形
仿真時可以通過按比例修改數(shù)據(jù)通信時間長度,模擬真實通信協(xié)議,來縮短仿真時間。
4.1.2  MATLAB  數(shù)據(jù)分析
略。
4.1.3  開發(fā)板演示
通過以上的講解,相信各位已經(jīng)可以熟練驅動 LCD1602 了吧,在今后的使用中,可以試著將一些采集的數(shù)據(jù)
用1602 顯示出來顯示,比如傳感器溫度啊,時間啊,AD采集的電壓值啊…等等。
4.2  特別說明


源程序如下:
  1. //==========================================================================
  2. //Filename  :lcd1602_ctl.v                                      
  3. //modulename:lcd1602_inf                                       
  4. //Author    :a fei                                                         
  5. //Function  :驅動1602,包括初始化和數(shù)據(jù)的寫,寫入數(shù)據(jù)由用戶定義                 
  6. //==========================================================================
  7. `timescale 1ns/1ps

  8. module    lcd1602_ctl
  9.    (
  10. //sys_signal
  11.     input               i_50m_clk    ,
  12.     input               i_rst_n       ,

  13.     input  [7:0]       i_disp_data   ,//寫入的數(shù)據(jù)
  14.     input              i_data_trig   ,//數(shù)據(jù)觸發(fā)
  15.    
  16.     input               i_addr_trig1   ,//第一行地址觸發(fā)信號
  17.     input               i_addr_trig2   ,//第二行地址觸發(fā)信號
  18.     input [7:0]         i_addr        , //地址   
  19.    
  20.     output reg             o_lcd_rs      ,//1602端口
  21.     output reg             o_lcd_rw      ,
  22.     output reg             o_lcd_en      ,
  23.     output reg   [7:0]     o_lcd_data
  24.     );  

  25.                               
  26.      
  27. //=============================================================================
  28. //控制狀態(tài)機狀態(tài)
  29. //=============================================================================     
  30. parameter Idle        = 10'b0000000001 ;//
  31. parameter Set_mode    = 10'b0000000010 ;//模式設置
  32. parameter Disp_on_off = 10'b0000000100 ;//顯示開和關
  33. parameter Cursor      = 10'b0000001000 ;//光標設置
  34. parameter Clear       = 10'b0000010000 ;//數(shù)據(jù)地址清零
  35. parameter Stand_by    = 10'b0000100000 ;//準備就緒,初始化完成
  36. parameter Wr_address1 = 10'b0001000000 ;//寫第一行首地址
  37. parameter Wr_data1    = 10'b0010000000 ;//寫第一行數(shù)據(jù)  
  38. parameter Wr_address2 = 10'b0100000000 ;//寫第二行首地址   
  39. parameter Wr_data2    = 10'b1000000000 ;//寫第二行數(shù)據(jù)  

  40. reg [9:0] crt_state , next_state ;
  41. //=================================================================
  42. reg [15:0] cnt_4000 ;//TC,en脈沖寬度 4000*20ns=80us
  43. reg           data_trig ;
  44. reg           addr_tirg1 ;
  45. reg           addr_tirg2 ;

  46. always@( posedge i_50m_clk or negedge i_rst_n )//
  47.     if( !i_rst_n )
  48.            cnt_4000 <= 16'b0 ;
  49.     else if(crt_state!=next_state)
  50.            cnt_4000 <= 16'b0 ;  
  51.    else if(!data_trig &&i_data_trig)
  52.             cnt_4000 <= 16'b0 ;
  53.     else if( cnt_4000 == 16'd4000)
  54.            cnt_4000 <= cnt_4000 ;
  55.     else
  56.            cnt_4000 <= cnt_4000 +1'b1  ;
  57.            
  58. reg [18:0]  time_cnt1 ;//5ms計時器,每個指令間隔
  59. always@( posedge i_50m_clk or negedge i_rst_n )//
  60.     if( !i_rst_n )
  61.            time_cnt1 <= 18'b0 ;
  62.     else if(crt_state!=next_state)
  63.            time_cnt1 <= 18'b0 ;
  64.     else if( time_cnt1 == 18'h3ffff)
  65.            time_cnt1 <= time_cnt1 ;
  66.     else
  67.            time_cnt1 <= time_cnt1 +1'b1  ;         
  68.            

  69. //==================================================================
  70. //檢測數(shù)據(jù)、地址觸發(fā)信號


  71. reg[7:0]      disp_data ;
  72. reg[7:0]      address   ;
  73. reg[3:0]      data_cnt  ;
  74. reg[15:0]     time_cnt2  ;
  75. always@( posedge i_50m_clk or negedge i_rst_n )//
  76.     if( !i_rst_n )
  77.           data_trig <= 1'b0 ;
  78.     else
  79.           data_trig <= i_data_trig ;
  80.          
  81. always@( posedge i_50m_clk)
  82.         disp_data <= i_disp_data ;  

  83. always@( posedge i_50m_clk)         
  84.        addr_tirg1 <= i_addr_trig1 ;   

  85. always@( posedge i_50m_clk)         
  86.        addr_tirg2 <= i_addr_trig2 ;   


  87. always@( posedge i_50m_clk)         
  88.         address <= i_addr ;
  89.         
  90. always@( posedge i_50m_clk)  //數(shù)據(jù)持續(xù)最小時間控制   
  91.       if(crt_state==Wr_data1||crt_state==Wr_data2)
  92.            if(! data_trig &&i_data_trig)
  93.                   time_cnt2 <= 16'b0 ;
  94.            else if(time_cnt2==16'hffff)
  95.                   time_cnt2 <= time_cnt2 ;
  96.            else
  97.                  time_cnt2 <=time_cnt2+1'b1 ;
  98.       else
  99.               time_cnt2 <= 16'b0 ;

  100. always@( posedge i_50m_clk) //數(shù)據(jù)個數(shù)計數(shù)器   
  101.       if(crt_state==Wr_data1||crt_state==Wr_data2)
  102.            if(! data_trig &&i_data_trig)
  103.                   data_cnt <= data_cnt +1'b1 ;
  104.            else
  105.                   data_cnt <= data_cnt ;
  106.       else
  107.                  data_cnt <=4'b0 ;
  108.         
  109.         
  110. //==================================================================
  111. //狀態(tài)轉移                     
  112. //==================================================================
  113. reg [19:0] power_up_cnt ;//上電等待時間42ms

  114. always@( posedge i_50m_clk or negedge i_rst_n )//
  115.     if( !i_rst_n )
  116.             power_up_cnt <= 20'b0   ;         
  117.     else if(power_up_cnt==20'hfffff)//power_up_cnt==22'hff
  118.            power_up_cnt<= power_up_cnt ;
  119.     else
  120.            power_up_cnt <= power_up_cnt + 1'b1  ;

  121. //====================================================================
  122. //????
  123. //====================================================================
  124. always@( posedge i_50m_clk or negedge i_rst_n )//     
  125.     if( !i_rst_n )
  126.             crt_state <= Idle ;
  127.     else
  128.             crt_state <= next_state ;


  129. always@( *)  
  130.       case(crt_state)
  131.                  Idle : if(power_up_cnt==20'hfffff) //時間42ms到
  132.                                  next_state = Set_mode ;
  133.                         else
  134.                                  next_state = crt_state ;
  135.                                  
  136.                  Set_mode: if(time_cnt1 == 18'h3ffff) //模式設置
  137.                                  next_state = Clear ;
  138.                            else
  139.                                  next_state = crt_state ;
  140.                 
  141.            Clear   : if(time_cnt1 == 18'h3ffff)//清零
  142.                            next_state = Disp_on_off ;
  143.                      else
  144.                            next_state = crt_state ;                 
  145.                                   
  146.                                
  147.           Disp_on_off: if(time_cnt1 == 18'h3ffff)//顯示開、關
  148.                            next_state = Cursor ;
  149.                        else
  150.                            next_state = crt_state ;  
  151.                            
  152.           Cursor   : if(time_cnt1 == 18'h3ffff)//光標設置
  153.                            next_state = Stand_by ;
  154.                      else
  155.                            next_state = crt_state ;
  156.          
  157.          
  158.            Stand_by   :if(!addr_tirg1&&i_addr_trig1)//準備就緒
  159.                            next_state = Wr_address1 ;
  160.                        else if(!addr_tirg2&&i_addr_trig2)
  161.                             next_state = Wr_address2 ;
  162.                         else
  163.                            next_state = crt_state ;

  164.           Wr_address1   : if( !data_trig &&i_data_trig)//寫第一行數(shù)據(jù)
  165.                                next_state = Wr_data1 ;           
  166.                            else
  167.                                next_state = crt_state ;

  168.            Wr_data1    : if(data_cnt==4'd6&&time_cnt2 == 16'hffff)  //寫第一行數(shù)據(jù),返回準備狀態(tài)
  169.                            next_state = Stand_by ;
  170.                         else
  171.                            next_state = crt_state ;                                                      
  172.                            
  173.          Wr_address2   : if( !data_trig &&i_data_trig)//第二行數(shù)據(jù)
  174.                                  next_state = Wr_data2 ;            
  175.                              else                                   
  176.                                  next_state = crt_state ;           
  177.            
  178.            Wr_data2    : if(data_cnt==4'd4&&time_cnt2==16'hffff)  //第二行數(shù)據(jù)  
  179.                              next_state = Stand_by ;                     
  180.                           else                                                        
  181.                              next_state = crt_state ;
  182.                                                                   
  183.         default :next_state = Idle ;
  184.      endcase                    


  185. //==================================================================端口輸出

  186. ///////lcd_rs,1寫數(shù)據(jù) ,0寫命令
  187. always@( posedge i_50m_clk or negedge i_rst_n )//     
  188.     if( !i_rst_n )
  189.            o_lcd_rs <= 1'b0 ;
  190.     else if((crt_state ==Wr_data2||crt_state ==Wr_data1)&&cnt_4000<16'd4000)
  191.            o_lcd_rs <= 1'b1 ;
  192.    else
  193.            o_lcd_rs <= 1'b0 ;
  194.             
  195. //==lcd_rw ,總是寫
  196. always@( posedge i_50m_clk)
  197.        o_lcd_rw <= 1'b0 ;

  198.    

  199. //====lcd_en

  200. always@( posedge i_50m_clk or negedge i_rst_n )//     
  201.     if( !i_rst_n )
  202.           o_lcd_en <= 1'b0 ;
  203.     else if(crt_state==Stand_by)
  204.           o_lcd_en <= 1'b0 ;
  205.     else if(cnt_4000>5'd10&&cnt_4000<16'd3990)
  206.            o_lcd_en <= 1'b1 ;        
  207.     else                             
  208.            o_lcd_en <=  1'b0 ;
  209.             
  210.             
  211. //lcd_data ,?????            
  212. always@( *)
  213.        case(crt_state)
  214.                Idle                      :  o_lcd_data = 8'h38 ;
  215.                Set_mode                  :  o_lcd_data = 8'h38 ;//模式設置
  216.         Disp_on_off               :  o_lcd_data = 8'h0e ;//顯示開、關
  217.         Cursor                    :  o_lcd_data = 8'h06 ;//光標設置
  218.         Clear                     :  o_lcd_data = 8'h01 ;//清零
  219.         Wr_address1,Wr_address2   :  o_lcd_data = address  [7:0]  ; //地址                                                
  220.         Wr_data1 ,Wr_data2        :  o_lcd_data = disp_data[7:0]  ;//數(shù)據(jù)
  221.          default :     o_lcd_data = 8'hff ;
  222.         
  223.        endcase  
  224.       
  225. endmodule            
復制代碼

評分

參與人數(shù) 1黑幣 +50 收起 理由
admin + 50 共享資料的黑幣獎勵!

查看全部評分

分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏1 分享淘帖 頂 踩
回復

使用道具 舉報

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網(wǎng)

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 亚洲国产精品久久久久 | 久草福利 | 99视频在线| 久久精品国产一区二区电影 | 日韩在线中文字幕 | 久久精品中文字幕 | 亚洲成人一级 | 人人99 | 亚洲国产一区二区三区在线观看 | 手机av网 | 欧美成年网站 | 少妇精品久久久久久久久久 | 羞羞视频免费观 | 色性av| 在线成人免费视频 | 中文字幕国产一区 | 欧洲视频一区二区 | 人人干人人草 | 看a网站| 欧美激情久久久 | 久久久青草婷婷精品综合日韩 | 国产精品久久久久久久久久免费看 | av网站在线看 | 视频一区二区在线观看 | 亚洲精品成人在线 | 91成人| 国产伦精品一区二区三区四区视频 | 中文字幕一区在线 | 日韩一区二区三区视频 | 午夜一区二区三区视频 | 久久成人一区二区三区 | 国产精品久久久久久久岛一牛影视 | 国产精品揄拍一区二区 | 日韩欧美精品在线播放 | 久久精品小视频 | 精品一区二区三区在线观看 | 在线观看免费av网 | 欧美大片在线观看 | 草久久| 91麻豆精品国产91久久久久久久久 | 九九99九九精彩46 |