Verilog HDL 4*4矩阵键盘扫描程序

硬件电路图如下:


1module key
2
3(
4
5 clk, //50MHZ
6
7 reset,
8
9 row, //行
10
11 col, //列
12
13 key_value  //键值
14
15);
16
17input clk,reset;
18
19 input [3:0] row;
20
21 output [3:0] col;
22
23 output [3:0] key_value;
24
25
26 reg [3:0] col;
27
28 reg [3:0] key_value;
29
30 reg [5:0] count; //delay_20ms
31
32 reg [2:0] state; //状态标志
33
34 reg key_flag; //按键标志位
35
36 reg clk_500khz; //500KHZ时钟信号
37
38 reg [3:0] col_reg; //寄存扫描列值
39
40 reg [3:0] row_reg; //寄存扫描行值
41
42
43always @(posedge clk or negedge reset)
44
45   if(!reset) begin clk_500khz<=0; count<=0; end
46
47   else
48
49    begin
50
51      if(count>=50) begin clk_500khz<=~clk_500khz;count<=0;end
52
53      else count<=count+1;
54
55    end
56
57
58
59 always @(posedge clk_500khz or negedge reset)
60
61   if(!reset) begin col<=4'b0000;state<=0;end
62
63   else
64
65    begin
66
67     case (state)
68
69      0:
70
71         begin
72
73         col[3:0]<=4'b0000;
74
75         key_flag<=1'b0;
76
77         if(row[3:0]!=4'b1111) begin state<=1;col[3:0]<=4'b1110;end //有键按下,扫描第一行
78
79         else state<=0;
80
81         end
82
83      1:
84
85         begin
86
87          if(row[3:0]!=4'b1111) begin state<=5;end   //判断是否是第一行
88
89          else  begin state<=2;col[3:0]<=4'b1101;end  //扫描第二行
90
91         end
92
93      2:
94
95         begin
96
97         if(row[3:0]!=4'b1111) begin state<=5;end    //判断是否是第二行
98
99         else  begin state<=3;col[3:0]<=4'b1011;end  //扫描第三行
100
101         end
102
103      3:
104
105         begin
106
107         if(row[3:0]!=4'b1111) begin state<=5;end   //判断是否是第三一行
108
109         else  begin state<=4;col[3:0]<=4'b0111;end  //扫描第四行
110
111         end
112
113      4:
114
115         begin
116
117         if(row[3:0]!=4'b1111) begin state<=5;end  //判断是否是第一行
118
119         else  state<=0;
120
121         end
122
123      5:
124
125         begin
126
127          if(row[3:0]!=4'b1111)
128
129begin
130
131 col_reg<=col; //保存扫描列值
132
133row_reg<=row; //保存扫描行值
134
135state<=5;
136
137key_flag<=1'b1; //有键按下
138
139 end
140
141          else
142
143            begin state<=0;end
144
145         end
146
147     endcase
148
149    end
150
151
152
153 always @(clk_500khz or col_reg or row_reg)
154
155     begin
156
157        if(key_flag==1'b1)
158
159                begin
160
161                     case ({col_reg,row_reg})
162
163                      8'b1110_1110:key_value<=0;
164
165                      8'b1110_1101:key_value<=1;
166
167                      8'b1110_1011:key_value<=2;
168
169                      8'b1110_0111:key_value<=3;
170
171
172
173                      8'b1101_1110:key_value<=4;
174
175                      8'b1101_1101:key_value<=5;
176
177                      8'b1101_1011:key_value<=6;
178
179                      8'b1101_0111:key_value<=7;
180
181
182
183                      8'b1011_1110:key_value<=8;
184
185                      8'b1011_1101:key_value<=9;
186
187                      8'b1011_1011:key_value<=10;
188
189                      8'b1011_0111:key_value<=11;
190
191
192
193                      8'b0111_1110:key_value<=12;
194
195                      8'b0111_1101:key_value<=13;
196
197                      8'b0111_1011:key_value<=14;
198
199                      8'b0111_0111:key_value<=15;
200
201                     endcase
202
203              end
204
205   end
206
207 endmodule
208

时间: 2024-11-08 22:33:17

Verilog HDL 4*4矩阵键盘扫描程序的相关文章

j矩阵键盘-verilog 实现不了矩阵键盘扫描啊,调了两天了,数码管还是乱码

问题描述 verilog 实现不了矩阵键盘扫描啊,调了两天了,数码管还是乱码 哪位大神有源代码,求帮忙发到我邮箱里379810405@qq.com verilog新手求解救!拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托拜托- 解决方案 http://wenku.baidu.com/link?url=Fy0dimklpMDms7dCqfYzKMO23xeCu5yxC90x78cKqv6f84cuxJrpSd_kxrGMgwS5JrgX7yW4wsdYrvqc3In9

51单片机的键盘扫描程序

 51单片机的键盘扫描程序,算法简单有效,键盘_不采用定时器_不延时,按键在松手后有效,灵敏度高,消耗资源少,运行效率高. /****************************************  键盘_不采用定时器_不延时  特点:  按键在松手后有效,灵敏度高,消耗资源少,运行效率高    独立键盘为:K01=P2^4;K02=P2^5;K03=P2^6;K04=P2^7;  矩阵键盘为:行(上到下)_P2.3_P2.2_P2.1_P2.0             列(左到右)_

Win10 IoT C#开发 6 - 4x4矩阵键盘扫描

原文:Win10 IoT C#开发 6 - 4x4矩阵键盘扫描 Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 上一章我们讲了 Win10 IoT 如何对本地 IoT 设备内嵌 SQLite 数据库进行 CURD 操作 ,这章我们来学习如何使用 GPIO Pin 扫描4x4矩阵键盘按键状态.如果对安装部署过程还不熟悉可以参考前几篇文章,Raspberry

51单片机矩阵键盘扫描问题

问题描述 51单片机矩阵键盘扫描问题 51单片机矩阵键盘动态扫描,我就看见例程编的程序都有个把io口值赋给一个temp,例如P3=temp然后再位与,然后再判断temp......我的问题就是为毛不直接判断P3口的值,多此一举干什么,直接用P3来判断按键按下不可以吗,大神门们求解 解决方案 51单片机矩阵键盘扫描 解决方案二: 键盘有抖动现象,需要判断是否是误按了,如果误按了一下,这个时间很短,所以显然不能用P口直接判断 解决方案三: 转换成汇编指令后就会有不同的. 解决方案四: 抖动呀,你按下

矩阵键盘

/*-----------------------------------------------   名称:矩阵键盘   日期:2009.5   修改:无   内容:通过反转法循环扫描矩阵键盘,并通过数码管显示数据 ------------------------------------------------*/ #include<reg52.h> //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define uchar unsigned char #define u

编译码 vhdl-求一个vhdl语言写的键盘防抖程序

问题描述 求一个vhdl语言写的键盘防抖程序 求一个vhdl写的epm1270144C5的4*4矩阵键盘防抖动程序啊 小女子必有重谢.没有c币(????ω????) 解决方案 http://wenku.baidu.com/link?url=obGdrul7gCtI7OLqRzv127Lhq9zdPXgWTalKS0VAxGbkP-qTiYEzp7M768Ibdg3LVEp56xeikwO4W0NMREMWmrTEtt-94ILeA_HrRR0VNRG 解决方案二: (http://wenku.b

51单片机矩阵键盘的扫描结果返回给主函数的问题

问题描述 51单片机矩阵键盘的扫描结果返回给主函数的问题 主程序是一个交通灯,现在加了个检测功能.就是4个路口,每个路口用10位的拨码开关检测车辆数量,然后判断是否该减少该路口的红灯时间. 现在问题是:我检测了四个路口的按键信息并返回给主程序,但是四个路口的返回数据发生错乱. 例如:假设初始红灯时间设为10s,东西南北按键信息分别是 1,2,3,4.那接下来东西方向红灯应该只有8s(东西两个数据里取最大的),南北红灯应该只有6s. 但实际上东西红灯时间也减少为6s了. 下面是所有程序:[交通灯程

OpenRisc入门(2) 将C语言代码转换成verilog HDL或者VHDL

引言 如何将C语言代码转换成verilog HDL或者VHDL呢? 2.1 在线转换: http://c-to-verilog.com/online.html C-to-Verilog.com是海法(Haifa)大学高层次综合领域的一个学术研究而产生的一个网站. 这个网站所用的编译器是SystemRacer综合系统的一个修改版本.这个编译器的源码可用于研究目的,并且已经发给了很多编译器的研究组织. 此外还有一些文章可供参考,这些文章介绍了这个综合器的实现原理. 2.2 下载源码,然后安装,再使用

矩阵键盘控制ADC0832端口

问题描述 矩阵键盘控制ADC0832端口 各位前辈,我编了一个有由矩阵键盘控制ADC0832端口的电路,调不出来,怎么破?要求是在键盘输入一个数值(0~255),这个数值相应为ADC0832的端口输入得值,按Enter键结束.程序如下 #include "iom128v.h" #include "macros.h" #include "keym.h" #define uchar unsigned char ; #define uint unsig