基于fpga的LCD显示万年历..

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

接着我的上一篇博文,终于完善好了,前几天太忙了,没有及时上传,呵呵,今天晚上刚比较早刚好凌晨,及时上传一下,实现了从0000---9999年的时钟,其实万年历和十万年历,都是差不多,等到地球能转到9999年再改代码也不迟,哈哈!!

我这里有顶层和底层文件,顶层主要是调用模块和做按键处理,具体按键防抖动原理,参见偶的以前的博文,我写完这个万年历的代码,还没来得及优化,占用了太多了逻辑门,可以进一步优化。

大致思路是:第一次按下KEY1 的时候,所有计时停止,再按KEY1,年就闪烁,按下KEY2和KEY3 进行加减。再按KEY1,月就闪烁,按下KEY2和KEY3 进行加减........依次为调年-月-日-星期-时分秒,再次按一下KEY1,进入正常运行模式。

好了先上顶层模块

module LCD

(

rst,

clk,

rw,

rs,

en,

data,

key1,key2,key3

);

input clk,rst;

input key1,key2,key3;

output rs,en,rw;

output [7:0] data;

reg key1_out,key2_out,key3_out;

wire clk,rst;

wire rs,en,rw;

wire [7:0] data;

disp U1

(

.clk(clk),

.rst(rst),

.rs(rs),

.en(en),

.rw(rw),

.data(data),

.key1(key1_out),

.key2(key2_out),

.key3(key3_out)

);

//=============key1,key2,key3 按键防抖动================// reg key1_reg1,key1_reg2;

reg key2_reg1,key2_reg2;

reg key3_reg1,key3_reg2;

reg [31:0] count;

always @(posedge clk)

begin

count<=count+1;

if(count==500000)

begin

count<=0;

key1_reg1<=key1;

key2_reg1<=key2;

key3_reg1<=key3;

end

key1_reg2<=key1_reg1;

key2_reg2<=key2_reg1;

key3_reg2<=key3_reg1;

key1_out <= key1_reg2 & (!key1_reg1);

key2_out <= key2_reg2 & (!key2_reg1);

key3_out <= key3_reg2 & (!key3_reg1);

end

endmodule

底层模块:

module disp

(

rst,

clk,

rw,

rs,

en,

data,

key1,key2,key3

);

input clk,rst;

input key1,key2,key3;

output rs,en,rw;

output [7:0] data;

reg rs,en_sel;

reg [7:0] data;

reg [14:0] year;

reg [7:0] shi,fen,miao,month,dat;

reg [31:0]count,count1; //LCD CLK 分频计数器reg lcd_clk;

//2行32个数据寄存器

reg [7:0]

one_1,one_2,one_3,one_4,one_5,one_6,one_7,one_8,one_9,one_10,one_11,one_12,on e_13,one_14,one_15,one_16;

reg [7:0]

two_1,two_2,two_3,two_4,two_5,two_6,two_7,two_8,two_9,two_10,two_11,two_12,two_ 13,two_14,two_15,two_16;

reg [7:0] next;

parameter state0 =8'h00, //设置8位格式,2行,5*7 8'h38;

state1 =8'h01, //整体显示,关光标,不闪烁8'h0C 闪烁8'h0e

state2 =8'h02, //设定输入方式,增量不移位8'h06

state3 =8'h03, //清除显示8'h01

state4 =8'h04, //显示第一行的指令80H

state5 =8'h05, //显示第二行的指令80H+40H

scan =8'h06,

nul =8'h07;

parameter data0 =8'h10, //2行32个数据状态

data1 =8'h11,

data2 =8'h12,

data3 =8'h13,

data4 =8'h14,

data5 =8'h15,

data6 =8'h16,

data7 =8'h17,

data8 =8'h18,

data9 =8'h19,

data10 =8'h20,

data11 =8'h21,

data12 =8'h22,

data13 =8'h23,

data14 =8'h24,

data15 =8'h25,

data16 =8'h26,

data17 =8'h27,

data18 =8'h28,

相关文档
最新文档