上海专业网站建站公,广州建外贸网站公司简介,门户系统大全,挺好的网页链接6.1矩阵键盘
矩阵键盘#xff1a; 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 1.数码管扫描(输出扫描) 原理:显示第1位→显示第2位→显示第3位→ …… ,然后快速循环这个过程,最终实现所…6.1矩阵键盘
矩阵键盘 · 在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式 · 采用逐行或逐列的“扫描”,就可以读出任何位置按键的状态 1.数码管扫描(输出扫描) 原理:显示第1位→显示第2位→显示第3位→ …… ,然后快速循环这个过程,最终实现所有数码管同时显示的效果 2.矩阵键盘扫描(输入扫描) 原理:读取第1行(列)→读取第2行(列)→读取第3行(列)→ …… ,然后快速循环这个过程,最终实现所有按键同时检测的效果 · 以上两种扫描方式的共性:节省I/O口 main.c
#include REGX52.H
#include Delay.h //包含Delay头文件
#include LCD1602.h //包含LCD1602头文件
#include MatrixKey.h //包含矩阵键盘头文件unsigned char KeyNum;void main()
{LCD_Init(); //LCD初始化LCD_ShowString(1,1,MatrixKey:); //LCD显示字符串while(1){KeyNumMatrixKey(); //获取矩阵键盘键码if(KeyNum) //如果有按键按下{LCD_ShowNum(2,1,KeyNum,2); //LCD显示键码}}
}MatrixKey.c
#include REGX52.H
#include Delay.h/*** brief 矩阵键盘读取按键键码* param 无* retval KeyNumber 按下按键的键码值如果按键按下不放程序会停留在此函数松手的一瞬间返回按键键码没有按键按下时返回0*/
unsigned char MatrixKey()
{unsigned char KeyNumber0;P10xFF;P1_30;if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber1;}if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber5;}if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber9;}if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber13;}P10xFF;P1_20;if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber2;}if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber6;}if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber10;}if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber14;}P10xFF;P1_10;if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber3;}if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber7;}if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber11;}if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber15;}P10xFF;P1_00;if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber4;}if(P1_60){Delay(20);while(P1_60);Delay(20);KeyNumber8;}if(P1_50){Delay(20);while(P1_50);Delay(20);KeyNumber12;}if(P1_40){Delay(20);while(P1_40);Delay(20);KeyNumber16;}return KeyNumber;
}例if(P1_70){Delay(20);while(P1_70);Delay(20);KeyNumber1;} 1.在扫描第一列时,如果P1_7 0,那么此时是判断开关1的状态 2.由于是机械按键,加入延时函数消除抖动,然后判断是否松手;如果松手,继续消除抖动 3.返回值KeyNumber
MatrixKey.h
#ifndef __MATRIXKEY_H__
#define __MATRIXKEY_H__unsigned char MatrixKey();#endif6.2矩阵键盘密码锁
1.定义按键功能:S1-S9定义为数字的1-9,S10定义为0,S11为确认键,S12为取消键,S13-S16按键不用 2.判断KeyNum 10,然后实现密码左移,同时要加入一个计次变量,按下确认或者取消按键后密码计次清零
#include REGX52.H
#include Delay.h
#include LCD1602.h
#include MatrixKey.hunsigned char KeyNum;
unsigned int Password,Count;void main()
{LCD_Init();LCD_ShowString(1,1,Password:);while(1){KeyNumMatrixKey();if(KeyNum){if(KeyNum10) //如果S1~S10按键按下输入密码{if(Count4) //如果输入次数小于4{Password*10; //密码左移一位PasswordKeyNum%10; //获取一位密码Count; //计次加一}LCD_ShowNum(2,1,Password,4); //更新显示}if(KeyNum11) //如果S11按键按下确认{if(Password2345) //如果密码等于正确密码{LCD_ShowString(1,14,OK ); //显示OKPassword0; //密码清零Count0; //计次清零LCD_ShowNum(2,1,Password,4); //更新显示}else //否则{LCD_ShowString(1,14,ERR); //显示ERRPassword0; //密码清零Count0; //计次清零LCD_ShowNum(2,1,Password,4); //更新显示}}if(KeyNum12) //如果S12按键按下取消{Password0; //密码清零Count0; //计次清零LCD_ShowNum(2,1,Password,4); //更新显示}}}
}