基于FPGA的键盘编解码演示系统

链接: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



.

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值