////////////////////////////////////////////////////////////////////////////////// // // Przykład użycia sterownika wyświetlacza LCD // // (C) 2009 Zbigniew Hajduk // http://zh.kia.prz.edu.pl // ////////////////////////////////////////////////////////////////////////////////// module lcd_test1(input CLK_50MHZ, input BTN_SOUTH,BTN_WEST,BTN_EAST,BTN_NORTH, output LCD_E,LCD_RS,LCD_RW, inout [7:0] LCD_DB, output [7:0] LED); reg [2:0] ss; reg [5:0] c; reg clk_1MHz,WR_EN; reg [4:0] ct; wire [7:0] LCD_BUS; wire [8:0] DATA_IN; reg [7:0] ASCII; reg CR; debouncer d1(.clk(CLK_50MHZ), .PB({BTN_SOUTH,BTN_WEST,BTN_EAST,BTN_NORTH}), .BUTTONS({sw1,sw2,sw3,sw4})); //(1) lcd_putchar_8 d2(.CLK_1MHZ(clk_1MHz),.CLK_WR(CLK_50MHZ),.WR_EN(WR_EN), .RST(~sw1),.BF(BUSY_FLAG),.DATA_IN(DATA_IN), .LCD_E(LCD_E),.LCD_RS(LCD_RS),.LCD_RW(LCD_RW), .LCD_DB(LCD_BUS)); assign LCD_DB=LCD_RW?8'hzz:LCD_BUS; //(2) assign BUSY_FLAG=LCD_DB[7]; //(3) assign DATA_IN=(c==0)?9'h001:(CR?9'h0c0:{1'b1,ASCII+c}); assign LED=ASCII; always @(posedge CLK_50MHZ) if(sw1) ss<=0; else case(ss) 0: begin c<=0; WR_EN<=0; CR<=0; ASCII<=8'd48; ss<=1; end 1: begin c<=0; WR_EN<=0; if(sw2) ss<=2; end 2: begin WR_EN<=1; ss<=3; end 3: begin WR_EN<=0; if(CR) begin CR<=0; ss<=2; end else ss<=4; end 4: begin c<=c+1; if(c==6'd14) ss<=5; else if(c==6'd30) ss<=6; else ss<=2; end 5: begin CR<=1; ss<=2; end 6: begin ASCII<=ASCII+1; ss<=7; end 7: begin if(~sw2) ss<=1;end endcase always @(posedge CLK_50MHZ) if (ct<24) ct<=ct+1; else begin ct<=0; clk_1MHz<=~clk_1MHz; end endmodule