链接:https://pan.baidu.com/s/161TdhsyHZzR-XpEGhZbqYw
提取码:1234
功能要求是:
1、能将键盘输入数据的十六进制代码显示在数码管上;
2、能将按键对应的字符显示在字符型液晶屏上;
3、能将按键对应的字符显示在VGA上;
部分参考代码:
/************************************************************************************/
//LCD1602的显示
//
/************************************************************************************/
module lcd1602(
clk,
reset_n,
lcd_rs,
lcd_en,
lcd_rw,
lcd_data,
back_light,
dataout_ASCII
);
input clk,reset_n;//时钟、复位
input [7:0] dataout_ASCII;//PS2数据输入 ASCII码
output lcd_rs,lcd_en,lcd_rw,back_light;//指令/数据控制、片选、读写控制、背光控制
output [7:0] lcd_data;//数据线
reg lcd_rs;//指令/数据控制
reg [7:0] lcd_data;//数据线
reg [7:0] current_state;//当前状态
reg [1:0] state_counter;//状态计数
reg en_temp;//使能标志
reg [15:0] clk_counter;//时钟计数
reg clk_en;//时钟使能
//reg [7:0] ps_datain_temp;
assign back_light=1'b1;//一直设置为高电平
assign lcd_rw=1'b0;//一直为写状态
/********************状态编码******************************/
parameter set0=8'b0000_0000,
set1=8'b0000_0001,
set2=8'b0000_0011,
set3=8'b0000_0100,
set4=8'b0000_0101,
data1=8'b0000_1000,
data2=8'b0000_1001,
data3=8'b0000_1010,
data4=8'b0000_1011,
data5=8'b0000_1100,
data6=8'b0000_1101,
data7=8'b0000_1110,
data8=8'b0000_1111,
data9=8'b0001_0000,
data10=8'b0001_0001,
stop=8'b1111_1111;
/**************状态转换时钟***********************/
always @(posedge clk)
begin
if(clk_counter==16'h8000)
begin
clk_counter<=16'h0;
clk_en <= ~clk_en;
end
else
clk_counter <= clk_counter+1'b1;
end
/**************状态转换**************************///
always @(posedge clk_en or negedge reset_n)
begin
if(!reset_n)
begin
current_state <= set0;
en_temp <= 1'b0;
lcd_data <= 8'b0000_0000;
lcd_rs<=1'b0;
state_counter <= 2'd0;
end
else
begin
case (current_state)
/*********************************************************************************/
set0:begin lcd_rs<=1'b0;lcd_data<=8'h38;current_state<=set1; end//显示模式设置
set1:begin lcd_rs<=1'b0;lcd_data<=8'h0c;current_state<=set2; end//显示开及光标设置
set2:begin lcd_rs<=1'b0;lcd_data<=8'h06;current_state<=set3; end//显示光标移动设置
set3:begin lcd_rs<=1'b0;lcd_data<=8'h01;current_state<=set4; end//显示清屏
set4:begin lcd_rs<=1'b0;lcd_data<=8'h80;current_state<=data1; end//设置第一行地址
/***********************************************************************************/
data1:begin lcd_rs<=1'b1;lcd_data<="K";current_state<=data2; end//显示第1个字符
data2:begin lcd_rs<=1'b1;lcd_data<="e";current_state<=data3; end//显示第2个字符
data3:begin lcd_rs<=1'b1;lcd_data<="y";current_state<=data4; end//显示第3个字符
data4:begin lcd_rs<=1'b1;lcd_data<="_";current_state<=data5; end//显示第4个字符
data5:begin lcd_rs<=1'b1;lcd_data<="P";current_state<=data6; end//显示第5个字符
data6:begin lcd_rs<=1'b1;lcd_data<="u";current_state<=data7; end//显示第6个字符
data7:begin lcd_rs<=1'b1;lcd_data<="t";current_state<=data8; end//显示第7个字符
data8:begin lcd_rs<=1'b1;lcd_data<=":";current_state<=data9; end//显示第8个字符
data9:begin lcd_rs<=1'b1;lcd_data<= {4'b0011,dataout_ASCII[7:4]};current_state<=data10; end//显示第9个字符
data10:begin lcd_rs<=1'b1;lcd_data<= {4'b0011,dataout_ASCII[3:0]};current_state<=stop; end//显示第10个字符
/*********************************************************************************/
stop:begin //控制指令与数据写入的次数
lcd_rs <= 1'b0;
if(state_counter == 2'd2)
begin
en_temp <= 1'b0;
current_state <= set4;//最后数据写入完成后将lcd_en线拉高
state_counter <= 2'd0;
lcd_data <= 8'b0000_0000;
end
else
begin
current_state <= stop;
state_counter <= state_counter + 1'b1;
lcd_data <= 8'b0000_0000;
end
end
default: current_state <= set0;
endcase
end
end
assign lcd_en = clk_en | en_temp;//lcd_en为‘1’有效
endmodule
.