37款传感器与执行器的提法,在网络上广泛流传,其实arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块,依照实践出真知(一定要动手做)的理念,以学习和交流为目的,这里准备逐一动手尝试系列实验,不管成功(程序走通)与否,都会记录下来—小小的进步或是搞不掂的问题,希望能够抛砖引玉。
【arduino】168种传感器模块系列实验(资料代码 仿真编程 图形编程)
实验九十:4x4按键模块 轻触开关4*4薄膜矩阵形键盘 16位单片机外扩外接控制键盘
矩阵键盘 矩阵键盘是单片机外部设备中所使用的排布类似于矩阵的键盘组。矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过电阻接正电源,并将行线所接的单片机的i/o口作为输出端,而列线所接的i/o口则作为输入。由于电路设计时需要更多的外部输入,单独的控制一个按键需要浪费很多的io资源,所以就有了矩阵键盘,常用的矩阵键盘有44和88,其中用的最多的是4*4。
组成结构,在键盘中按键数量较多时,为了减少i/o口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口(如p1口)就可以构成4*4=16个按键,比之直接将端口线用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,在需要的键数比较多时,采用矩阵法来做键盘是合理的。
薄膜键盘 是薄膜开关范畴的一例,按键较多且排列整齐有序的薄膜开关,人们习惯称之为薄膜键盘。薄膜键盘是近年来国际流行的一种集装饰性与功能性为一体的一个操作系统。由面板、上电路、隔离层、下电路四部分组成。薄膜键盘外形美观、新颖,体积小、重量轻,密封性强。具有防潮、防尘、防油污、耐酸碱、抗震及使用寿命长等特点。广泛应用于,医疗仪器,计算机控制,数码机床,电子衡器,邮电通讯,复印机,电冰箱,微波炉,电风扇,洗衣机,电子游戏机等领域。
优点 1.外形美观、新颖; 2.体积小、厚度薄、重量轻、更有利于笔记本型电脑键盘向轻、薄、短、小和 高智能化方向发展。 3.防潮、防尘、防油污及有害气体,密封性强、耐酸碱抗震。 4.使用寿命长、耐弯折。 薄膜开关电原理图 按键识别方法
这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。
一、行扫描法,又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法。
1、判断键盘中有无键按下 将全部行线y0-y3置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有列线均为高电平,则键盘中无键按下。
2、判断闭合键所在的位置 在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,即在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。
二、高低电平翻转法
首先让p1口高四位为1,低四位为0。若有按键按下,则高四位中会有一个1翻转为0,低四位不会变,此时即可确定被按下的键的行位置。然后让p1口高四位为0,低四位为1。若有按键按下,则低四位中会有一个1翻转为0,高四位不会变,此时即可确定被按下的键的列位置。最后将上述两者进行或运算即可确定被按下的键的位置。
实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。
柔性薄膜键盘 是薄膜键盘的典型形式。这类薄膜键盘之所以称为柔性,是因为该薄膜键盘的面膜层、隔离层、电路层全部由各种不同性质的软件薄膜所组成。柔性薄膜键盘的电路层,均采用电器性能良好的聚酯薄膜(pet)作为开关电路图形的载体。由于聚酯薄膜所具有性质的影响,使得该薄膜键盘具有良好的绝缘性、耐热性、抗折性和较高的回弹性。开关电路的图形,包括开关的联机及其引出线均采用低电阻,低温条件下固化的导电性涂料印刷而成。因此,整个薄膜键盘的组成,具有一定的柔软性,不仅适合于平面体上使用,还能与曲面体配合。柔性薄膜键盘引出线与开关体的本身是一体的,在制作群体开关的联机时,将其汇集于薄膜的某一处,并按设计指定的位置和标准的线距向外延伸,作为柔软的、可任意弯曲的、密封的引出导线与整机的后置电路相连。
平面立体薄膜键盘 一种使开关键体微微凸起,略高于面板,构成立体形状的薄膜键盘,称为立体键开关。立体键不仅能准确地给定键体的范围,提高辨认速度,使操作者的触觉比较敏感,同时还增进了产品外观的装饰效果. 立体键的制作,必须在面板的设计阶段就要作好安排,备有工艺孔,以便在模具压制时有精确的定位, 其立体凸起的高度一般不宜超过基材厚度的两倍。为美观产品的外观,凸起薄膜键盘的凸起可有多种变化。 模块参数 接触电阻为500 绝缘电阻100m 关键操作力150-200n 回弹时间1(ms) 寿命1亿(次) 工作温度60 1.电子特性:
额定电流:35v(dc),100ma,1w
接触电阻:10ω~500ω
(根据引线长度的不同而不同于所用材料的引线长度)
绝缘电阻:100mω100v
介电强度:250vrms(50~60hz 1min)
电击抖动:<5ms
寿命:触觉类型:≥100万次
2.机械性能
工作压力:触感:170397g(614oz)
开关行程:触摸式:0.6~1.5mm
3.环境参数
工作温度:-40至 80
储存温度:-40至 80
温度:从40,90%到95%,240小时
振动:20g,最大 (10~200hz,mil-sld-202 m204。条件b)
/*
【arduino】168种传感器模块系列实验(资料代码 仿真编程 图形编程)
实验九十:4x4按键模块 轻触开关4*4薄膜矩阵形键盘 16位单片机外扩外接控制键盘
*/
#include
const byte rows = 4;
const byte cols = 4;
char keys[rows][cols] = {
{'1','2','3','a'},
{'4','5','6','b'},
{'7','8','9','c'},
{'*','0','#','d'}
};
byte rowpins[rows] = {9, 8, 7, 6};
byte colpins[cols] = {5, 4, 3, 2};
keypad keypad = keypad( makekeymap(keys), rowpins, colpins, rows, cols );
void setup(){
serial.begin(9600);
}
void loop(){
char key = keypad.getkey();
if (key != no_key){
serial.println(key);
}
}
实验串口返回情况 实验开源仿真编程(linkboy v4.62)
实验开源图形编程(mind 、mixly、编玩边学) 实验场景图
最近研究需要用到4x4薄膜鍵盤設計。
就稍微研究了一下,有些資料參考這網站介紹還蠻清楚的。
?
?
原理就是,行1~行4送掃描碼,列1~列4讀值。
例如:?
1. 行1~行4送 (0111)2進制的值,如果列1~列4讀到(0111)就表示key 1被按下了。
2.?行1~行4送 (1101)2進制的值,如果列1~列4讀到(1011)就表示key 6被按下了。
所以verilog在寫程式的時候就要看現在是送那一列的掃描碼, 讀進來後是哪一個為0代表被按下。
[note] 其中每個列的訊號端需要接一個pull high電組 ,以防止腳位浮接。
?
程式碼如下:
?
1 // --------------------------------------------------------------------
2 // 爱游戏官网登录入口 copyright (c) 2011 by tku iclab.
3 // --------------------------------------------------------------------
4 /* use follow instruction to call the function
5
6 4x4 keypad
7 pin1 pin2 pin3 pin4 pin5 pin6 pin7 pin8
8 function row1 row2 row3 row4 col1 col2 col3 col4
9
10 fpga pin ikey_read[3] ~ ikey_read[0] | okey_scan[3] ~ okey_scan[0]
11
12 */
13 `define default_netype none
14 module keypad4x4_top (
15 iclk_50m, // 50mhz
16 irst_n, // reset_n
17
18 ikey_read, // key read
19 okey_scan, // key scan code
20
21 odval, // a trigger
22 okeycode, // key code4
23 okey
24
25 );
26 //===========================================================================
27 // port declarations
28 //===========================================================================
29 input iclk_50m;
30 input irst_n;
31
32 input [3:0] ikey_read; // key read
33 output [3:0] okey_scan; // key scan code
34
35 output odval; // a trigger
36 output [4:0] okeycode; // key code
37 output [15:0] okey;
38 //=============================================================================
39 // reg/wire declarations
40 //=============================================================================
41 reg [15:0] okey;
42 reg odval, rdval;
43 reg [3:0] okey_scan;
44 reg [4:0] okeycode;
45 wire wclk_1khz;
46 wire [2:0] wkey_dly;
47 reg [1:0] rcnt, rst;
48 reg [4:0] rkeycode, rkeycode_d1, rkeycode_d2, rkeycode_d3;
49 reg [3:0] rkey_read_dly0, rkey_read_dly1;
50 reg [3:0] rkey_read;
51 wire wclk4x;
52 reg rpresskey;
53 //=============================================================================
54 // structural coding
55 //=============================================================================
56 ///*
57 clkdiv #( .clkfreq(50000000), .exceptclk(500000), .multiplex(4) ) ux1
58 (
59 .iclk50m(iclk_50m), // 50mhz clock
60 .irst_n(irst_n),
61 .oclk(wclk_1khz), // 1ms clock
62 .osampclk(wclk4x), // multiplex expect clock, for signaltap use
63 );
64 //*/
65
66 //// send column scan
67 always@(posedge wclk_1khz or negedge irst_n) begin
68 if(!irst_n) begin
69 rcnt <= 0;
70 okey_scan <= 0;
71 rst <= 0;
72 end
73 else begin
74 case(rst)
75 2'b00: begin okey_scan <= 4'b0111; rcnt <= rcnt 2'b1;
76 if(rcnt == 3) rst <= rst 1;
77 else rst <= rst; end // 1 column
78 2'b01: begin okey_scan <= 4'b1011; rcnt <= rcnt 2'b1;
79 if(rcnt == 3) rst <= rst 1;
80 else rst <= rst;
81 end // 2 column
82 2'b10: begin okey_scan <= 4'b1101; rcnt <= rcnt 2'b1;
83 if(rcnt == 3) rst <= rst 1;
84 else rst <= rst; end // 3 column
85 default: begin okey_scan <= 4'b1110; rcnt <= rcnt 2'b1;
86 if(rcnt == 3) rst <= rst 1;
87 else rst <= rst; end // 4 column
88 endcase
89 end
90 end
91
92 // send column scan
93 always@(posedge wclk_1khz or negedge irst_n) begin
94 if(!irst_n) begin
95 okey <= 0;
96 rdval <= 0;
97 rkeycode <= 0;
98 rpresskey <= 0;
99 end
100 else begin
101 okey <= okey;
102 // read row
103 case(ikey_read)
104 4'b0111: begin // 1 row
105 okey[3:0] <= 0;
106 case(okey_scan)
107 4'b0111: begin rdval <= 1; rkeycode <= 5'd1; okey[0] <= 1; end//'1'
108 4'b1011: begin rdval <= 1; rkeycode <= 5'd2; okey[1] <= 1; end//'2'
109 4'b1101: begin rdval <= 1; rkeycode <= 5'd3; okey[2] <= 1; end//'3'
110 4'b1110: begin rdval <= 1; rkeycode <= 5'd10; okey[3] <= 1; end//'a'
111 default: begin rdval <= 0; rkeycode <= 5'd16; okey[3:0] <= 0;end//'e'
112 endcase
113 end
114 4'b1011: begin // 2 row
115 okey[7:4] <= 0;
116 case(okey_scan)
117 4'b0111: begin rdval <= 1; rkeycode <= 5'd4; okey[4] <= 1;end//'4'
118 4'b1011: begin rdval <= 1; rkeycode <= 5'd5; okey[5] <= 1;end//'5'
119 4'b1101: begin rdval <= 1; rkeycode <= 5'd6; okey[6] <= 1;end//'6'
120 4'b1110: begin rdval <= 1; rkeycode <= 5'd11; okey[7] <= 1;end //'b'
121 default: begin rdval <= 0; rkeycode <= 5'd16; okey[7:4] <= 0;end //'e'
122 endcase
123 end
124 4'b1101: begin // 3 row
125 okey[11:8] <= 0;
126 case(okey_scan)
127 4'b0111: begin rdval <= 1; rkeycode <= 5'd7; okey[8] <= 1;end//'7'
128 4'b1011: begin rdval <= 1; rkeycode <= 5'd8; okey[9] <= 1;end//'8'
129 4'b1101: begin rdval <= 1; rkeycode <= 5'd9; okey[10] <= 1;end//'9'
130 4'b1110: begin rdval <= 1; rkeycode <= 5'd12; okey[11] <= 1;end//'c'
131 default: begin rdval <= 0; rkeycode <= 5'd16; okey[11:8] <= 0;end //'e'
132 endcase
133 end
134 4'b1110: begin // 4 row
135 okey[15:12] <= 0;
136 case(okey_scan)
137 4'b0111: begin rdval <= 1;rkeycode <= 5'd14; okey[12] <= 1; end//'*'
138 4'b1011: begin rdval <= 1;rkeycode <= 5'd0; okey[13] <= 1;end//'0'
139 4'b1101: begin rdval <= 1;rkeycode <= 5'd15; okey[14] <= 1;end//'#'
140 4'b1110: begin rdval <= 1;rkeycode <= 5'd13; okey[15] <= 1;end//'d'
141 default: begin rdval <= 0;rkeycode <= 5'd16; okey[15:12] <= 0;end//'e'
142 endcase
143 end
144 4'b1111: begin // 4 row
145 rdval <= 0; rkeycode <= 5'd16; okey <= okey;
146 case(okey_scan)
147 4'b0111: begin rdval <= 1; rkeycode <= 5'd1; okey[0] <= 0;
148 okey[4] <= 0;okey[8] <= 0;okey[12] <= 0;end//'1'
149 4'b1011: begin rdval <= 1; rkeycode <= 5'd2; okey[1] <= 0;
150 okey[5] <= 0;okey[9] <= 0;okey[13] <= 0;end//'1'end//'2'
151
152 4'b1101: begin rdval <= 1; rkeycode <= 5'd3; okey[2] <= 0;
153 okey[6] <= 0;okey[10] <= 0;okey[14] <= 0;end//'1'end//'3'
154 4'b1110: begin rdval <= 1; rkeycode <= 5'd10; okey[3] <= 0;
155 okey[7] <= 0;okey[11] <= 0;okey[15] <= 0;end//'1'end//'a'
156 default: begin rdval <= 0; rkeycode <= 5'd16; okey <= okey;end//'e'
157 endcase
158
159
160 end
161 default: begin
162 rdval <= 0; rkeycode <= 5'd16;
163 okey <= okey;// no key press
164 end
165 endcase
166 end
167 end
168
169
170
171 // disbounce
172 always@(posedge wclk_1khz or negedge irst_n) begin
173 if(!irst_n) begin
174 odval <= 0;
175 okeycode <= 5'd16;
176 end
177 else begin
178 if( rdval ) begin
179 okeycode <= rkeycode;
180 odval <= 1;
181 end
182 else begin
183 okeycode <= okeycode;
184 odval <= 0;
185
186 end
187 end
188 end
189
190 endmodule
?
转载于:https://www.cnblogs.com/lishyhan/p/7218783.html
【实例简介】
使用stm32搭建的矩阵薄膜键盘,固件库版本,..c.h拉过去,就可以用了
【实例截图】
【核心代码】
4x4矩阵薄膜键盘
└── topapex_4x4矩阵键盘
├── readme.txt
├── keilkill.bat
├── key.c
├── key.h
└── 控制类程序框架
├── core
│?? ├── core_cm3.c
│?? ├── core_cm3.h
│?? └── startup_stm32f10x_hd.s
├── driver
│?? ├── mpu9250.c
│?? ├── mpu9250.h
│?? ├── adc.c
│?? ├── adc.h
│?? ├── delay.c
│?? ├── delay.h
│?? ├── gpio.c
│?? ├── gpio.h
│?? ├── iic1.c
│?? ├── iic1.h
│?? ├── iicsoft.c
│?? ├── iicsoft.h
│?? ├── iwdg.c
│?? ├── iwdg.h
│?? ├── key.c
│?? ├── key.h
│?? ├── pid.c
│?? ├── pid.h
│?? ├── pwm.c
│?? ├── pwm.h
│?? ├── uart1.c
│?? └── uart1.h
├── libraries
还没有评论,来说两句吧...