硬件电路图如下:
1
module key
2
3
(
4
5
clk, //50MHZ
6
7
reset,
8
9
row, //行
10
11
col, //列
12
13
key_value //键值
14
15
);
16
17
input 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
43
always @(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
129
begin
130
131
col_reg<=col; //保存扫描列值
132
133
row_reg<=row; //保存扫描行值
134
135
state<=5;
136
137
key_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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208