矩阵键盘的键值计算及编程
- 格式:ppt
- 大小:318.00 KB
- 文档页数:3
矩阵键盘程序设计矩阵键盘程序设计1.引言2.矩阵键盘的工作原理矩阵键盘由多行多列的按键组成,每个按键都与行线和列线相交。
当按下某一个按键时,行线和列线会形成一个闭合电路,通过这个闭合电路来传递按键的信号。
通过扫描行线和列线的状态,可以确定用户按下了哪个按键。
3.矩阵键盘的程序设计在程序设计中,需要初始化矩阵键盘的引脚配置,即将每个行线和列线连接到相应的引脚上。
然后,通过循环扫描行线和列线的状态,判断用户是否按下了某个按键。
一般情况下,矩阵键盘的扫描速度比较快,可以采用中断的方式来进行扫描,提高响应速度。
以下是一个简单的矩阵键盘程序设计示例:import RPi.GPIO as GPIO初始化引脚配置row_pins = [11, 13, 15, 16] 行引脚col_pins = [18, 22, 24, 26] 列引脚GPIO.setmode(GPIO.BOARD)设置行引脚为输出模式,列引脚为输入模式for pin in row_pins:GPIO.setup(pin, GPIO.OUT)for pin in col_pins:GPIO.setup(pin, GPIO.IN)循环扫描矩阵键盘while True:for row in row_pins:设置当前行引脚为低电平GPIO.output(row, GPIO.LOW)for col in col_pins:判断当前列引脚是否为高电平,即判断用户是否按下了某个按键if GPIO.input(col) == GPIO.HIGH:处理按键事件print(\。
矩阵键盘的编程⽅法——读取键值矩阵键盘的使⽤在单品机的学习当中⼗分⼴泛,可是对于许多新⼿,包括本⼈有时也是搞不明⽩,昨天晚上和今天早上的思考和同⾏们的讨论,终于有了点头绪,所以想记录下读取键盘的思路。
在单⽚机的学习版中,矩阵键盘通常如下图设计:下⾯就以按下S16键来讲解其思路:⾸先:P3的⾼位P3.4~P3.7输出为0,低位P3.0~P3.3输出为1;即P3=0x0F,当按下S16键后(有消抖动过程),P3.3的值为0,则P3的值更新为0x07;其次:P3的⾼位P3.4~P3.7输出为1,低位P3.0~P3.3输出为0;即P3=0xF0,当按下S16键后(有消抖动过程),P3.4的值为0,则P3的值更新为0xE0;最后将两个值相加得P3=0xE7;在keyscan()函数(假设我们的键盘扫描程序为unsigned char keyscan())返回其键盘的值供后续的程序调⽤,通常会有⼀个switch块根据其返回值来确定输出的是哪⼀个数值。
下⾯提供⼀段KeilC51语⾔的代码来解释⼀下:1. /*------------------------------------------------2. 键盘扫描程序3. ------------------------------------------------*/4. uchar keyscan( void ) //键盘扫描函数,使⽤⾏列反转扫描法5. {6. uchar cord_h,cord_l;//⾏列值中间变量7. P3 = 0x0f; //⾏线输出全为08. cord_h = P3 & 0x0f; //读⼊列线值9. if( cord_h != 0x0f ) //先检测有⽆按键按下10. {11. delay( 100 ); //去抖12. if( cord_h != 0x0f )13. {14. cord_h = P3 & 0x0f; //读⼊列线值15. P3 = cord_h | 0xf0; //输出当前列线值16. cord_l = P3 & 0xf0; //读⼊⾏线值17. return( cord_h + cord_l );//键盘最后组合码值18. }19. }20. return( 0xff ); //返回该值21. }22.⾸先把P3的⼝赋值为0x0f,同时把P3和0x0f赋值给cord_h(⾏的数值),倘若有按键按下,那么P3的值就会改变,随后cord_h的只也会随之变化,经过消抖之后记录cord_h的值,即cord_h = P3 & 0x0f;(若以S16为例,那么P3.3的值变为0,所以cord_h的值就会变为0x07;)接下来:P3 = cord_h | 0xf0;意在不改变P3的第四位,把P3的⾼四位赋为⾼电平,那么P3=0x0f7;到了关键的⼀步:cord_l = P3 & 0xf0;我当初以为cord_l=0xf0呢,结果就和程序运⾏的不⼀样喽,最后还是问了我的同⾏(⾮常感谢刘伟同志!指点迷津!),其实在第⼆个if语⾔内,S16已经被按下了的,所以P3的值⽴刻就变为0x0e的了,以⾄于cord_l=0x0e,最后返回⾏和列的和return( cord_h + cord_l );(0xe7)。
矩阵键盘程序设计矩阵键盘程序设计引言矩阵键盘的工作原理矩阵键盘由多行和多列组成,每个按键位于特定的行和列交叉点上。
在未按下任何按键时,所有的行和列都处于高电平状态。
当按下某个按键时,该按键所在的行和列会产生短接,从而导致相应的行和列变为低电平。
为了检测按键的输入,矩阵键盘通常采用矩阵扫描的方式。
具体来说,它通过依次将一行置为低电平,然后读取相应的列的状态来判断是否有按键按下。
为了提高检测的精度,还可以采用定时器中断的方式来不断扫描键盘状态。
矩阵键盘程序设计示例下面是一个简单的矩阵键盘程序设计示例,使用Arduino开发板和Keypad库来实现。
在该示例中,我们假设矩阵键盘由3行4列组成,使用数字1-9和星号()作为按键。
cppinclude <Keypad.h>const byte ROWS = 3; // 定义行数const byte COLS = 4; // 定义列数char keys[ROWS][COLS] = {{'1','2','3','A'},{'4','5','6','B'},{'7','8','9','C'}};byte rowPins[ROWS] = {9, 8, 7}; // 设置行引脚byte colPins[COLS] = {6, 5, 4, 3}; // 设置列引脚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); // 打印按下的按键到串口}delay(100); // 延时等待}在上述示例中,我们定义了矩阵键盘的行数和列数,并指定了每个按键的字符表示。
矩阵键盘编程键盘结构与类型独立式按键键盘由若干独立式按键组成。
独立式按键指每个按键作为一位占用一根I/O口线,直接用I/O口线构成单个按键电路。
独立式按键键盘可分为中断方式和查询方式两种。
独立式按键键盘优点是配置灵活,软件结构简单,操作速度快;缺点是按键多时I/O口浪费较大,故只在按键数目不多时采用。
行列式键盘(矩阵式键盘)用I/O口线组成行、列结构,按键设置在行列的交点上。
在按键较多时可节省I/O口线,如4×8行列结构可构成32个键的键盘。
行列式键盘键输入过程及接口软件应解决的任务键开关状态的可靠输入主要应解决抖动问题。
对按键编码以便识别对按键编码,使不同的按键有不同的键值或键号。
按键状态的输入方式有中断方式与查询方式两种。
编制键盘程序检测有无按键按下、去抖动、按键信息的逻辑处理、输出确定的键号等。
行列式键盘(矩阵式键盘)及接口程序设计行列式键盘的结构及键值赋值方法键盘行线的一端经上拉电阻接+5v电源,另一端接单片机的输入口(因而各输入口均被钳位于高电平)。
各列线的一端接单片机的输出口,另一端悬空。
按键设置在行列线的交点上,行、列线分别连接到按键的两端,按键按下则相应交点的行列线接通。
由图可见,矩阵式键盘接口的设计思想是把键盘既作为输入设备又作为输出设备对待的。
为了让CPU能识别是哪个按键被按下,必须给每个按键都分配一个键号(一般以十进制数表示)。
例如,4×4列矩阵式键盘共16个按键,键号依次按顺序排列为0~15。
对行列式键盘的每个按键,还有一个更重要的概念:键值或者说键码。
键值是一个可表征按键状态的8位数据,不同的按键有不同的键值。
按键后根据键值便能转到相应的键处理子程序,实现键盘的数据输入功能或命令处理功能。
同一个按键的键值和键号可以相同,也可以不相同,这主要取决于键盘的结构与采用的编码方法。
对行列式键盘来说,识别被按键的位置也就是找出被按键所在行和列的坐标值。
对于4行×4列行列式键盘,被按键所在行和列的坐标值为两个4位数据;而对于8行×8列行列式键盘,则为两个8位数据。
程序效果:按下任意键,LED显示P0读回的数据其中4*4的矩阵键盘接P0口*/#incl ude<r eg52.h> //头文件u nsign ed ch ar ke y=0xf f; //定义一个变量用于存放按键值void read key(); //读按键子函数,获取键值vo id ma in() //主函数{whil e(1){ readk ey(); //读按键值if(key!=0xff) //判断是否有按键按下P2=~ke y;//这里取反:是因为LED为共阴,显示所按下的值}}v oid r eadke y() //读键盘子函数{P0=0x fe; //将第一列拉低,扫描是否有按键按下,第一列键值为:0,4,8,C ke y=P0; //读取键盘值if(ke y!=0x fe) //若key!=0xf e,说明有按键按下,则返回r eturn; //否则继续扫描下一列P0=0xfd;key=P0;i f(key!=0xf d)re turn;P0=0xfb;key=P0;if(key!=0xfb)ret urn;P0=0x f7;k ey=P0;if(key!=0xf7)retu rn;k ey=0x ff;}键盘扫描程序:从以上分析得到键盘扫描程序的流程图所示。
程序如下SCAN: MOVP1,#0FHMOVA,P1AN L A,#0FH CJN E A,#0FH,N EXT1SJ MP NE XT3 NEX T1: A CALLD20MSM OV A,#0EFHN EXT2: MOVR1,AMO V P1,AMOV A,P1 ANL A,#0FHCJNE A,#0FH,KC ODE;MO V A,R1SETBCRLC AJ C NEX T2NEXT3: MO V R0,#00HRE TKCODE: MOV B,#0FBH NEX T4: R RC AIN C B JCNEXT4M OV A,R1SWAP ANEXT5: RR C A INC BINCBINC BI NC BJC NEXT5NEXT6: MOV A,P1A NL A,#0FHCJ NE A,#0FH,NEXT6M OV R0,#0FF HRET <2>确定矩阵式键盘上何键被按下介绍一种“高低电平翻转法”。