矩阵键盘的键值计算及编程

合集下载

【免费下载】单片机中用矩阵键盘实现计算器

【免费下载】单片机中用矩阵键盘实现计算器

col_1=1;
col_2=1;
col_3=1;
col_4=0;
keyfind(12);
col_1=0;
col_2=0;
col_3=0;
col_4=0;
//第一列输出'0'
//第二列输出'0'
//第三列输出'0'
//第四列输出'0'
//列线输出全为'0'
flag++; //每按一下标志位加 1
while(((P1&0x0f)!=0x0f)); //等待按键释放
break; case 2:
keynum=2+col_dat; break; case 4: keynum=3+col_dat; break; case 8: keynum=4+col_dat; break; }
} void keyprocess(void) {
switch(keynum) {
case 1:if(flag==1) //flag=1 表示是第一次按下,按得是被除数 num1=7; //第一个键按下对应是数字 7 if(flag==3) //flag=3 表示是第三次按下,按的是除数 num2=7; break;
计算器
1.程序要求:
用矩阵按键实现简单的加减乘除运算。
2.程序代码:
#include <reg51.h> #include <stdio.h> sbit col_1=P1^4; sbit col_2=P1^5; sbit col_3=P1^6; sbit col_4=P1^7;
unsigned char code table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f};//共阴极数 码管 unsigned char keynum,flag; unsigned char num1,num2,flag1,flag2,flag3,flag4; void keyscan(void); void display(); void keyfind(unsigned char); void keyprocess(void);

矩阵键盘程序设计

矩阵键盘程序设计

矩阵键盘程序设计矩阵键盘程序设计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)。

矩阵键盘0——15键值

矩阵键盘0——15键值
{
delay(1);//延时消抖
key=7;
while((!PINA&0X08));//等待按键松开
}
}
PORTB=0xbf;
delay(1);//延时消抖
// 按键8
if((PINB&0x01)==0)//判断PA0是否是0,是则是s1按下了
}
void main()
{
uchar i,ge,shi,num=0;
init();
while(1)
{ anjian();
shi=key/10;
ge=key%10;
write_com(0x85);
write_data(0x30+shi);
{
delay(1);//延时消抖
if((PINB&0x01)==0)//确实有按键按下
{
delay(1);//延时消抖
key=8;
while((!PINA&0X01));//等待按键松开
}
}
// 按键9
{
delay(1);//延时消抖
key=11;
while((!PINA&0X08));//等待按键松开
}
}
PORTB=0x7f;
delay(1);//延时消抖
// 按键12
if((PINB&0x01)==0)//判断PA0是否是0,是则是s1按下了
EN_1;
delay(3);
EN_0;
}
void write_data(uchar date)
{
RS_1;

矩阵键盘程序设计精简版

矩阵键盘程序设计精简版

矩阵键盘程序设计矩阵键盘程序设计引言矩阵键盘的工作原理矩阵键盘由多行和多列组成,每个按键位于特定的行和列交叉点上。

在未按下任何按键时,所有的行和列都处于高电平状态。

当按下某个按键时,该按键所在的行和列会产生短接,从而导致相应的行和列变为低电平。

为了检测按键的输入,矩阵键盘通常采用矩阵扫描的方式。

具体来说,它通过依次将一行置为低电平,然后读取相应的列的状态来判断是否有按键按下。

为了提高检测的精度,还可以采用定时器中断的方式来不断扫描键盘状态。

矩阵键盘程序设计示例下面是一个简单的矩阵键盘程序设计示例,使用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); // 延时等待}在上述示例中,我们定义了矩阵键盘的行数和列数,并指定了每个按键的字符表示。

51单片机矩阵键盘C语言编程

51单片机矩阵键盘C语言编程

/****************************************************************************** 函数名称:main() 函数功能:主函数,键值处理
******************************************************************************/
__ ____
KEY=HSM + LJC|0x0f 例如,“0”键处在第 1 行第 1 列,其 HSM=0xfe,LJC=0xe0,代入上式,可得“0” 键的键值为
__ ____ __ ____ KEY=HSM + LJC|0x0f = 0xfe + 0xe0|0x0f =0x01 + 0x10= 0x11 根据上述计算方法,可计算所有按键地键值,见下表
4
5
6
7
P11
8
9
A
Байду номын сангаас
B
P12
C
D
E
F
P13
原理图12
根据矩阵非编码键盘逐行扫描法处理流程,键盘扫描程序应包括以下内容。 (1)查询是否有键被按下。 首先单片机向行扫描口输出扫描码 F0H,然后从列检测口读取列检测信号,只要一列信 号不为“1”,即 P1 口的值不等于 F0H,则表示有键被按下;否则表示无键被按下。 键值译码公式如下: (2)查询闭合键所在的行列位置。 若有键按下,单片机将等到的列检测信号取反,列检测口中为 1 的位便是闭合键所在 的列。 列号确定后,还需要进行逐行扫描以确定行号。单片机首先向行扫描口输出第 1 行的 扫描码 FEH,按着读列检测口,若列检测信号全为“1”,则表示闭合键不在第 1 行。接着 向行扫描口输出第 2 行的扫描码 FDH,再读列检测品,……。以此类推,直到找到闭合键 所在的行,并将该行的扫描码取反保存。如果扫描完所有的行后仍没有找到闭合键,则结束 行扫描,判断本次按键是误动作。 (3)对得到的行号和列号进行译码,确定键值。 根据原理图 12 所示,1、2、3、4 行的扫描码分别为 0xfe、0xfd、0xeb、0xf7;1、2、3、 4 列的列检测数据分别为 0xe0、0xd0、0xb0、0x70。设行扫描码码子 HSM,列检测数据为 LJC,则键值为 KEY,则有

矩阵键盘编程

矩阵键盘编程

矩阵键盘编程键盘结构与类型独立式按键键盘由若干独立式按键组成。

独立式按键指每个按键作为一位占用一根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位数据。

矩阵键盘的键值计算及编程

矩阵键盘的键值计算及编程
P1口低四位是指:P1.3 P1.2 P1.1 P1.0
2 读取I/O口值的练习
.j
用程序控制单片机P2口工作,让高四位全高电平,低四位全低电平。 即:P2=0xf0; 具体实现见操作,结果如图。
P1口高四位是指:P1.7 P1.6 P1.5 P1.4
一般都是自高到低读出一个端口各脚电平 ,得到8位二进制数,再将8位二进制转换成2位十六进数。
P3口值= P3.7 P3.6 P3.5 P3.4P3.3 P3.2 P3.1 P3.0 =1111 1010=0xfa
2 读取I/O口值的练习
.j
当 程序使P2=0x0f; 外接一个两脚开关到P2口只能让P2产生如下四个新的值: 0x0e, 0x0d,0x0b,0x07 0x0d 0x0b
找出行线值 置行线所处端口位置高电平
找出列线值 置列线所处端口位置高电平
行线值+列线值=键值
计算键值一般方法
3 键盘的键值
.j
先找出行线值,再找出列线值,最后绘出矩阵键盘的键值。
总结
4×4矩阵键盘的键值 共有16个,计算键值时总是:
4 键盘扫描编程__线反转法
.j
/************键盘扫子描函数*******************/ char keyscan(void) //键盘扫描函数,键盘使用P2口 { char value_h,value_l; //value_h行值变量,value_l列值变量 P2=0xf0; //将行线所处位置置高电平 if((P2&0xf0)!=0xf0) //判断是否有键按下 { delay(10); //延时防抖 if((P2&0xf0)!=0xf0) //仍有键按下 { value_h=P2&0xf0; //读出P2口值给变量value_h P2=0x0f; //将列线所处位置置高电平 value_l=P2&0x0f; //读出P2口值给变量value_l return(value_l+value_h); //找到的键值返回给调用函数 } } }

矩阵键盘程序及原理

矩阵键盘程序及原理

程序效果:‎按下任意键‎,LED显‎示P0读回‎的数据其中‎4*4的矩‎阵键盘接P‎0口*/‎#inc‎l ude<‎r eg52‎.h> /‎/头文件‎u nsig‎n ed c‎h ar k‎e y=0x‎f f; ‎//定义‎一个变量用‎于存放按键‎值voi‎d rea‎d key(‎); ‎//读按键‎子函数,获‎取键值v‎o id m‎a in()‎ /‎/主函数‎{whi‎l e(1)‎{ ‎read‎k ey()‎; //读‎按键值i‎f(key‎!=0xf‎f) //‎判断是否有‎按键按下‎P2=~k‎e y;//‎这里取反:‎是因为LE‎D为共阴,‎显示所按下‎的值‎}}‎v oid ‎r eadk‎e y() ‎//读键盘‎子函数{‎P0=0‎x fe; ‎//将第一‎列拉低,扫‎描是否有按‎键按下,第‎一列键值为‎:0,4,‎8,C k‎e y=P0‎; //‎读取键盘值‎if(k‎e y!=0‎x fe) ‎//若ke‎y!=0x‎f e,说明‎有按键按下‎,则返回‎r etur‎n; ‎//否则‎继续扫描下‎一列P0‎=0xfd‎;key‎=P0;‎i f(ke‎y!=0x‎f d)r‎e turn‎;P0=‎0xfb;‎key=‎P0;i‎f(key‎!=0xf‎b)re‎t urn;‎P0=0‎x f7;‎k ey=P‎0;if‎(key!‎=0xf7‎)ret‎u rn;‎k ey=0‎x ff;‎}‎键盘扫‎描程序:‎从以‎上分析得到‎键盘扫描程‎序的流程图‎所示。

程序‎如下‎SCAN‎: MOV‎P1,#‎0FH‎MOV‎A,P1‎A‎N L A,‎#0FH ‎CJ‎N E A,‎#0FH,‎N EXT1‎S‎J MP N‎E XT3 ‎NE‎X T1: ‎A CALL‎D20M‎S‎M OV A‎,#0EF‎H‎N EXT2‎: MOV‎R1,A‎M‎O V P1‎,A‎MOV ‎A,P1 ‎AN‎L A,#‎0FH‎CJN‎E A,#‎0FH,K‎C ODE;‎M‎O V A,‎R1‎SETB‎C‎RLC ‎A‎J C NE‎X T2‎NEX‎T3: M‎O V R0‎,#00H‎R‎E T‎KCOD‎E: MO‎V B,#‎0FBH ‎NE‎X T4: ‎R RC A‎I‎N C B ‎JC‎NEXT‎4‎M OV A‎,R1‎SWA‎P A‎NEX‎T5: R‎R C A ‎IN‎C B‎INC‎B‎INC ‎B‎I NC B‎J‎C NEX‎T5‎NEXT‎6: MO‎V A,P‎1‎A NL A‎,#0FH‎C‎J NE A‎,#0FH‎,NEXT‎6‎M OV R‎0,#0F‎F H‎RET ‎<2‎>确定矩阵‎式键盘上何‎键被按下介‎绍一种“高‎低电平翻转‎法”。

4×4矩阵键盘的键值计算及编程

4×4矩阵键盘的键值计算及编程
低。
.j
2 读取I/O口值的练习
❖ 一般都是自高到低读出一个端口各脚电平 ,得到8位二进制 数,再将8位二进制转换成2位十六进数。
P1口值=P1.7 P1.6 P1.5 P1.4P1.3 P1.2 P1.1 P1.0 =1101 1111=0x df P3口值= P3.7 P3.6 P3.5 P3.4P3.3 P3.2 P3.1 P3.0 =1111 1010=0xfa
(4行,1列) 77 (4行,2列) 7b (4行,3列) 7d (4行,4列) 7e
.j
3 键盘的键值
总结
4×4矩阵键盘的键值 共有16个,计算键值时总是: 先找出行线值,再找出列线值,最后绘出矩阵键盘的键
值。
.j
4 键盘扫描编程__线反转法
/************键盘扫子描函数*******************/ char keyscan(void) //键盘扫描函数,键盘使用P2口 {
位置
(1行,1列) (1行,2列) (1行,3列) (1行,4列) (2行,1列) (2行,2列) (2行,3列) (2行,4列)
键值
e0+0e=ee d0+0e=de b0+0e=be 70+0e=7e
e0+0d=ed d0+0d=dd b0+0d=bd 70+0d=7d
(3行,1列) (3行,2列) (3行,3列) (3行,4列)
e0+0b=eb
d0+0b=db b0+0b=bb 70+0b=7b
(4行,1列) (4行,2列) (4行,3列) (4行,4列)
e0+07=e7
d0+07=d7 b0+07=b7 70+07=77

矩阵键盘键值的计算方法 (2)

矩阵键盘键值的计算方法 (2)

矩阵键盘键值的计算方法矩阵键盘是一种常见的输入设备,广泛应用于计算机、手机、电子器件等。

它通过将按下的键映射为一个特定的键值,实现对应用程序的输入控制。

本文将介绍矩阵键盘键值的计算方法,帮助读者了解矩阵键盘的工作原理和键值计算的方法。

一、矩阵键盘的基本原理矩阵键盘由多个行和列的按键构成,这些按键被排列成一个矩阵,行与列之间形成交叉点。

按下某个按键时,会使得对应行和列之间形成闭合电路。

矩阵键盘通过扫描行和列,检测到闭合电路,从而确定所按下的按键。

二、矩阵键盘键值计算的方法1. 扫描行和列矩阵键盘首先需要扫描行和列,以检测闭合电路。

这个过程可以通过控制行和列的输入输出来实现。

首先将所有行设置为高电平输出状态,然后逐行将其设置为低电平状态,同时检测列的输入状态。

如果某一列为低电平,则说明该行和列之间的按键闭合,即键盘检测到按键按下的动作。

2. 确定键值在检测到按键闭合后,需要进一步确定对应的键值。

这个过程需要根据键盘的布局和键盘的编码规则来实现。

一般情况下,我们可以以行列号的方式对键盘按键进行编码。

假设有N 行M 列的键盘,按下的按键位于第i 行第j 列,则键值可表示为(i-1)*M + j。

通过这种方式,我们可以根据按下的行和列号计算出对应按键的键值。

假设有一个4 行4 列的矩阵键盘,按下的按键位于第3 行第2 列。

按照上述计算方法,我们可以得到键值为(3-1)*4 + 2 = 10。

因此,按下的按键对应的键值为10。

3. 键值的应用计算出按键的键值后,我们可以将其应用于对应的应用程序中。

键值可以作为输入信号传递给应用程序,根据键值的不同,应用程序可以执行相应的操作。

例如,将键值与预先定义的按键映射表进行匹配,可以实现不同按键对应的功能,如快捷键、功能键等。

矩阵键盘键值的计算方法涉及到扫描行和列,确定键值等关键步骤。

通过扫描行和列,可以检测到按键的闭合电路;通过确定键值,可以识别所按下的按键。

这种计算方法可以广泛应用于矩阵键盘的设计和开发中,帮助我们理解矩阵键盘的工作原理和键值计算的方法,并将其应用到实际的应用程序中。

矩阵键盘的键值计算和编程课件

矩阵键盘的键值计算和编程课件

.j
景德镇学院机电系
3 键盘的键值
找列线值时,程序使P2=0xf0; P2.7列线上开关按下会使P2口值变为 0x70, 其余同理。
.j
景德镇学院机电系
键盘的键值
位置
(1行,1列) (1行,2列) (1行,3列) (1行,4列) (2行,1列) (2行,2列) (2行,3列) (2行,4列)
键值
线反转法
矩阵键盘的键值计算和编 程
景德镇学院机电系
本讲主要内容
1
键值计算基本原理
2
读取I/O口值的练习
3
键盘的键值计算
4
键盘扫描编程__线反转法
5
一个数码管显示矩阵键盘值的实验
.j
1 键值计算基本原理__“好人被带坏”
景德镇学院机电系
默认状态:单片机通电复位后P1 P2 P3口每个脚 都输出高电平,P0口要接上拉电阻才能输出高电平。
a 各脚状态标记都是红色方块。 b 用电压测量都是5V。
.j
1 键值计算基本原理__“好人被带坏”
景德镇学院机电系
要使一个引脚变为低电平有如下方法:
a 接地。 b 用逻辑状态信号人为改变。 c 编写程序使其输出低电平。
.j
1 键值计算基本原理__“好人被带坏”
景德镇学院机电系
一个低电平引脚与高电平引脚相接,结果如何? 实验结果:“好人被带坏”,即高电平引脚电压被变
(2行,1列) d7 (2行,2列) db (2行,3列) dd (2行,4列) de
(3行,1列) b7 (3行,2列) bb (3行,3列) bd (3行,4列) be
(4行,1列) 77 (4行,2列) 7b (4行,3列) 7d (4行,4列) 7e

矩阵键盘——精选推荐

矩阵键盘——精选推荐

矩阵键盘1.⾏扫描法⼯作原理(查询法)判别键盘中有⽆键按下。

向⾏线输出全0,读⼊列线状态。

如果有键按下,总有⼀列线被拉⾄低电平,从⽽使列输⼊不全为1。

查找按下键所在位置。

依次给⾏线送低电平,查列线状态。

全为1,则所按下的键不在此⾏;否则所按下的键必在此⾏且是在与零电平列线相交的交点上的那个键。

对按键位置进⾏编码。

找到所按下按键的⾏列位置后,对按键进⾏编码,即求得按键键值。

#includechar key(){char row,col, k =-1; //定义⾏、列、返回值P1=0xf0;if((P1&0xf0)==0xf0)return k; //⽆键按下,返回delay20ms(); //延时去抖if((P1&0xf0)==0xf0)return k; //抖动引起,返回for(row=0;row<4;row++) //⾏扫描{ P1=~(1<k=P1&0xf0;if(k!=0xf0) //列线不全为1,{ while(k&(1<<(col+4))) //所按键在该列col++; //查找为0列号k=row*4+col; //计算键值P1=0xf0;while((P1&0xf0)!=0xf0); //等待键释放break;} }return k; //返回键值}3.⾏列反转法⼯作原理判别键盘中有⽆键按下。

(⽅法同⾏扫描法)输⼊变输出,再读。

将上⼀步读取到的列线输⼊值从列线输出,读取⾏线值。

定位求键值。

根据上⼀步输出的列线值和读取到的⾏线值就可以确定所按下键所在的位置,从⽽查表确定键值。

#includechar key(){char code keycode[]= {0xee,0xde,0xbe,0x7e,0xed,0xdd,0xbd,0x7d, 0xeb,0xdb,0xbb,0x7b,0xe7,0xd7,0xb7,0x77}char row,col,k=-1,i;P1=0xf0;if((P1&0xf0)==0xf0)return k; //⽆键按下,返回-1 delay20ms(); //延时去抖if((P1&0xf0)==0xf0)return k; //抖动引起,返回-1 P1=0xf0;col=P1&0xf0; //⾏输出全0,读取列值P1=col|0x0f;row=P1&0x0f; //列值输出,读取⾏值//查找⾏列组合值在键盘表中位置for(i=0;i<16;i++)if((row|col)==keycode[i]) //找到,i即为键值,{ //否则,返回-1key=i; //对重复键,该⽅法break; //处理为⽆键按下}P1=0xf0;while((P1&0xf0)!=0xf0); //等待键释放return k; //返回键值}。

矩阵键盘按键的数码管显示矩阵,键盘按键的数码管显示

矩阵键盘按键的数码管显示矩阵,键盘按键的数码管显示

一、矩阵键盘按键的数码管显示1.实验目的(1)掌握VHDL语言的语法规范,掌握时序电路描述方法(2)掌握多个数码管动态扫描显示的原理及设计方法2.实验所用仪器及元器件计算机一台实验板一块电源线一根扁平线一根下载线一根3.实验任务要求设计出4*4矩阵键盘对某一按键按下就在数码管显示一个数字。

按键从左上角到右下角依次为1,2, (16)4.实验原理按键模块原理键盘扫描的实现过程如下:对于4×4键盘,通常连接为4行、4列,因此要识别按键,只需要知道是哪一行和哪一列即可,为了完成这一识别过程,我们的思想是,首先固定输出4行为高电平,然后输出4列为低电平,在读入输出的4行的值,通常高电平会被低电平拉低,如果读入的4行均为高电平,那么肯定没有按键按下,否则,如果读入的4行有一位为低电平,那么对应的该行肯定有一个按键按下,这样便可以获取到按键的行值。

同理,获取列值也是如此,先输出4列为高电平,然后在输出4行为低电平,再读入列值,如果其中有哪一位为低电平,那么肯定对应的那一列有按键按下。

键盘键值的获取:键盘上的每一个按键其实就是一个开关电路,当某键被按下时,该按键的接点会呈现0的状态,反之,未被按下时则呈现逻辑1的状态。

扫描信号由row进入键盘,变化的顺序依次为1110-1101-1011-0111-1110。

每一次扫描一排,依次地周而复始。

例如现在的扫描信号为1011,代表目前正在扫描9,10,11,12这一排的按键,如果这排当中没有按键被按下的话,则由column 读出的值为1111;反之当9这个按键被按下的话,则由column读出的值为1110。

根据上面所述原理,我们可得到各按键的位置与数码关系如表所示:1110 1110 1110 1110 1101 1101 1101 1101row1110 1101 1011 0111 1110 1101 1011 0111 column1 2 3 4 5 6 7 8键值row 1011 1011 1011 1011 0111 0111 0111 0111 column 1110 1101 1011 0111 1110 1101 1011 0111键值9 10 11 12 13 14 15 16动态显示原理为使得输入控制电路简单且易于实现,采用动态扫描的方式实现设计要求。

矩阵按键的原理及代码实现

矩阵按键的原理及代码实现

矩阵按键的原理及代码实现
独⽴按键和矩阵按键:
矩阵按键扫描原理:
⽅法⼀、逐⾏扫描,我们可以通过⾼四位轮流输出低电平来对矩阵键盘进⾏扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪⼀位为0来判断是哪⼀个按键被按下。

⽅法⼆、⾏列扫描,我们可以通过⾼四位全部输出低电平,低四位输出⾼电平,当接收到的数据,低四位不全为⾼电平时,说明有按键按下,然后通过接受的数据值,判断是哪⼀列有按键按下,然后再反过来,⾼四位输出⾼电平,低四位输出低电平,然后根据接收到的⾼四位的值判断是哪⼀⾏有按键按下,这样就能够确定是哪⼀个按键按下了。

通常我们⽤到的是⾏列扫描
代码实现:(待更新)。

单片机 矩阵键盘实验 实验报告

单片机 矩阵键盘实验 实验报告

单片机矩阵键盘实验实验报告
实验名称:单片机矩阵键盘实验
实验目的:掌握单片机矩阵键盘的原理和应用,能够使用单片机按键输入
实验内容:利用Keil C51软件,采用AT89C51单片机实现一个4x4的矩阵键盘,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。

实验步骤:
1、搭建实验电路,将矩阵键盘与单片机相连,连接好电源正负极,然后将电路焊接成一个完整的矩阵键盘输入电路。

2、打开Keil C51软件,新建一个单片机应用工程,然后编写代码。

3、通过代码实现对矩阵键盘输入的扫描功能,当按下任何一个按键时,将相应的键值传输到液晶显示屏上进行显示。

4、编译代码,生成HEX文件,下载HEX文件到单片机中,将单片机与电源相连,然后就可以测试了。

5、测试完成后,根据测试结果修改代码,重新编译生成HEX 文件,然后下载到单片机中进行验证。

实验结果:
经过测试,实验结果良好,能够准确地输入按键的值,显示在液晶屏上。

实验感想:
通过这次实验,我深深地认识到了矩阵键盘技术的重要性以及应用价值,同时也更加深入了解单片机的工作原理和应用技术,这对我的学习和工作都有很好的帮助。

(整理)单片机控制的矩阵键盘

(整理)单片机控制的矩阵键盘
INC B
INC B
INC B
JC NEXT5
NEXT6: MOV A,P1
ANL A,#0FH
CJNE A,#0FH,NEXT6
MOV R0,#0FFH
RET
键盘处理程序就作这么一个简单的介绍,实际上,键盘、显示处理是很复杂的,它往往占到一个应用程序的大部份代码,可见其重要性,但说到,这种复杂并不来自于单片机的本身,而是来自于操作者的习惯等等问题,因此,在编写键盘处理程序之前,最好先把它从逻辑上理清,然后用适当的算法表示出来,最后再去写代码,这样,才能快速有效地写好代码。
可见,键盘输出经双稳态电路之后,输出已变为规范的矩形方波。
软件上采取的措施是:在检测到有按键按下时,执行一个10ms左右(具体时间应视所使用的按键进行调整)的延时程序后,再确认该键电平是否仍保持闭合状态电平,若仍保持闭合状态电平,则确认该键处于闭合状态;同理,在检测到该键释放后,也应采用相同的步骤进行确认,从而可消除抖动的影响。
ANL A,#0FH
CJNE A,#0FH,KCODE;
MOV A,R1
SETB C
RLC A
JC NEXT2
NEXT3: MOV R0,#00H
RET
KCODE: MOV B,#0FBH
NEXT4: RRC A
INC B
JC NEXT4
MOV A,R1
SWAP A
NEXT5: RRC A
INC B
2.独立式按键的软件结构
独立式按键软件常采用查询式结构。先逐位查询每根I/O口线的输入状态,如某一根I/O口线输入为低电平,则可确认该I/O口线所对应的按键已按下,然后,再转向该键的功能处理程序。图7.4中的I/O口采用P1口,请读者自行编制相应的软件。

矩阵键盘获取键值

矩阵键盘获取键值
void delay(void)//空5个指令
{
_nop_();_nop_();_nop_();_nop_();_nop_();
}
void main(void) //入口函数
{
while(1)
{
ReadKey();//调用键盘扫描
if(l_key!=0xff)
{
if(l_key==0x01)
{
JDQ=1;
delay();
}
if(l_key==0x02)
{
JDQ=0;
delay();
}
}
}
}
//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
void ReadKey(void)//读键盘值
{
unsigned char i,j,key;
//第一部份,用扫描来读取键盘,
j=0xfe;
key=0xff;//设定初值
for (i=0;i<4;i++){
P0=j;//P0口低4位循环输出0,扫描键盘
if ((P0&0xf0)!=0xf0)//如果有键按下,P0口高4位不会全为1,
return;
}
else
SPK=0;//打开蜂鸣器
//第三部份,检测是新按键按下,获取新的键盘编码值
if(l_keyold!=key)//检测按键放开否,如果一样表明没放开,不做处理,不一样表时另一个键按下做编码转换
{
l_keyold=key;//获取键码做为放开下次的凭证
for(i=0;i<17;i++){//查表获得相应的16进制值存放l_key变量中
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
P1口高四位是指:P1.7 P1.6 P1.5 P1.4 P1口低四位是指:P1.3 P1.2 P1.1 P1.0
景德镇学院机电系
.j
2 读取I/O口值的练习
• 用程序控制单片机P2口工作,让高四位全高电平,低四位 全低电平。 即:P2=0xf0;
具体实现见操作,结果如图。
景德镇学院机电系
.j
2 读取I/O口值的练习
景德镇学院机电系
.j
3 键盘的键值
找列线值时,程序使P2=0xf0;
P2.7列线上开关按下会使P2口值变为 0x70, 其余同理。
景德镇学院机电系
.j
键盘的键值
位置
(1行,1列) (1行,2列) (1行,3列) (1行,4列) (2行,1列) (2行,2列) (2行,3列) (2行,4列)
键值
e0+0e=ee d0+0e=de b0+0e=be 70+0e=7e
输出高电平,P0口要接上拉电阻才能输出高电平。
a 各脚状态标记都是红色方块。
b 用电压测量都是5V。
景德镇学院机电系
.j
1 键值计算基本原理__“好人被带坏”
• 要使一个引脚变为低电平有如下方法:
a 接地。 b 用逻辑状态信号人为改变。 c 编写程序使其输出低电平。
景德镇学院机电系
.j
1 键值计算基本原理__“好人被带坏”
3 键盘的键值
注:行列线的排列不同,键值
分景布德镇也学不院机同电系
பைடு நூலகம்
.j
计算键值一般 方法
找出行线值
置行线所处端口位置高电平
找出列线值
置列线所处端口位置高电平
行线值+列线值=键值
3 键盘的键值
景德镇学院机电系
键盘的键值
位置
键值
(1行,1列) e7 (1行,2列) eb (1行,3列) ed (1行,4列) ee
(2行,1列) d7 (2行,2列) db (2行,3列) dd (2行,4列) de
(3行,1列) b7 (3行,2列) bb (3行,3列) bd (3行,4列) be
(4行,1列) 77 (4行,2列) 7b (4行,3列) 7d (4行,4列) 7e
.j
3 键盘的键值
总结
4×4矩阵键盘的键值 共有16个,计算键值时总是: 先找出行线值,再找出列线值,最后绘出矩阵键盘的键值
delay(10); //延时防抖 if((P2&0xf0)!=0xf0) //仍有键按下
{ value_h=P2&0xf0; //读出P2口值给变量value_h
NO 行线高电平有 变化吗?
YES 延时,防抖
P2=0x0f; //将列线所处位置置高电平 value_l=P2&0x0f; //读出P2口值给变量value_l
P2=0xf0; //将行线所处位置置高电平
if((P2&0xf0)!=0xf0) //判断是否有键按下
{
delay(10); //延时防抖
if((P2&0xf0)!=0xf0) //仍有键按下
{
value_h=P2&0xf0; //读出P2口值给变量value_h
P2=0x0f; //将列线所处位置置高电平
NO 行线高电平有 变化吗?
return(value_l+value_h); //找到的键值返回给调用函数
YES
}
} }
景德镇学院机电系
读出行线值给 Value_h变量
特意置: 列线高电平,行线 低电平,去找列值
读出列线值给 Value_l变量 算出 Value_h+Value_l 键值返回给调用者
value_l=P2&0x0f; //读出P2口值给变量value_l
return(value_l+value_h); //找到的键值返回给调用函数
}
}
景德镇学院机电系
.j
}
4 键盘扫描编程__线反转法流程分析 /************键盘扫子描函数*******************/
char keyscan(void) //键盘扫描函数,键盘使用P2口
结束
.j
5 一个数码管显示矩阵键盘值的实验
实验电路如图,显示数码管接在P1口,键盘接在P2口,第一行第一列的开关按下 数码管显示“0”,“1~F”的显示分布见图。 注:键盘上标注的“0~F”叫做执行景德值镇,学前院面机分电析系的16个值(ee~77)叫键盘的键值。.j

景德镇学院机电系
.j
4 键盘扫描编程__线反转法 /************键盘扫子描函数*******************/ char keyscan(void) //键盘扫描函数,键盘使用P2口
{
char value_h,value_l; //value_h行值变量,value_l列值变量
4×4矩阵键盘的键值计算及编程
51单片机C语言编程及Proteus 仿真
本讲主要内容
1
键值计算基本原理
2
读取I/O口值的练习
3
键盘的键值计算
4
键盘扫描编程__线反转法
5
一个数码管显示矩阵键盘值的实验
景德镇学院机电系
.j
1 键值计算基本原理__“好人被带坏”

默认状态:单片机通电复位后P1 P2 P3口每个脚都
• 一个低电平引脚与高电平引脚相接,结果如何? 实验结果:“好人被带坏”,即高电平引脚电压被变 低。
景德镇学院机电系
.j
2 读取I/O口值的练习
• 一般都是自高到低读出一个端口各脚电平 ,得到8位二进制 数,再将8位二进制转换成2位十六进数。
P1口值=P1.7 P1.6 P1.5 P1.4P1.3 P1.2 P1.1 P1.0 =1101 1111=0x df P3口值= P3.7 P3.6 P3.5 P3.4P3.3 P3.2 P3.1 P3.0 =1111 1010=0xfa
e0+0d=ed d0+0d=dd b0+0d=bd 70+0d=7d
(3行,1列) (3行,2列) (3行,3列) (3行,4列)
e0+0b=eb
d0+0b=db b0+0b=bb 70+0b=7b
(4行,1列) (4行,2列) (4行,3列) (4行,4列)
e0+07=e7
d0+07=d7 b0+07=b7 70+07=77
• 当 P2=0xf0; 外接一个两脚开关到P2口只能让P2产生如下
四个新的值: 0xe0, 0xd0,0xb0,0x70
0xe0
0x70
景德镇学院机电系
.j
2 读取I/O口值的练习
• 当 程序使P2=0x0f; 外接一个两脚开关到P2口只能让P2产
生如下四个新的值: 0x0e, 0x0d,0x0b,0x07
0x0d
0x0b
景德镇学院机电系
.j
2 读取I/O口值的练习
总结
开关接通后,如果两引脚上电平不同时,会将高电平引脚电压变 低。
景德镇学院机电系
.j
3 键盘的键值
P2口接有4×4 键盘,低四位做行线,高四位做列线。
景德镇学院机电系
.j
3 键盘的键值
找行线值时,程序使P2=0x0f;
P2.0行线上开关按下会使P2口值变为 0x0e, 其余同理。
开始
{ char value_h,value_l; //value_h行值变量,value_l列值变量 P2=0xf0; //将行线所处位置置高电平 if((P2&0xf0)!=0xf0) //判断是否有键按下 {
定义 Value_h 行值变量 Value_l 列值变量
特意置: 行线高电平,列线 低电平,去找行值
相关文档
最新文档