0.96寸OLED屏幕verilog驱动代码FPGA硬件驱动开发

3 篇文章 1 订阅
1 篇文章 1 订阅

之前毕业设计写过的用在FPGA上的0.96寸OLED屏幕verilog驱动代码,亲测可用,有什么问题欢迎留言。

// ********************************************************************
// >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
// ********************************************************************
// File name    : OLED94.v
// Module name  : OLED94
// Author       : Wuyo
// Web          : www.wuyo.fun
// 
// --------------------------------------------------------------------
// Code Revision History : 
// --------------------------------------------------------------------
// Version: |Mod. Date:   |Changes Made:
// V1.0     |2020/03/14   |Initial ver
// --------------------------------------------------------------------
// Module Function:OLED96驱动模块。


module OLED_drive
(
		input clk_in,  //clk_in = 50mhz
		input rst_n_in,  //rst_n_in, active low
		output reg run_flag,
		output reg oled_rst_n_out,  // reset, active low  res
		output reg oled_cs_n_out,  // chip select, active low  cs
		output reg oled_dc_out,  // data or command control   dc
		output oled_clk_out,  // clock      scl(d0)
		output reg oled_data_out  // data   sda(d1)
);

		parameter CLK_DIV_PERIOD=20; //related with clk_div's frequency
		parameter DELAY_PERIOD=25000;  //related with delay time and refresh frequency

		parameter CLK_L=2'd0;
		parameter CLK_H=2'd1;
		parameter CLK_RISING_DEGE=2'd2;
		parameter CLK_FALLING_DEGE=2'd3;

		parameter IDLE=3'd0;
		parameter SHIFT=3'd1;
		parameter CLEAR=3'd2;
		parameter SETXY=3'd3;
		parameter DISPLAY=3'd4;
		parameter DELAY=3'd5;

		parameter LOW =1'b0;
		parameter HIGH =1'b1;
		parameter CMD =1'b0;
		parameter DATA =1'b1;

//assign oled_rst_n_out = 1;  //active low level, set 1 for normal
//	assign oled_dc_out = 1;
	assign oled_clk_out = clk_div;

//initial for memory register
	reg [127:0] cmd_r [9:0];
	initial
		begin
			cmd_r[0]= {8'hae, 8'h00, 8'h10, 8'h00, 8'hb0, 8'h81, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3};   // command for initial
			cmd_r[1]= {8'hff, 8'ha1, 8'ha6, 8'ha8, 8'h1f, 8'hc8, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3};   // command for initial
			cmd_r[2]= {8'hd3, 8'h00, 8'hd5, 8'h80, 8'hd9, 8'h1f, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3};   // command for initial
			cmd_r[3]= {8'hda, 8'h00, 8'hdb, 8'h40, 8'h8d, 8'h14, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3};   // command for initial
			cmd_r[4]= {8'haf, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3};   // command for initial
			cmd_r[5]= {8'hb0, 8'h00, 8'h10, 8'hE3, 8'he3, 8'he3, 8'he0, 8'he0, 8'he0, 8'he0, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3};   // command for set row1
			cmd_r[6]= {8'hb1, 8'h00, 8'h10, 8'hE3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3};   // command for set row2
			cmd_r[7]= {8'hb2, 8'h00, 8'h10, 8'hE3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3};   // command for set row3
			cmd_r[8]= {8'hb3, 8'h00, 8'h10, 8'hE3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3, 8'he3};   // command for set row4
		end

	//initial for memory register
	reg [127:0] mem [91:0];
	reg [127:0] temp;
	initial
		begin
			mem[0]= {8'h00, 8'h00, 8'h00, 8'h00, 8'h00, 8'h00};   // 0  sp 
			mem[1]= {8'h00,8'h00,8'hFF,8'hFF,8'h03,8'h03,8'h03,8'h03,8'h00,8'h00,8'h03,8'h03,8'h00,8'h00,8'h00,8'h00};   // 1  !  
			mem[2]= {8'h00,8'h00,8'h00,8'h00,8'h7F,8'h00,8'h09,8'h00,8'h09,8'h00,8'h09,8'h00,8'h09,8'h00,8'h00,8'h00}; //F 
			mem[3]= {8'h00,8'h00,8'h00,8'h00,8'h7F,8'h00,8'h09,8'h00,8'h09,8'h00,8'h09,8'h00,8'h06,8'h00,8'h00,8'h00};   //P
			mem[4]= {8'h00,8'h00,8'h00,8'h00,8'h3E,8'h00,8'h41,8'h00,8'h41,8'h00,8'h49,8'h00,8'h79,8'h00,8'h00,8'h00};  //G
			mem[5]= {8'h00,8'h00,8'h40,8'h00,8'h38,8'h00,8'h16,8'h00,8'h13,8'h00,8'h1C,8'h00,8'h70,8'h00,8'h00,8'h00};   //A
			mem[6]= {8'h40,8'h40,8'h42,8'hCC,8'h00,8'h20,8'h22,8'hE2,8'h22,8'h22,8'hE2,8'h22,8'h22,8'h20,8'h00,8'h00};
			mem[7]= {8'h00,8'h80,8'h40,8'h3F,8'h40,8'hA0,8'h98,8'h87,8'h80,8'h80,8'h9F,8'hA0,8'hA0,8'hBC,8'h80,8'h00};   //远
			mem[8]= {8'h24,8'h24,8'hA4,8'hFE,8'h23,8'h22,8'h00,8'h3E,8'h22,8'h22,8'h22,8'h22,8'h22,8'h3E,8'h00,8'h00};
			mem[9]= {8'h08,8'h06,8'h01,8'hFF,8'h01,8'h06,8'h40,8'h49,8'h49,8'h49,8'h7F,8'h49,8'h49,8'h49,8'h41,8'h00};    //程
			mem[10]= {8'h10,8'h10,8'h10,8'hFF,8'h90,8'h20,8'h98,8'h48,8'h28,8'h09,8'h0E,8'h28,8'h48,8'hA8,8'h18,8'h00};
			mem[11]= {8'h02,8'h42,8'h81,8'h7F,8'h00,8'h40,8'h40,8'h42,8'h42,8'h42,8'h7E,8'h42,8'h42,8'h42,8'h40,8'h00};   // 控
			mem[12]= {8'h40,8'h50,8'h4E,8'h48,8'h48,8'hFF,8'h48,8'h48,8'h48,8'h40,8'hF8,8'h00,8'h00,8'hFF,8'h00,8'h00};   // 
			mem[13]= {8'h00,8'h00,8'h3E,8'h02,8'h02,8'hFF,8'h12,8'h22,8'h1E,8'h00,8'h0F,8'h40,8'h80,8'h7F,8'h00,8'h00};   // 制
			mem[14]= {8'h80,8'h84,8'h44,8'h44,8'h24,8'h14,8'h0C,8'hFF,8'h0C,8'h14,8'h24,8'h44,8'h44,8'h84,8'h80,8'h00};  // 
			mem[15]= {8'h08,8'h08,8'h08,8'h08,8'h09,8'h49,8'h89,8'h79,8'h0D,8'h0B,8'h09,8'h08,8'h08,8'h08,8'h08,8'h00};   //  
			mem[16]= {8'h04,8'h03,8'h00,8'hFF,8'h00,8'h43,8'h40,8'h7F,8'h4A,8'h4A,8'h4A,8'h4A,8'h4A,8'h7F,8'h40,8'h00};   // 
			mem[17]= {8'h02,8'h01,8'hFF,8'h00,8'h03,8'h00,8'hFF,8'h49,8'h49,8'h49,8'h7F,8'h49,8'h49,8'h49,8'hFF,8'h00};    // 
			mem[18]= {8'h02,8'h01,8'hFF,8'h00,8'h03,8'h00,8'hFF,8'h49,8'h49,8'h49,8'h7F,8'h49,8'h49,8'h49,8'hFF,8'h00};    // 
			mem[19]= {8'h02,8'h01,8'hFF,8'h00,8'h03,8'h00,8'hFF,8'h49,8'h49,8'h49,8'h7F,8'h49,8'h49,8'h49,8'hFF,8'h00};   // 		
			mem[20]= {8'h04,8'h84,8'hC4,8'hB4,8'h8C,8'h10,8'h54,8'h54,8'h54,8'hFF,8'h54,8'h54,8'h7C,8'h10,8'h10,8'h00};	  //
			mem[21]= {8'h80,8'h44,8'h28,8'h18,8'h27,8'h28,8'h49,8'h49,8'h49,8'h7F,8'h49,8'h49,8'h49,8'h48,8'h40,8'h00};	  //
			mem[22]= {8'h00,8'h04,8'h04,8'h04,8'h04,8'h04,8'h04,8'hFC,8'h04,8'h04,8'h04,8'h04,8'h04,8'h04,8'h00,8'h00};   // 
			mem[23]= {8'h20,8'h20,8'h20,8'h20,8'h20,8'h20,8'h20,8'h3F,8'h20,8'h20,8'h20,8'h20,8'h20,8'h20,8'h20,8'h00};   // 
			mem[24]= {8'h24,8'h24,8'hA4,8'hFE,8'h23,8'h22,8'h00,8'h3E,8'h22,8'h22,8'h22,8'h22,8'h22,8'h3E,8'h00,8'h00};   // 
			mem[25]= {8'h08,8'h06,8'h01,8'hFF,8'h01,8'h06,8'h40,8'h49,8'h49,8'h49,8'h7F,8'h49,8'h49,8'h49,8'h41,8'h00};   // 
			mem[26]= {8'h40,8'h30,8'h11,8'h96,8'h90,8'h90,8'h91,8'h96,8'h90,8'h90,8'h98,8'h14,8'h13,8'h50,8'h30,8'h00};   // 
			mem[27]= {8'h04,8'h04,8'h04,8'h04,8'h04,8'h44,8'h84,8'h7E,8'h06,8'h05,8'h04,8'h04,8'h04,8'h04,8'h04,8'h00};   //  ;
			mem[28]= {8'h00,8'hFE,8'h22,8'h5A,8'h86,8'h10,8'h0C,8'h24,8'h24,8'h25,8'h26,8'h24,8'h24,8'h14,8'h0C,8'h00};   // 
			mem[29]= {8'h00,8'hFF,8'h04,8'h08,8'h07,8'h80,8'h41,8'h31,8'h0F,8'h01,8'h01,8'h3F,8'h41,8'h41,8'h71,8'h00};   // =
			mem[30]= {8'h00, 8'h00, 8'h41, 8'h22, 8'h14, 8'h08};   // 30 >
			mem[31]= {8'h00, 8'h02, 8'h01, 8'h51, 8'h09, 8'h06};   // 31 ?
			mem[32]= {8'h00, 8'h32, 8'h49, 8'h59, 8'h51, 8'h3E};   // 32 @
			mem[33]= {8'h00, 8'h7C, 8'h12, 8'h11, 8'h12, 8'h7C};   // 33 A
			mem[34]= {8'h00, 8'h7F, 8'h49, 8'h49, 8'h49, 8'h36};   // 34 B
			mem[35]= {8'h00, 8'h3E, 8'h41, 8'h41, 8'h41, 8'h22};   // 35 C
			mem[36]= {8'h00, 8'h7F, 8'h41, 8'h41, 8'h22, 8'h1C};   // 36 D
			mem[37]= {8'h00, 8'h7F, 8'h49, 8'h49, 8'h49, 8'h41};   // 37 E
			mem[38]= {8'h00, 8'h7F, 8'h09, 8'h09, 8'h09, 8'h01};   // 38 F
			mem[39]= {8'h00, 8'h3E, 8'h41, 8'h49, 8'h49, 8'h7A};   // 39 G
			mem[40]= {8'h00, 8'h7F, 8'h08, 8'h08, 8'h08, 8'h7F};   // 40 H
			mem[41]= {8'h00, 8'h00, 8'h41, 8'h7F, 8'h41, 8'h00};   // 41 I
			mem[42]= {8'h00, 8'h20, 8'h40, 8'h41, 8'h3F, 8'h01};   // 42 J
			mem[43]= {8'h00, 8'h7F, 8'h08, 8'h14, 8'h22, 8'h41};   // 43 K
			mem[44]= {8'h00, 8'h7F, 8'h40, 8'h40, 8'h40, 8'h40};   // 44 L
			mem[45]= {8'h00, 8'h7F, 8'h02, 8'h0C, 8'h02, 8'h7F};   // 45 M
			mem[46]= {8'h00, 8'h7F, 8'h04, 8'h08, 8'h10, 8'h7F};   // 46 N
			mem[47]= {8'h00, 8'h3E, 8'h41, 8'h41, 8'h41, 8'h3E};   // 47 O
			mem[48]= {8'h00, 8'h7F, 8'h09, 8'h09, 8'h09, 8'h06};   // 48 P
			mem[49]= {8'h00, 8'h3E, 8'h41, 8'h51, 8'h21, 8'h5E};   // 49 Q
			mem[50]= {8'h00, 8'h7F, 8'h09, 8'h19, 8'h29, 8'h46};   // 50 R
			mem[51]= {8'h00, 8'h46, 8'h49, 8'h49, 8'h49, 8'h31};   // 51 S
			mem[52]= {8'h00, 8'h01, 8'h01, 8'h7F, 8'h01, 8'h01};   // 52 T
			mem[53]= {8'h00, 8'h3F, 8'h40, 8'h40, 8'h40, 8'h3F};   // 53 U
			mem[54]= {8'h00, 8'h1F, 8'h20, 8'h40, 8'h20, 8'h1F};   // 54 V
			mem[55]= {8'h00, 8'h3F, 8'h40, 8'h38, 8'h40, 8'h3F};   // 55 W
			mem[56]= {8'h00, 8'h63, 8'h14, 8'h08, 8'h14, 8'h63};   // 56 X
			mem[57]= {8'h00, 8'h07, 8'h08, 8'h70, 8'h08, 8'h07};   // 57 Y
			mem[58]= {8'h00, 8'h61, 8'h51, 8'h49, 8'h45, 8'h43};   // 58 Z
			mem[59]= {8'h00, 8'h00, 8'h7F, 8'h41, 8'h41, 8'h00};   // 59 [
			mem[60]= {8'h00, 8'h55, 8'h2A, 8'h55, 8'h2A, 8'h55};   // 60 .
			mem[61]= {8'h00, 8'h00, 8'h41, 8'h41, 8'h7F, 8'h00};   // 61 ]
			mem[62]= {8'h00, 8'h04, 8'h02, 8'h01, 8'h02, 8'h04};   // 62 ^
			mem[63]= {8'h00, 8'h40, 8'h40, 8'h40, 8'h40, 8'h40};   // 63 _
			mem[64]= {8'h00, 8'h00, 8'h01, 8'h02, 8'h04, 8'h00};   // 64 '
			mem[65]= {8'h00, 8'h20, 8'h54, 8'h54, 8'h54, 8'h78};   // 65 a
			mem[66]= {8'h00, 8'h7F, 8'h48, 8'h44, 8'h44, 8'h38};   // 66 b
			mem[67]= {8'h00, 8'h38, 8'h44, 8'h44, 8'h44, 8'h20};   // 67 c
			mem[68]= {8'h00, 8'h38, 8'h44, 8'h44, 8'h48, 8'h7F};   // 68 d
			mem[69]= {8'h00, 8'h38, 8'h54, 8'h54, 8'h54, 8'h18};   // 69 e
			mem[70]= {8'h00, 8'h08, 8'h7E, 8'h09, 8'h01, 8'h02};   // 70 f
			mem[71]= {8'h00, 8'h18, 8'hA4, 8'hA4, 8'hA4, 8'h7C};   // 71 g
			mem[72]= {8'h00, 8'h7F, 8'h08, 8'h04, 8'h04, 8'h78};   // 72 h
			mem[73]= {8'h00, 8'h00, 8'h44, 8'h7D, 8'h40, 8'h00};   // 73 i
			mem[74]= {8'h00, 8'h40, 8'h80, 8'h84, 8'h7D, 8'h00};   // 74 j
			mem[75]= {8'h00, 8'h7F, 8'h10, 8'h28, 8'h44, 8'h00};   // 75 k
			mem[76]= {8'h00, 8'h00, 8'h41, 8'h7F, 8'h40, 8'h00};   // 76 l
			mem[77]= {8'h00, 8'h7C, 8'h04, 8'h18, 8'h04, 8'h78};   // 77 m
			mem[78]= {8'h00, 8'h7C, 8'h08, 8'h04, 8'h04, 8'h78};   // 78 n
			mem[79]= {8'h00, 8'h38, 8'h44, 8'h44, 8'h44, 8'h38};   // 79 o
			mem[80]= {8'h00, 8'hFC, 8'h24, 8'h24, 8'h24, 8'h18};   // 80 p
			mem[81]= {8'h00, 8'h18, 8'h24, 8'h24, 8'h18, 8'hFC};   // 81 q
			mem[82]= {8'h00, 8'h7C, 8'h08, 8'h04, 8'h04, 8'h08};   // 82 r
			mem[83]= {8'h00, 8'h48, 8'h54, 8'h54, 8'h54, 8'h20};   // 83 s
			mem[84]= {8'h00, 8'h04, 8'h3F, 8'h44, 8'h40, 8'h20};   // 84 t
			mem[85]= {8'h00, 8'h3C, 8'h40, 8'h40, 8'h20, 8'h7C};   // 85 u
			mem[86]= {8'h00, 8'h1C, 8'h20, 8'h40, 8'h20, 8'h1C};   // 86 v
			mem[87]= {8'h00, 8'h3C, 8'h40, 8'h30, 8'h40, 8'h3C};   // 87 w
			mem[88]= {8'h00, 8'h44, 8'h28, 8'h10, 8'h28, 8'h44};   // 88 x
			mem[89]= {8'h00, 8'h1C, 8'hA0, 8'hA0, 8'hA0, 8'h7C};   // 89 y
			mem[90]= {8'h00, 8'h44, 8'h64, 8'h54, 8'h4C, 8'h44};   // 90 z
			mem[91]= {8'h14, 8'h14, 8'h14, 8'h14, 8'h14, 8'h14};   // 91 horiz lines
	
		end
	
//clk_div = clk_in/CLK_DIV_PERIOD, 50% is high voltage
		reg clk_div; 
		reg[15:0] clk_cnt=0;
		always@(posedge clk_in or negedge rst_n_in)
		begin
			if(!rst_n_in) 
				clk_cnt<=0;
			else begin
				clk_cnt<=clk_cnt+1;  
				if(clk_cnt==(CLK_DIV_PERIOD-1)) clk_cnt<=0;
				if(clk_cnt<(CLK_DIV_PERIOD/2)) clk_div<=0;
				else clk_div<=1;
			end
		end

//divide clk_div 4 state, RISING and FALLING state is keeped one cycle of clk_in, like a pulse.
		reg[1:0] clk_div_state=CLK_L;  
		always@(posedge clk_in or negedge rst_n_in)
		begin
			if(!rst_n_in) clk_div_state<=CLK_L;
			 else 
				case(clk_div_state)
					CLK_L: begin
							if (clk_div) clk_div_state<=CLK_RISING_DEGE;  
							else clk_div_state<=CLK_L;
						end
					CLK_RISING_DEGE :clk_div_state<=CLK_H;  
					CLK_H:begin                 
							if (!clk_div) clk_div_state<=CLK_FALLING_DEGE;
							else clk_div_state<=CLK_H;
						end 
					CLK_FALLING_DEGE:clk_div_state<=CLK_L;  
					default;
				endcase
		end

reg shift_flag = 0;
reg[6:0] x_reg;
reg[2:0] y_reg;   
reg[7:0] char_reg;
reg[8:0] temp_cnt;
reg[7:0] data_reg; 
reg[2:0] data_state=IDLE; 
reg[2:0] data_state_back; 
reg[7:0] data_state_cnt=0;  
reg[3:0] shift_cnt=0; 
reg[25:0] delay_cnt=0;  
//Finite State Machine, 
always@(posedge clk_in or negedge rst_n_in)      
begin
	if(!rst_n_in) 
		begin 
			data_state<=IDLE;
			run_flag <= 1;
			data_state_cnt<=0;
			shift_flag <= 0;
			oled_cs_n_out<=HIGH;
		end
    else
		case (data_state)
			IDLE: begin
					oled_cs_n_out<=HIGH;
					data_state_cnt<=data_state_cnt+1;
					case(data_state_cnt)
						0: oled_rst_n_out <= 0;
						1: data_state<=DISPLAY;
						2: oled_rst_n_out <= 1;
						3: data_state<=DISPLAY;
						//display initial
						4: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=0; end
						5: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=1; end
						6: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=2; end
						7: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=3; end
						8: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=4; end
						//clear display
						9: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=5; end
						10: begin data_state<=CLEAR;data_state_back<=CLEAR; end
						11: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=6; end
						12: begin data_state<=CLEAR;data_state_back<=CLEAR; end
						13: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=7; end
						14: begin data_state<=CLEAR;data_state_back<=CLEAR; end
						15: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=8; end
						16: begin data_state<=CLEAR;data_state_back<=CLEAR; end
						//set start point
						17: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=5; end
						//wite the word
						18: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=2; end
						19: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=3; end
						20: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=4; end
						21: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=5; end
						22: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=6; end
						23: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=8; end
						24: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=10; end
						25: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=12; end
						//set start point
						26: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=6; end
						//wite the word
						27: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=0; end
						28: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=0; end
						29: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=0; end
						30: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=0; end
						31: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=7; end
						32: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=9; end
						33: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=11; end
						34: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=13; end
            //set start point
						35: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=7; end
						//wite the word
						36: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=18; end
						37: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=20; end
						38: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=22; end
						39: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=24; end
						40: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=26; end
						41: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=28; end
						42: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=14; end
						43: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=17; end
            //set start point
						44: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=CMD;char_reg<=8; end
						//wite the word
						45: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=19; end
						46: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=21; end
						47: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=23; end
						48: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=25; end
						49: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=27; end
						50: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=29; end
						51: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=15; end
						52: begin data_state<=DISPLAY;data_state_back<=DISPLAY;oled_dc_out<=DATA;char_reg<=16; end
						53: begin data_state_cnt<=17;run_flag <= ~run_flag; end
						default;
					endcase
				end
				
			SHIFT: begin
					if(!shift_flag)
						begin
							if (clk_div_state==CLK_FALLING_DEGE)  
								begin
									if (shift_cnt==8)  
										begin
											shift_cnt<=0;
											data_state<=data_state_back;
										end
									else begin
											oled_cs_n_out<=LOW;
											oled_data_out<=data_reg[7];   
											shift_flag <= 1;
										end
								end
						end
					else
						begin
							if (clk_div_state==CLK_RISING_DEGE)   
								begin  
									data_reg<={data_reg[6:0], data_reg[7]};  
									shift_cnt<=shift_cnt+1;
									shift_flag <= 0;
								end
						end
				end

			DISPLAY: begin
						temp_cnt<=temp_cnt+1;
						oled_cs_n_out<=HIGH;
						if (temp_cnt==16) 
							begin
								data_state<=IDLE;
								temp_cnt<=0; 
							end
						else 
							begin
								temp = (oled_dc_out==CMD)? cmd_r[char_reg]:mem[char_reg];
								case (temp_cnt)
									0 :  data_reg<=temp[127:120];
									1 :  data_reg<=temp[119:112];
									2 :  data_reg<=temp[111:104];
									3 :  data_reg<=temp[103:96];
									4 :  data_reg<=temp[95:88];
									5 :  data_reg<=temp[87:80];
									6 :  data_reg<=temp[79:72];
									7 :  data_reg<=temp[71:64];
									8 :  data_reg<=temp[63:56];
									9 :  data_reg<=temp[55:48];
									10 :  data_reg<=temp[47:40];
									11 :  data_reg<=temp[39:32];
									12 :  data_reg<=temp[31:24];
									13 :  data_reg<=temp[23:16];
									14 :  data_reg<=temp[15:8];
									15 :  data_reg<=temp[7:0];
									default;
								endcase
								data_state<=SHIFT;
							end
					end
			
			CLEAR: begin            
					data_reg<=8'h00;
					temp_cnt<=temp_cnt+1;
					oled_cs_n_out<=HIGH;
					oled_dc_out<=DATA;
					if (temp_cnt>=128) 
						begin
							temp_cnt<=0;
							data_state<=IDLE;
						end
					else data_state<=SHIFT;
				end
			
			DELAY: begin
					if(delay_cnt==DELAY_PERIOD)
						begin
							data_state<=IDLE; 
							delay_cnt<=0;
						end
					else delay_cnt<=delay_cnt+1;
				end
					   
			default;
		endcase
end

endmodule
		
  • 4
    点赞
  • 65
    收藏
    觉得还不错? 一键收藏
  • 47
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 47
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值