lcd12864的例子,已經(jīng)做出來了
0.png (42.33 KB, 下載次數(shù): 103)
下載附件
2018-9-28 00:40 上傳
0.png (16.83 KB, 下載次數(shù): 106)
下載附件
2018-9-28 00:40 上傳
0.jpg (61.58 KB, 下載次數(shù): 99)
下載附件
2018-9-28 00:41 上傳
0.jpg (50.54 KB, 下載次數(shù): 103)
下載附件
2018-9-28 00:41 上傳
FPGA 源程序如下:
- //==========================================================================
- //Filename :lcd12864_picture.v
- //modulename:lcd12864_picture
- //Author :a fei
- //Date :2012-7-8
- //Function :驅動12864,顯示圖像
- //Uesedfor :
- //==========================================================================
- `timescale 1ns/1ps
- module lcd12864_picture
- (
- //sys_signal
- input i_50m_clk ,
- input i_rst_n ,
-
-
- output reg o_lcd_rs ,//12864端口
- output reg o_lcd_rw ,
- output reg o_lcd_en ,
- output reg [7:0] o_lcd_data ,
- output o_lcd_psb ,
- output [1:0] o_led
- // output o_lcd_rst
- );
- //assign o_lcd_rst = 1'b1 ;
- assign o_lcd_psb = 1'b1 ;
-
-
- //=============================================================================
- //控制狀態(tài)機狀態(tài)
- //=============================================================================
- parameter Idle = 11'b00000000001 ;//上電初始狀態(tài)
- parameter Set_mode = 11'b00000000010 ;//模式設置
- parameter clear1 = 11'b00000000100 ;//數(shù)據(jù)地址清零
- parameter Disp_on_off = 11'b00000001000 ;//顯示開和關
- parameter Cursor = 11'b00000010000 ;//光標設置
- parameter Stand_by = 11'b00000100000 ;//延時
- parameter Clear2 = 11'b00001000000 ;//數(shù)據(jù)地址清零
- parameter disp_function = 11'b00010000000 ;//開繪圖顯示
- parameter Wr_address_Y = 11'b00100000000 ;//寫行地址
- parameter Wr_address_X = 11'b01000000000 ;//寫列地址,列地址自動加1
- parameter Wr_data = 11'b10000000000 ;//寫數(shù)據(jù)
-
-
- reg [10:0] crt_state , next_state ;
- //=================================================================
- reg [15:0] cnt_1000 ;//E、RS信號脈沖寬度計數(shù)器 1000*20ns=20us
- reg [15:0] time_cnt2;//寫數(shù)據(jù)地址數(shù)據(jù)間隔計數(shù)器
- always@( posedge i_50m_clk or negedge i_rst_n )//
- if( !i_rst_n )
- cnt_1000 <= 16'b0 ;
- else if(crt_state!=next_state)
- cnt_1000 <= 16'b0 ;
- else if(time_cnt2==16'hffff)
- cnt_1000 <= 16'b0 ;
- else if( cnt_1000 == 16'd4000)
- cnt_1000 <= cnt_1000 ;
- else
- cnt_1000 <= cnt_1000 +1'b1 ;
-
- reg [18:0] time_cnt1 ;//5ms計時器,初始化指令間隔
- always@( posedge i_50m_clk or negedge i_rst_n )//
- if( !i_rst_n )
- time_cnt1 <= 18'b0 ;
- else if(crt_state!=next_state)
- time_cnt1 <= 18'b0 ;
- else if( time_cnt1 == 18'h3ffff)
- time_cnt1 <= time_cnt1 ;
- else
- time_cnt1 <= time_cnt1 +1'b1 ;
-
- always@( posedge i_50m_clk or negedge i_rst_n )//寫數(shù)據(jù)或地址時間間隔,寫一個字節(jié)數(shù)據(jù)命令的耗時時間
- if( !i_rst_n )
- time_cnt2 <= 16'b0 ;
- else if(crt_state!=next_state)
- time_cnt2 <= 16'b0 ;
- else if( time_cnt2 == 16'hffff)
- time_cnt2 <= 16'h0 ;
- else
- time_cnt2 <= time_cnt2 +1'b1 ;
-
- //==================================================================
- reg[7:0] address_Y ;//行地址
- reg[7:0] address_X ;//列地址
- reg[3:0] cnt_16 ;//列地址計數(shù)器
- reg[4:0] cnt_32 ;//行地址計數(shù)器
- reg[9:0] rom_addr ;//圖片rom地址
- wire[7:0] disp_data ;//圖片數(shù)據(jù)
-
-
- //==================================================================
- //上電等待時間
- //==================================================================
- reg [19:0] power_up_cnt ;//上電等待時間42ms
-
- always@( posedge i_50m_clk or negedge i_rst_n )//
- if( !i_rst_n )
- power_up_cnt <= 20'b0 ;
- else if(power_up_cnt==20'hff)//power_up_cnt==22'hff
- power_up_cnt<= power_up_cnt ;
- else
- power_up_cnt <= power_up_cnt + 1'b1 ;
- //====================================================================
- //狀態(tài)轉移
- //====================================================================
- always@( posedge i_50m_clk or negedge i_rst_n )//
- if( !i_rst_n )
- crt_state <= Idle ;
- else
- crt_state <= next_state ;
- always@( *)
- case(crt_state)
- Idle : if(power_up_cnt==20'hff) //時間42ms到
- next_state = Set_mode ;
- else
- next_state = crt_state ;
-
- Set_mode: if(time_cnt1 == 18'h3ffff) //模式設置
- next_state = clear1 ;
- else
- next_state = crt_state ;
-
- clear1 : if(time_cnt1 == 18'h3ffff)//清零
- next_state = Disp_on_off ;
- else
- next_state = crt_state ;
-
-
- Disp_on_off: if(time_cnt1 == 18'h3ffff)//顯示開、關
- next_state = Cursor ;
- else
- next_state = crt_state ;
-
- Cursor : if(time_cnt1 == 18'h3ffff)//光標設置
- next_state = Stand_by ;
- else
- next_state = crt_state ;
-
-
- Stand_by :if(time_cnt1 == 18'h3ffff)//延時5ms
- next_state = Clear2 ;
- else
- next_state = crt_state ;
-
- Clear2 : if(time_cnt2 == 16'hffff) //清零
- next_state = disp_function ;
- else
- next_state = crt_state ;
-
- disp_function : if(time_cnt2 == 16'hffff) //開繪圖功能
- next_state = Wr_address_Y ;
- else
- next_state = crt_state ;
-
- Wr_address_Y : if(time_cnt2 == 16'hffff)//寫行地址
- next_state = Wr_address_X ;
- else
- next_state = crt_state ;
-
- Wr_address_X : if(time_cnt2 == 16'hffff)//寫列地址
- next_state = Wr_data ;
- else
- next_state = crt_state ;
-
- Wr_data : if(rom_addr==10'd1023&&time_cnt2 == 16'hffff) //1024個字節(jié)數(shù)據(jù)讀完時,重新開始讀數(shù)據(jù)
- next_state =Clear2 ;
- else if(cnt_16==4'd15&&time_cnt2 == 16'hffff)//沒有讀完1024個字節(jié)數(shù)據(jù),寫下一行數(shù)據(jù)
- next_state = Wr_address_Y ;
- else
- next_state = crt_state ;
-
-
- default :next_state = Idle ;
- endcase
- //===================================================================產(chǎn)生地址和數(shù)據(jù)
- always@( posedge i_50m_clk or negedge i_rst_n )//
- if(!i_rst_n )
- cnt_16 <= 4'd0 ;
- else if(crt_state==Clear2)
- cnt_16 <= 4'd0 ;
- else if(crt_state==Wr_data)//沒一行16個字節(jié),寫完一個字節(jié),計數(shù)器加1
- if(time_cnt2==16'hffff)
- cnt_16 <= cnt_16+1'b1 ;
- else
- cnt_16 <=cnt_16 ;
- else
- cnt_16 <=4'b0 ;
- always@( posedge i_50m_clk or negedge i_rst_n )//
- if(!i_rst_n )
- cnt_32 <= 5'd0 ;
- else if(crt_state==Clear2)
- cnt_32 <= 5'd0 ;
- else if(cnt_16==4'd15&&time_cnt2==16'hffff)//每寫完一行,行數(shù)加1
- cnt_32 <= cnt_32+1'b1 ;
- else
- cnt_32 <= cnt_32 ;
-
-
-
-
-
- always@( posedge i_50m_clk or negedge i_rst_n )//分上下屏,半屏的行地址范圍8‘h80+(0~31)
- if(!i_rst_n )
- address_Y <=8'b0 ;
- else if(crt_state==Wr_address_Y) //行地址,垂直地址
- address_Y <=8'h80+cnt_32 ;
- else
- address_Y <=address_Y ;
- always@( posedge i_50m_clk or negedge i_rst_n )//分上下屏,只需給出首地址,列地址自動加1
- if(!i_rst_n )
- address_X <=8'b0 ;
- else if(crt_state==Wr_address_X)
- if(rom_addr<10'd512) //上半屏行起始地址
- address_X <=8'h80 ;
- else //下半屏行起始地址
- address_X <=8'h88;
- else
- address_X <=address_X ;
-
- ///=============================================================圖像數(shù)據(jù)
- always@( posedge i_50m_clk or negedge i_rst_n )//rom地址
- if(!i_rst_n )
- rom_addr <= 10'd0 ;
- else if(crt_state==Clear2)
- rom_addr <= 10'd0 ;
- else if(crt_state==Wr_data)
- if(time_cnt2==16'hffff)
- rom_addr <= rom_addr +1'b1 ;
- else
- rom_addr <= rom_addr ;
- else
- rom_addr <= rom_addr ;
-
- ///rom 一共1024個字節(jié)數(shù)據(jù)
-
- picture_rom u0_picture_rom(
- .address( rom_addr ),
- .clock ( i_50m_clk),
- .q ( disp_data)
- );
-
-
-
-
-
- //==================================================================端口輸出
-
- ///////lcd_rs,1寫數(shù)據(jù) ,0寫命令
- always@( posedge i_50m_clk or negedge i_rst_n )//
- if( !i_rst_n )
- o_lcd_rs <= 1'b0 ;
- else if((crt_state ==Wr_data)&&(cnt_1000<16'd4000))
- o_lcd_rs <= 1'b1 ;
- else
- o_lcd_rs <= 1'b0 ;
-
- //==lcd_rw ,總是寫
- always@( posedge i_50m_clk)
- o_lcd_rw <= 1'b0 ;
-
- //====lcd_en
- always@( posedge i_50m_clk or negedge i_rst_n )//
- if( !i_rst_n )
- o_lcd_en <= 1'b0 ;
- else if(crt_state==Stand_by)
- o_lcd_en <= 1'b0 ;
- else if(cnt_1000>6'd5&&cnt_1000<16'd3900)//高電平
- o_lcd_en <= 1'b1 ;
- else
- o_lcd_en <= 1'b0 ;
-
-
- //lcd_data ,address
- always@( *)
- case(crt_state)
- Idle : o_lcd_data = 8'h30 ;//模式設置
- Set_mode : o_lcd_data = 8'h30 ;//模式設置
- Disp_on_off : o_lcd_data = 8'h0c ;//顯示開、關
- Cursor : o_lcd_data = 8'h06 ;//光標設置
- clear1,Clear2 : o_lcd_data = 8'h01 ;//清零
- disp_function : o_lcd_data = 8'h36 ;//繪圖功能
- Wr_address_Y : o_lcd_data = address_Y ; //行地址
- Wr_address_X : o_lcd_data = address_X ; //行地址
- Wr_data : o_lcd_data = disp_data ;//數(shù)據(jù)
- default : o_lcd_data = 8'hff ;
-
- endcase
-
-
- ///=========================================================================
- //LED閃爍,指示fpga工作狀態(tài)
- //==========================================================================
-
- led_block u0_led_block(
- .i_clk_50M ( i_50m_clk ) ,
- .i_fpga_clk ( i_50m_clk ) ,
- .i_rst_n ( i_rst_n ) ,
-
-
- .o_led ( o_led )
- );
-
-
- endmodule
復制代碼
所有資料51hei提供下載:
M15_LCD12864 display picture.zip
(19.46 MB, 下載次數(shù): 96)
2018-9-27 19:25 上傳
點擊文件名下載附件
FPGA 下載積分: 黑幣 -5
|