单片机控制的矩阵键盘扫描程序集
矩阵键盘汇编程序
4*4矩阵键盘扫描汇编程序(基于51单片机)
// 程序名称:4-4keyscan.asm
;// 程序用途:4*4矩阵键盘扫描检测
;// 功能描述:扫描键盘,确定按键值。程序不支持双键同时按下,;// 如果发生双键同时按下时,程序将只识别其中先扫描的按键
;// 程序入口:void
;// 程序出口:KEYNAME,包含按键信息、按键有效信息、当前按键状态
;//================================================================= =====
PROC KEYCHK
KEYNAME DATA 40H ;按键名称存储单元
;(b7-b5纪录按键状态,b4位为有效位,
;b3-b0纪录按键)
KEYRTIME DATA 43H ;重复按键时间间隔
SIGNAL DATA 50H ;提示信号时间存储单元
KEY EQU P
3 ;键盘接口(必须完整I/O口)
KEYPL EQU P0.6 ;指示灯接口
RTIME EQU 30 ;重复按键输入等待时间
KEYCHK:
;//=============按键检测程序======================================== =====
MOV KEY,#0FH ;送扫描信号
MOV A,KE
Y ;读按键状态
CJNE A,#0FH,NEXT1 ;ACC<=0
FH
; CLR
C ;Acc等于0FH,则CY为0,无须置0
NEXT1:
; SETB
C ;Acc不等于0FH,则ACC
必小于0FH,
;CY为1,无须置1
MSP430单片机矩阵键盘测试程序
MSP430单片机矩阵键盘测试程序
#include unsigned char keybuff[10];unsigned char keypoint=0;
void delay(int v) { while(v!=0)v--; }unsigned char key(void) { unsigned char x=0xff; P1DIR=0X0F; P1OUT=0X01; //扫描第一行if((P1IN&0X70)==0X10) x=0; else if((P1IN&0X70)==0X20) x=1; else if((P1IN&0X70)==0x40) x=2; else { P1OUT=0X2; //扫描第二行if((P1IN&0X70)==0X10) x=3; else if((P1IN&0X70) ==0X20) x=4; else if((P1IN&0X70)==0x40) x=5; else { P1OUT=0X4; //扫描第三行if((P1IN&0X70)==0X10) x=6; else if((P1IN&0X70)==0X20) x=7; else if((P1IN&0X70)==0x40) x=8; else {P1OUT=8; //扫描第四行if((P1IN&0X70) ==0X10) x=9; else if((P1IN&0X70)==0X20) x=10; else if((P1IN&0X70)==0x40) x=11; } } } return(x); }unsigned char keyj(void) {unsigned char x; P1DIR=0x0f; P1OUT=0x0f; //键盘硬件:P10--P13 为行线,最上面一根为P10 x=(P1IN&0X70); // P14--P16 为列线,最左边一根为P14,列线下拉return(x); // 无按键,返回0?; 有按键返回非0 }interrupt[PORT1_VECTOR] void port1key(void) { if(keyj()! =0X00) { delay(300) ; //消抖动if(keyj()!=0X0) { keybuff[keypoint]=key(); //按键
单片机之矩阵键盘
单片机之矩阵键盘
下面是一个stc89c52单片机下的矩阵键盘程序,P0口接键盘,显示在P2口.
#include;
#define uchar unsigned char
#define uint unsigned int
sbit key1=P3^2;
sbit key2=P3^3;
uchar code
tab[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x 7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00}; //定义八个灯的工作状态。
uchar code
wep[]={0x00,0x01,0x02,0x03,0x04,0x05,0x06,0x07}; void yanshi(uint t)
{
while(--t);
}
void main()
{
uchar han,lei,key;
while(1)
{
P0=0xf0; //初始化为开关状态。11110000
han=P0; //han变量读取P0口的值。第一次扫描键盘。
han=han&0xf0; //对han变量与0xf0与.
//如果结果等于P0口初值(0xf0)说明没有键被按下. //如果结果不等于P0(0xf0)口初值,说明有键按下. if(han!=0xf0)
yanshi(125*5); //延时消抖.
if(han!=0xf0) //语句执行到这里说明真的有键按下.
{ //例如按下S1键.则P0=1110 0000
lei=P0&0xf0; //lei读取P0口的值.
lei=lei|0x0f; //lei=11101111
单片机c语言程序设计---矩阵式键盘实验报告
单片机c语言程序设计---矩阵式键盘实验报告
课程名称:单片机c语言设计实验类型:设计型实验
实验项目名称:矩阵式键盘实验
一、实验目的和要求
1.掌握矩阵式键盘结构
2.掌握矩阵式键盘工作原理
3.掌握矩阵式键盘的两种常用编程方法,即扫描法和反转法
二、实验内容和原理
实验1.矩阵式键盘实验
功能:用数码管显示4*4矩阵式键盘的按键值,当K1按下后,数码管显示数字0,当K2按下后,显示为1,以此类推,当按下K16,显示F。
(1)硬件设计
电路原理图如下
仿真所需元器件
(2)proteus仿真
通过Keil编译后,利用protues软件进行仿真。在protues ISIS 编译环境中绘制仿真电路图,将编译好的“xxx.hex”文件加入AT89C51。启动仿真,观察仿真结果。
操作方完成矩阵式键盘实验。具体包括绘制仿真电路图、编写c源程序(反转法和扫描法)、进行仿真并观察仿真结果,需要保存原理图截图,保存c源程序,总结观察的仿真结果。完成思考题。
三、实验方法与实验步骤
1.按照硬件设计在protues上按照所给硬件设计绘制电路图。
2.在keil上进行编译后生成“xxx.hex”文件。
3.编译好的“xxx.hex”文件加入AT89C51。启动仿真,观察仿真结果。
四、实验结果与分析
void Scan_line()//扫描行
{
Delay(10);//消抖
switch ( P1 )
{
case 0x0e: i=1;
break;
case 0x0d: i=2;
break;
case 0x0b: i=3;
break;
case 0x07: i=4;
矩阵键盘扫描汇编程序
4*4矩阵键盘扫描汇编程序(基于51单片机)
// 程序名称:4-4keyscan.asm
;// 程序用途:4*4矩阵键盘扫描检测
;// 功能描述:扫描键盘,确定按键值。程序不支持双键同时按下,
;// 如果发生双键同时按下时,程序将只识别其中先扫描的按键;// 程序入口:void
;// 程序出口:KEYNAME,包含按键信息、按键有效信息、当前按键状态;//================================================================== ====
PROC KEYCHK
KEYNAME DATA 40H ;按键名称存储单元
;(b7-b5纪录按键状态,b4位为有效位,
;b3-b0纪录按键)
KEYRTIME DATA 43H ;重复按键时间间隔
SIGNAL DATA 50H ;提示信号时间存储单元
KEY EQU P3 ;键盘接口(必须完整I/O口) KEYPL EQU P0.6 ;指示灯接口
RTIME EQU 30 ;重复按键输入等待时间
KEYCHK:
;//=============按键检测程序========================================= ====
MOV KEY,#0FH ;送扫描信号
MOV A,KEY ;读按键状态
CJNE A,#0FH,NEXT1 ;ACC<=0FH
; CLR C ;Acc等于0FH,则CY为0,无须置0
NEXT1:
; SETB C ;Acc不等于0FH,则ACC必小于0 FH,
;CY为1,无须置1
51单片机04矩阵按键逐行扫描行列扫描代码
矩阵键盘扫描原理
方法一:
逐行扫描:我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
方法二:
行列扫描:我们可以通过高四位全部输出低电平,低四位输出高电平。当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了。
//行列扫描
#include
#define GPIO_KEY P0
#define GPIO_LCD P2
unsigned char code a[17]=
{~0xfc,~0x60,~0xda,~0xf2,~0x66,~0xb6,~0xbe,~0xe0,
~0xfe,~0xf6,~0xee,~0x3e,~0x9c,~0x7a,~0xde,~0x8e,~0x00}; //按位取反的用法
void delay10ms();
void keydown();//要与下面的定义一致
void main()
{
GPIO_LCD=a[16];//初始化数码管
while(1)
{
keydown();
}
}
void delay10ms()
{
unsigned char a,b;
for(a=38;a>0;a--)
for(b=130;b>0;b--);
}
void keydown()
//检测按下,按下时需要消抖,检测松开,返回按键值//没有按键时保持
51单片机矩阵键盘原理
51单片机矩阵键盘原理
介绍
在嵌入式系统中,矩阵键盘是一种常见的输入装置。51单片机是广泛使用的一种
微控制器,结合矩阵键盘可以实现各种应用。本文将详细介绍51单片机矩阵键盘
的原理及其工作方式。
什么是矩阵键盘?
矩阵键盘是将一组按钮布置成矩阵形式,以减少输入引脚的数量。每个按钮在矩阵键盘中都会被分配一个坐标,通过扫描行和列,可以确定用户按下的是哪个按钮。
51单片机的输入输出结构
51单片机具有强大的输入输出能力,可以连接各种外设。在使用矩阵键盘时,通
常使用IO口进行输入和输出操作。
矩阵键盘的接线方式
将矩阵键盘与51单片机连接时,需要将键盘的行和列引脚分别连接到单片机的IO 口。通过对行进行扫描,再根据列的输入状态判断按钮是否按下。这种接线方式可以大大减少所需的IO口数量。
矩阵键盘的扫描原理
矩阵键盘的扫描原理是通过不断扫描行并读取列的状态来判断按钮是否按下。具体步骤如下: 1. 将所有行引脚设为输出,输出高电平。 2. 逐个扫描行,将当前行引脚设为低电平。 3. 读取所有列引脚的状态,如果有低电平表示有按钮按下。 4. 如果有按钮按下,则根据行和列的坐标确定按下的按钮。
51单片机矩阵键盘的实现
以下是使用51单片机实现矩阵键盘的基本步骤: 1. 将行和列引脚连接到单片机的IO口。 2. 初始化IO口的状态。 3. 在主程序中进行循环扫描,根据扫描结果执行相应的操作。
优化矩阵键盘的扫描速度
为了提高矩阵键盘的扫描速度,可以采用以下优化方法: 1. 使用硬件定时器来定时扫描行,减少CPU的负载。 2. 使用中断方式处理按键事件,从而减少程序中的轮询操作。 3. 将矩阵键盘的行和列布局进行优化,减少扫描的时间复杂度。
51单片机的矩阵按键扫描的设计C语言程序
#include
51.h>
#define KEY P1
// ----------------------- 变量声明
-------------------------------------------------------------------- void program_SCANkey(); // 程序扫描键盘 ,供主程序调用
void delay(unsigned int N) ;// 延时子程序,实现 (16*N+24)us 的延时
bitjudge_hitkey();
// 判断是否有键按下,有返回 1,没 有返回 0
void key_manage(unsigned char keycode); //键盘散转
//
//函数名称:
program_SCANkey
//
函数声明,变量定义
unsigned char scan_key();
表行,低四位代表列 )
// 扫描键盘,返回键值 (高四位代
void manage_key1(void);
// 按键 1 处理程序 void manage_key2(void);
// 按键 2 处理程序 void manage_key3(void);
// 按键 3 处理程序 void manage_key4(void);
// 按键 4 处理程序 //
每个按键对应一个处理程序,这里
// 函数功能:
程序扫描键盘,
// 有键按下完成按键处理,无键按下直接返回
// -------------------------------------------------------------------------------------------------- void program_SCANkey(){unsigned char key_code;
单片机矩阵键盘加减代码
单片机矩阵键盘加减代码
以下是一个简单的单片机矩阵键盘加减代码,基于AT89C52单片机编写。
```c
#include <reg52.h>
sbit add_button = P1^0; // 加号按钮
sbit minus_button = P1^1; // 减号按钮
void main() {
unsigned char keypad[4][4] = {{1,2,3,'A'},
{4,5,6,'B'},
{7,8,9,'C'},
{'*',0,'#','D'}};
int count = 0; // 计数器,初值为0
unsigned char button; // 存储按下的键值
while(1) {
// 扫描键盘
for (int i=0; i<4; i++) {
P2 = ~(0x01 << i);
if (P2 != 0xFF) {
for (int j=0; j<4; j++) {
if ((P2 & (0x01 << j)) == 0) {
button = keypad[i][j];
// 检测加号按钮
if (button == '+') {
count++;
if (count > 999) count = 999; // 上限999
}
// 检测减号按钮
else if (button == '-') {
count--;
if (count < 0) count = 0; // 下限0
}
}
}
}
}
}
}
```
这段代码使用了一个4x4的矩阵键盘,每次扫描键盘检测按键并根据按键值进行加减操作。同时,还增加了上下限的判断,防止计数器超出限定范围。
51单片机_矩阵按键检测
{
P1 = line[i];//将行扫描值逐个送至P1端口
tmp = P1;//再读取P1口的值Biblioteka Baidu
if(tmp != line[i])//若读取的数值不等于送入的行扫描值,表示有按键被按下
{
delay_ms(10);//延时,重新读取判断,确认有键按下
tmp = P1;
display(num);//数码管显示按下按键对应的数值
}
}
0xed, 0xdd, 0xbd, 0x7d,
0xeb, 0xdb, 0xbb, 0x7b,
0xe7, 0xd7, 0xb7, 0x77
};
charline[4] = {0xfe, 0xfd, 0xfb, 0xf7};//行扫描值,将各行信号分别置0,列值全1
chartmp;
inti, j, k=-1;
{
P0 = 0xff;//关闭数码管当前位的显示,共阳极关闭显示段选信号
P2 = BitSet[i];//选中数码管对应的位
P0 = ~NumberCode[n%10];//向数码管的对应位中送入该位数值对应的段选信号
delay_ms(2);//每一位延时显示2ms
P2 = 0xff;//关闭所有位选
}
}
returnk;//返回扫描到的键值
51单片机的矩阵按键扫描的设计C语言程序
51单片机的矩阵按键扫描的设计C语言程序以下为一个基于51单片机的矩阵按键扫描的设计C语言程序:```c
#include <reg51.h>
//定义端口连接到矩阵键盘
sbit col1 = P2^0;
sbit col2 = P2^1;
sbit col3 = P2^2;
sbit row1 = P2^3;
sbit row2 = P2^4;
sbit row3 = P2^5;
sbit row4 = P2^6;
//声明按键函数
char read_keypad(;
void mai
while (1)
char key = read_keypad(; // 读取按键值
//根据按键值进行相应操作
switch(key)
case '1':
//第一行第一列按键逻辑
//在此处添加相应的代码
break;
case '2':
//第一行第二列按键逻辑
//在此处添加相应的代码
break;
//继续处理其他按键
//...
default:
//未识别到按键
break;
}
}
//按键扫描函数
char read_keypa
col1 = 0; col2 = 1; col3 = 1; // 激活第一列if (row1 == 0) { // 第一行第一列按键被按下
while (row1 == 0); //等待按键释放
return '1'; // 返回按键值
}
if (row2 == 0) { // 第二行第一列按键被按下while (row2 == 0); //等待按键释放
return '4'; // 返回按键值
}
if (row3 == 0) { // 第三行第一列按键被按下while (row3 == 0); //等待按键释放
经典的矩阵键盘扫描程序
经典的矩阵键盘扫描程序
矩阵键盘是一种常见的输入设备,广泛应用于电子产品中。为了实现对矩阵键盘的扫描和输入响应,需要编写一个矩阵键盘扫描程序。本文将详细介绍如何编写一个经典的矩阵键盘扫描程序。
1. 程序功能描述
矩阵键盘扫描程序的主要功能是实现对矩阵键盘的扫描,并根据按键的状态进行相应的处理。程序需要实现以下功能:
- 扫描矩阵键盘的按键状态;
- 根据按键状态进行相应的处理;
- 输出按键的值或执行相应的操作。
2. 程序设计思路
矩阵键盘通常由多行多列的按键组成,每个按键都有一个唯一的行列地址。程序的设计思路如下:
- 初始化矩阵键盘的引脚和状态变量;
- 循环扫描矩阵键盘的按键状态;
- 检测按键状态变化,并根据变化进行相应的处理;
- 输出按键的值或执行相应的操作。
3. 程序代码示例
下面是一个简单的矩阵键盘扫描程序的代码示例:
```
#include <stdio.h>
#include <stdbool.h>
// 定义矩阵键盘的行列数
#define ROWS 4
#define COLS 4
// 定义矩阵键盘的引脚
int rowPins[ROWS] = {2, 3, 4, 5}; int colPins[COLS] = {6, 7, 8, 9}; // 定义矩阵键盘的按键值
char keys[ROWS][COLS] = {
{'1', '2', '3', 'A'},
{'4', '5', '6', 'B'},
{'7', '8', '9', 'C'},
{'*', '0', '#', 'D'}
51单片机的键盘扫描程序
一个51单片机的键盘扫描程序,算法简单有效
/****************************************
键盘_不采用定时器_不延时
特点:
按键在松手后有效,灵敏度高,消耗资源少,运行效率高
独立键盘为:K01=P2^4;K02=P2^5;K03=P2^6;K04=P2^7;
矩阵键盘为:行(上到下)_P2.3_P2.2_P2.1_P2.0
列(左到右)_P2.7_P2.6_P2.5_P2.4
提供的操作函数:
//独立键盘.无按键动作时其返回值num_key=0,否则返回按键号num_key
extern unsigned char keyboard_self();
//矩阵键盘.无按键动作时其返回值num_key=0,否则返回按键号num_key****检测高四位extern unsigned char keyboard_matrix();
****************************************/
先看独立键盘(和矩阵键盘的算法一样)
-----------------------------------------------------------------------
#include<reg52.h>
#include<intrins.h>
//独立键盘.无按键动作时其返回值num_key=0,否则返回按键号num_key
extern unsigned char keyboard_self()
{
unsigned char num_key=0;//按键号
单片机矩阵键盘扫描
单片机矩阵键盘扫描
本讲任务:
了解矩阵键盘检测原理及如何获得键盘扫描值。
逐行扫描:
我们可以通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,当低四位接收到的数据不全为1的时候,说明有按键按下,然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下。
例程:
/*******************矩阵键盘扫描********************
*单片机型号:STC89C52RC
*开发环境:KEIL
*功能:当按下一个按键后,在数码管进行数值的显示
***************************************************/
#include<reg51.h>
sbit BEEP=P2^3;
sbit LE1=P2^6;
sbit LE2=P2^7;
void delay(int In,int Out);
unsigned char buffer,key_num;
void delay(int In,int Out) //定义延时函数
{
int i,j;
for(i=0;i<In;i++)
{for(j=0;j<Out;j++){;}}
}
unsigned char code
table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};
void display(unsigned char num) //数码管显示
{
P0=table[num];
51单片机4×4矩阵式键盘识别汇编程序
;******************************************************
;*标题: 51单片机4×4矩阵式键盘识别汇编程序
;*******************************************************
; 0 1 2 3 ---P20
; 4 5 6 7 ---P21
; 8 9 10 11 ---P22
; 12 13 14 15 ---P23
; | | | |
; P24 P25 P26 P27
;******************************************************************
ORG 0000h
AJMP MAIN
ORG 0030h
MAIN:
MOV DPTR,#TAB ;将表头放入DPTR
LCALL KEY;调用键盘扫描程序
MOVC A,@A+DPTR ;查表后将键值送入ACC
MOV P0,A;将Acc值送入P0口
CLR P1.3 ;开显示
LJMP MAIN ;返回调用子程序反复循环显示
;----------------------------------------------------------------------
KEY:
LCALL KS ;调用检测按键子程序
JNZ K1 ;有键按下继续
LCALL DELAY2 ;无键按下调用延时去抖动程序
AJMP KEY;返回继续检测有无按键按下
K1:
LCALL DELAY2
LCALL DELAY2 ;有键按下继续延时去抖动
单片机矩阵键盘扫描步骤
1.在判断是否有键按下及扫描前清空按键位置;//因为获取到的键位置是一次性的,在发挥完其功效后就没用了,应当立即清空,至少要在下次扫描前清空,一可作为无按键按下的标志(因为只有按键按下才会赋予其非空值),二可防止无按键按下时继承原按键位置,使程序出错。
2.判断是否有键按下//而不是直接进行逐行扫描可节省无按键按下时键盘扫描所占机时
3.若有键按下,为判断按下的是哪个键,进行逐行扫描,获取P1口状态并转化为按键位置,一旦得到按键位置立即停止扫描
4.若没有键按下,则按键位置保持空状态
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
单片机控制的矩阵键盘扫描程序集
各种各样的矩阵键盘扫描程序集
矩阵键盘的扫描对初学者来说是不可避免的,然而也相对来说有点难度.
鉴于此,我整理了一下,我所遇到的矩阵键盘扫描程序集,将相继贴上来,供大家参考! 说明:这些大多都是网上转贴来的,其所有权归原作者!
谢谢合作.
最简单矩阵键盘扫描程序
key:MOV p0,#00001111b;上四位和下四位分别为行和列,所以送出高
低电压检查有没有按键按下
jmp k10;跳到K10处开始扫描,这里可以改成其它条件转移指令来决
定本次扫描是否要继续,例如减1为0转移或者位为1或0才转移,这主
要用来增加功能,确认上一按键功能是否完成?是否相当于经过了延
时?是否要封锁键盘?
goend:jmp kend;如果上面判断本次不执行键盘扫描程序,则立即转
到程序尾部,不要浪费CPU的时间
k10:jb p0.0,k20;扫描正式开始,先检查列1四个键是否有键按下,
如果没有,则跳到K20检查列2
k11:MOV p0,#11101111b;列1有键按下时,P0.0变低,到底是那一个键
按下?现在分别输出各行低电平
jb p0.0,k12;该行的键不按下时,p0.0为高电平,跳到到K12,检查其
它的行
MOV r1,#1;如果正好是这行的键按下,将寄存器R0写下1,表示1号键
按下了
k12:MOV p0,#11011111b
jb p0.0,k13
MOV r1,#2;如果正好是这行的键按下,将寄存器R0写下2,表示2号键
按下了
k13:MOV p0,#10111111b
jb p0.0,k14
MOV r1,#3;如果正好是这行的键按下,将寄存器R0写下3,表示3号键
按下了
k14:MOV p0,#01111111b
jb p0.0,kend;如果现在四个键都没有按下,可能按键松开或干扰,
退出扫描(以后相同)
MOV r1,#4如果正好是这行的键按下,将寄存器R0写下4,表示4号键
按下了
jmp kend;已经找到按下的键,跳到结尾吧
k20:jb p0.1,k30;列2检查为高电平再检查列3、4
k21:MOV p0,#11101111b;列2有健按下时,P0.0会变低,到底是那一
行的键按下呢?分别输出行的低电平
jb p0.1,k22;该行的键不按下时p0.0为高电平,跳到到K22,检查另
外三行
MOV r1,#5;如果正好是这行的键按下,将寄存器R0写下5,表示5号键
按下了(以后相同,不再重复了)
k22:MOV p0,#11011111b
jb p0.1,k23
MOV r1,#6
k23:MOV p0,#10111111b
jb p0.1,k24
MOV r1,#7
k24:MOV p0,#01111111b
jb p0.1,kend
MOV r1,#8
jmp kend;已经找到按下的键,跳到结尾吧(以后相同,不要重复了
)
k30:jb p0.2,k40
k31:MOV p0,#11101111b
jb p0.2,k32
MOV r1,#9
k32:MOV p0,#11011111b
jb p0.2,k33
MOV r1,#10
k33:MOV p0,#10111111b
jb p0.2,k34
MOV r1,#11
k34:MOV p0,#01111111b
jb p0.2,kend
MOV r1,#12
jmp kend
k40:jb p0.3,kend
k41:MOV p0,#11101111b
jb p0.3,k42
MOV r1,#13
k42:MOV p0,#11011111b
jb p0.3,k43
MOV r1,#14
k43:MOV p0,#10111111b
jb p0.3,k44
MOV r1,#15
k44:MOV p0,#01111111b
jb p0.3,kend
MOV r1,#16
kend: ret
行列扫描键盘可检测出双键按下
#include
#define ulong unsigned long
#define uint unsigned int
#define uchar unsigned char
extern void delay(unsigned int x);
unsigned char Tab_key[]= //行列式键盘映射{0x00, //无键按下
’’7’’,’’8’’,’’9’’,’’/’’,
’’4’’,’’5’’,’’6’’,’’*’’,
’’1’’,’’2’’,’’3’’,’’-’’,
’’C’’,’’0’’,’’=’’,’’+’’,
//下面为按’’C’’同时再按的键:
’’7’’,’’8’’,’’9’’,’’/’’,
’’4’’,’’5’’,’’6’’,’’*’’,
’’1’’,’’2’’,’’3’’,’’-’’,
’’0’’,’’=’’,’’+’’,};
// P1口行列式键盘//
#define KEYPIN_L P1 // 定义键扫描列端口为P1
低四位输入//
#define KEYPIN_H P1 // 定义键扫描行端口为P1高
四位扫描输出//
// P1口行列式键盘//
//公用函数
unsigned char KeysCAN(void); // 键扫描函数// //内部私有函数
unsigned char fnKeycode(unsigned char key); // 根据键盘
映射表输出顺序键值//
/*
// P1口行列式键盘//
extern unsigned char KeysCAN(void); // 键扫描函数
//
*/
// P1口行列式键盘//
//---------------------------------------------------------
------------------//
unsigned char KeysCAN(void) // 键扫描
函数//
{
unsigned char sccode,recode,keytemp = 0;
KEYPIN_L = KEYPIN_L|0x0f; // P1低四
位为列线输入//
KEYPIN_H = KEYPIN_H&0x0f; // P1高四
位为行线发全零扫描码//
if ((KEYPIN_L&0x0f) != 0x0f)
{
delay(10); // 延时
10 MS 消抖//
if ((KEYPIN_L&0x0f) != 0x0f)