矩阵键盘的键值计算及编程
景德镇学院机电系
.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 列值变量
特意置: 行线高电平,列线 低电平,去找行值
【免费下载】单片机中用矩阵键盘实现计算器
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键值
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语言编程
/****************************************************************************** 函数名称: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位数据。
矩阵键盘的键值计算及编程
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的矩阵键盘接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>确定矩阵式键盘上何键被按下介绍一种“高低电平翻转法”。
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
