资源描述:
《fpga驱动lcd1602实现万年历》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、实现了从0000---9999年的时钟,其实万年历和十万年历,都是差不多,等到地球能转到9999年再改代码也不迟,哈哈!!我这里有顶层和底层文件,顶层主要是调用模块和做按键处理,具体按键防抖动原理,参见偶的以前的博文,我写完这个万年历的代码,还没来得及优化,占用了太多了逻辑门,可以进一步优化。大致思路是:第一次按下KEY1的时候,所有计时停止,再按KEY1,年就闪烁,按下KEY2和KEY3进行加减。再按KEY1,月就闪烁,按下KEY2和KEY3进行加减........依次为调年-月-日-星期-时分秒, 再次按一下KEY1,进入正常运行模式。 好了先上顶层模块moduleLCD
2、 ( rst, clk, rw, rs, en, data, key1,key2,key3 ); inputclk,rst; inputkey1,key2,key3; outputrs,en,rw; output[7:0]data; regkey1_out,key2_out,key3_out; wireclk,rst; wirers,en,rw; wire[7:0]data;制氧机,鱼跃家庭制氧机 dispU1 ( .clk(clk), .rst(rst), .rs(rs), .en(en), .rw(rw), .data(data), .k
3、ey1(key1_out), .key2(key2_out), .key3(key3_out) ); //=============key1,key2,key3按键防抖动================// regkey1_reg1,key1_reg2; regkey2_reg1,key2_reg2; regkey3_reg1,key3_reg2; reg[31:0]count; always@(posedgeclk) begin count<=count+1; if(count==500000) begin count<=0; key1_reg1<=key
4、1; 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); endendmodule 底层模块:moduledisp ( rst, clk, rw, rs, en,
5、 data, key1,key2,key3 ); inputclk,rst; inputkey1,key2,key3; outputrs,en,rw; output[7:0]data; regrs,en_sel; reg[7:0]data; reg[14:0]year; reg[7:0]shi,fen,miao,month,dat; reg[31:0]count,count1; //LCDCLK分频计数器 reglcd_clk; //2行32个数据寄存器 reg[7:0]one_1,one_2,one_3,one_4,one_5,one_6,one_7,one_8,on
6、e_9,one_10,one_11,one_12,one_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'h
7、0e 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,