当前位置:文档之家› STM32_矩阵键盘程序4×4

STM32_矩阵键盘程序4×4

STM32_矩阵键盘程序4×4
STM32_矩阵键盘程序4×4

/*--------------------------------------------------------------------------------------* 矩阵键盘驱动

* 文件: keyboard.c

* 编写人:LiuHui

* 描述:扫描4x4 矩阵键盘输入,并返回键值

* 适用范围:驱动采用ST3.5 库编写,适用于STM32F10x 系列单片机

* 所用引脚:PA0-PA7

* 编写时间:2014 年5 月20 日

--------------------------------------------------------------------------------------*/

#include "stm32f10x.h"

#include "keyboard.h"

#include "dealy.h"

/*--------------------------------矩阵键盘初始化----------------------------------------* 功能:初始化stm32 单片机GPIO //PA0-PA7

* 参数传递:

* 输入:无

* 返回值:无

--------------------------------------------------------------------------------------*/

void KeyBoard_Init(void)

{

GPIO_InitTypeDef GPIO_InitStructure;

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_Out_PP;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_InitStructure.GPIO_Pin = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; GPIO_InitStructure.GPIO_Speed = GPIO_Speed_10MHz;

GPIO_InitStructure.GPIO_Mode = GPIO_Mode_IPD;

GPIO_Init(GPIOA, &GPIO_InitStructure);

GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);

GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7);

}

/*------------------------------矩阵键盘扫描--------------------------------------------* 功能:扫描矩阵键盘,并返回键值

* 参数:

* 输入:无

* 返回:有键按下返回该键值

* 无键按下时则返回0

--------------------------------------------------------------------------------------*/

u8 Read_KeyValue(void)

{

u8 KeyValue=0;

if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f)

{

Delay_ms(10);

if((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f)

{

GPIO_SetBits(GPIOA, GPIO_Pin_0);

GPIO_ResetBits(GPIOA, GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3);

switch(GPIO_ReadInputData(GPIOA)&0xff)

{

case 0x11: KeyValue = 1; break;

case 0x21: KeyValue = 5; break;

case 0x41: KeyValue = 9; break;

case 0x81: KeyValue = 13;break;

}

GPIO_SetBits(GPIOA, GPIO_Pin_1);

GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_2 | GPIO_Pin_3);

switch(GPIO_ReadInputData(GPIOA)&0xff)

{

case 0x12: KeyValue = 2; break;

case 0x22: KeyValue = 6; break;

case 0x42: KeyValue = 10;break;

case 0x82: KeyValue = 14;break;

}

GPIO_SetBits(GPIOA, GPIO_Pin_2);

GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_3);

switch(GPIO_ReadInputData(GPIOA)&0xff)

{

case 0x14: KeyValue = 3; break;

case 0x24: KeyValue = 7; break;

case 0x44: KeyValue = 11;break;

case 0x84: KeyValue = 15;break;

}

GPIO_SetBits(GPIOA, GPIO_Pin_3);

GPIO_ResetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2);

switch(GPIO_ReadInputData(GPIOA)&0xff)

{

case 0x18: KeyValue = 4; break;

case 0x28: KeyValue = 8; break;

case 0x48: KeyValue = 12;break;

case 0x88: KeyValue = 16;break;

}

GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 |

GPIO_Pin_7);

while((GPIO_ReadInputData(GPIOA)&0xff)!=0x0f);

return KeyValue;

}

}

return 0;

}

/*--------------------------------THE END--------------------------------------------*/

/*--------------------------------------------------------------------------------------* 矩阵键盘驱动* 文件: keyboard.h

* 编写人:LiuHui

* 描述:扫描4x4 矩阵键盘输入,并返回键值

* 适用范围:驱动为ST3.5 库编写,适用于STM32F10x 系列单片机

* 所用引脚:PA0-PA7

* 编写时间:2013 年11 月22 日

* 版本:1.0

--------------------------------------------------------------------------------------*/

#ifndef __KEYBOARD_H

#define __KEYBOARD_H

void KeyBoard_Init(void);

u8 Read_KeyValue(void);

#endif

/*----------------------------------THE END------------------------------------------*

汇编矩阵键盘程序

方法一、 ORG 0000H LJMP MAIN ORG 0100H MAIN: MOV P1,#0F0H //P1口设初值F0,矩阵按键高四位置1,低四位置0, JNB P1.4,Y0 //用JNB检测按键端口,P1.4口低电平跳转 Y0 JNB P1.5,Y1 JNB P1.6,Y2 JNB P1.7,Y3 SJMP MAIN Y0: MOV 30H,#00H MOV P1,#0EFH JNB P1.4,X0 MOV P1,#0DFH JNB P1.4,X1 MOV P1,#0BFH JNB P1.4,X2 MOV P1,#07FH JNB P1.4,X3 Y1: MOV 30H,#01H MOV P1,#0EFH JNB P1.0,X0 MOV P1,#0DFH JNB P1.1,X1 MOV P1,#0BFH JNB P1.2,X2 MOV P1,#7FH JNB P1.3,X3 Y2: MOV 30H,#02H MOV P1,#0EFH JNB P1.0,X0 MOV P1,#0DFH JNB P1.1,X1 MOV P1,#0BFH JNB P1.2,X2 MOV P1,#7FH JNB P1.3,X3 Y3: MOV 30H,#03H MOV P1,#0EFH

MOV P1,#0DFH JNB P1.1,X1 MOV P1,#0BFH JNB P1.2,X2 MOV P1,#7FH JNB P1.3,X3 X0: MOV 31H,#00H ACALL DELAY MOV P1,#0F0H LJMP JISUAN X1: MOV 31H,#01H ACALL DELAY MOV P1,#0F0H LJMP JISUAN X2: MOV 31H,#02H ACALL DELAY MOV P1,#0F0H LJMP JISUAN X3: MOV 31H,#03H ACALL DELAY MOV P1,#0F0H LJMP JISUAN JISUAN: MOV A,31H MOV B,#04H MUL AB ADD A,30H MOV DPTR,#TAB MOVC A,@A+DPTR MOV P0,A CC: MOV A,P1 ANL A,#0F0H XRL A,#0F0H JNZ CC LCALL MAIN DELAY: MOV R4,#0C5H D1: MOV R5,#43H D0: MOV R6,#10H

矩阵键盘的工作原理和扫描确认方式

9.3.1 矩阵键盘的工作原理和扫描确认方式 来源:《AVR单片机嵌入式系统原理与应用实践》M16华东师范大学电子系马潮 当键盘中按键数量较多时,为了减少对I/O 口的占用,通常将按键排列成矩阵形式,也称为行列键盘,这是一种常见的连接方式。矩阵式键盘接口见图9-7 所示,它由行线和列线组成,按键位于行、列的交叉点上。当键被按下时,其交点的行线和列线接通,相应的行线或列线上的电平发生变化,MCU 通过检测行或列线上的电平变化可以确定哪个按键被按下。 图9-7 为一个 4 x 3 的行列结构,可以构成12 个键的键盘。如果使用 4 x 4 的行列结构,就能组成一个16 键的键盘。很明显,在按键数量多的场合,矩阵键盘与独立式按键键盘相比可以节省很多的I/O 口线。 矩阵键盘不仅在连接上比单独式按键复杂,它的按键识别方法也比单独式按键复杂。在矩阵键盘的软件接口程序中,常使用的按键识别方法有行扫描法和线反转法。这两种方法的基本思路是采用循环查循的方法,反复查询按键的状态,因此会大量占用MCU 的时间,所以较好的方式也是采用状态机的方法来设计,尽量减少键盘查询过程对MCU 的占用时间。 下面以图9-7 为例,介绍采用行扫描法对矩阵键盘进行判别的思路。图9-7 中,PD0、PD1、PD2 为3 根列线,作为键盘的输入口(工作于输入方式)。PD3、PD4、PD5、PD6 为4根行线,工作于输出方式,由MCU(扫描)控制其输出的电平值。行扫描法也称为逐行扫描查询法,其按键识别的过程如下。 √将全部行线PD3-PD6 置低电平输出,然后读PD0-PD2 三根输入列线中有无低电平出现。只要有低电平出现,则说明有键按下(实际编程时,还要考虑按键的消抖)。如读到的都是高电平,则表示无键按下。 √在确认有键按下后,需要进入确定具体哪一个键闭合的过程。其思路是:依

课程设计-制作单片机的4X4矩阵键盘

课程设计-制作单片机的4X4矩阵键盘

目录 摘要.............................................. 错误!未定义书签。第一章硬件部分 (5) 第一节AT89C51 (5) 第二节4*4矩阵式键盘 (8) 第三节LED数码管 (11) 第四节硬件电路连接 (13) 第二章软件部分 (15) 第一节所用软件简介 (15) 第二节程序流程图 (18) 第三节程序 (20) 第三章仿真结果 (23) 心得体会 (26) 参考文献 (27)

第一章硬件部分 第一节AT89C51 AT89C51是一种带4K字节FLASH存储器(FPEROM—Flash Programmable and Erasable Read Only Memory)的低电压、高性能CMOS 8位微处理器,俗称单片机。AT89C51单片机为很多嵌入式控制系统提供了一种灵活性高且价廉的方案。引脚如图所示 AT89C5 图1 AT89C51管脚 图 AT89C51其具有以下特性: 与MCS-51 兼容 4K字节可编程FLASH存储器 寿命:1000写/擦循环 数据保留时间:10年

全静态工作:0Hz-24MHz 三级程序存储器锁定 128×8位内部RAM 32可编程I/O线 两个16位定时器/计数器 5个中断源 可编程串行通道 低功耗的闲置和掉电模式 片内振荡器和时钟电路 特性概述: AT89C51 提供以下标准功能:4k 字节Flash 闪速存储器,128字节内部RAM,32 个I/O 接口,两个16位定时/计数器,一个5向量两级中断结构,一个全双工串行通信口,片内振荡器及时钟电路。同时,AT89C51可降至0Hz的静态逻辑操作,并支持两种软件可选的节电工作模式。空闲方式停止CPU的工作,但允许RAM,定时/计数器,串行通信口及中断系统继续工作。掉电方式保存RAM中的内容,但振荡器停止工作并禁止其它所有部件工作直到下一个硬件复位。 管脚说明: VCC:供电电压。 GND:接地。 P0口:P0口为一个8位漏级开路双向I/O口,每脚可吸收8TTL门电流。当P0口的管脚第一次写1时,被定义为高阻输入。P0能够用于外部程序数据存储器,它可以被定义为数据/地址的低八位。在FIASH编程时,P0 口作为原码输入口,当FIASH进行校验时,P0输出原码,此时P0外部必须接上拉电阻。 P1口:P1口是一个内部提供上拉电阻的8位双向I/O口,P1口缓冲器能接收输出4TTL门电流。P1口管脚写入1后,被内部上拉为高,可用作输入,P1口被外部下拉为低电平时,将输出电流,这是由于内部上拉的缘故。在FLASH编程和校验时,P1口作为低八位地址接收。

经典的矩阵键盘扫描程序

键盘是单片机常用输入设备,在按键数量较多时,为了节省I/O口等单片机资源,一般采取扫描的方式来识别到底是哪一个键被按下。即通过确定被按下的键处在哪一行哪一列来确定该键的位置,获取键值以启动相应的功能程序。 4*4矩阵键盘的结构如图1(实物参考见万用板矩阵键盘制作技巧)。在本例中,矩阵键盘的四列依次接到单片机的P1.0~P1.3,四行依次接到单片机的P1.4~P1.7;同时,将列线上拉,通过10K电阻接电源。 查找哪个按键被按下的方法为:一个一个地查找。 先第一行输出0,检查列线是否非全高; 否则第二行输出0,检查列线是否非全高; 否则第三行输出0,检查列线是否非全高; 如果某行输出0时,查到列线非全高,则该行有按键按下; 根据第几行线输出0与第几列线读入为0,即可判断在具体什么位置的按键按下。 下面是具体程序:

void Check_Key(void) { unsigned char row,col,tmp1,tmp2; tmp1 = 0x10; //tmp1用来设置P1口的输出,取反后使 P1.4~P1.7中有一个为0 for(row=0;row<4;row++) // 行检测 { P1 = 0x0f; // 先将p1.4~P1.7置高 P1 =~tmp1; // 使P1.4~p1.7中有一个为0 tmp1*=2; // tmp1左移一位 if ((P1 & 0x0f) < 0x0f) // 检测P1.0~P1.3中是否有一位为0,只要有,则说明此行有键按下,进入列检测 { tmp2 = 0x01; // tmp2用于检测出哪一列为0 for(col =0;col<4;col++) // 列检测 { if((P1 & tmp2)==0x00) // 该列如果为低电平则可以判定为该列 { key_val =key_Map[ row*4 +col ]; // 获取键值,识别按键;key_Map为按键的定义表 return; // 退出循环 } tmp2*=2; // tmp2左移一位 } } } } //结束 这是一种比较经典的矩阵键盘识别方法,实现起来较为简单,程序短小精炼。

矩阵键盘程序c程序,51单片机.

/*编译环境:Keil 7.50A c51 */ /*******************************************************/ /*********************************包含头文件********************************/ #include /*********************************数码管表格********************************/ unsigned char table[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x 8E}; /**************************************************************************** 函数功能:延时子程序 入口参数: 出口参数: ****************************************************************************/ void delay(void) { unsigned char i,j; for(i=0;i<20;i++) for(j=0;j<250;j++); } /**************************************************************************** 函数功能:LED显示子程序 入口参数:i 出口参数: ****************************************************************************/ void display(unsigned char i) { P2=0xfe; P0=table[i]; } /**************************************************************************** 函数功能:键盘扫描子程序 入口参数: 出口参数: ****************************************************************************/ void keyscan(void) { unsigned char n; //扫描第一行 P1=0xfe;

51单片机矩阵键盘扫描程序

/*----------------------------------------------- 名称:矩阵键盘依次输入控制使用行列逐级扫描 论坛:https://www.doczj.com/doc/7612834094.html, 编写:shifang 日期:2009.5 修改:无 内容:如计算器输入数据形式相同从右至左使用行列扫描方法 ------------------------------------------------*/ #include //包含头文件,一般情况不需要改动,头文件包含特殊功能寄存器的定义 #define DataPort P0 //定义数据端口程序中遇到DataPort 则用P0 替换 #define KeyPort P1 sbit LATCH1=P2^2;//定义锁存使能端口段锁存 sbit LATCH2=P2^3;// 位锁存 unsigned char code dofly_DuanMa[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f, 0x77,0x7c,0x39,0x5e,0x79,0x71};// 显示段码值0~F unsigned char code dofly_WeiMa[]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};//分别对应相应的数码管点亮,即位码 unsigned char TempData[8]; //存储显示值的全局变量 void DelayUs2x(unsigned char t);//us级延时函数声明 void DelayMs(unsigned char t); //ms级延时 void Display(unsigned char FirstBit,unsigned char Num);//数码管显示函数 unsigned char KeyScan(void);//键盘扫描 unsigned char KeyPro(void); void Init_Timer0(void);//定时器初始化 /*------------------------------------------------ 主函数 ------------------------------------------------*/ void main (void) { unsigned char num,i,j; unsigned char temp[8]; Init_Timer0(); while (1) //主循环 { num=KeyPro();

51单片机矩阵键盘程序

/*风清云扬*/ # include #define uchar unsigned char #define uint unsigned int void delay(uint i) { uchar x,j; for(j=0;j

} else if(temp0==0x0b) { switch (temp1) { case 0xe0: num=12;break; case 0xd0: num=11;break; case 0xb0: num=10;break; case 0x70: num=9;break; default:num=0;break; } } else if(temp0==0x07) { switch (temp1) { case 0xe0: num=16;break; case 0xd0: num=15;break; case 0xb0: num=14;break; case 0x70: num=13;break; default:num=0;break; } } } } return num; } void main() { char num; while(1) { num=key_scan(); P2=num/10; P3=num%10; } }

X4扫描式矩阵键盘课程设计

X4扫描式矩阵键盘课程设计 (总13页) -CAL-FENGHAI.-(YICAI)-Company One1 -CAL-本页仅作为文档封面,使用请直接删除

4X4扫描式矩阵键盘课程设计 课程设计名称: 4_4扫描式矩阵键盘设计 姓名: DUKE 班级:电子1008班 学号: 10086 成绩: 日期: 2014年1月6日

摘要 随着21世纪的到来,电子信息行业将是人类社会的高科技行业之一,式设施现代化的基础,也是人类通往科技巅峰的直通路。电子行业的发展从长远来看很重要,但最主要的还是科技问题。 矩阵式键盘提高效率进行按键操作管理有效方法,它可以提高系统准确性,有利于资源的节约,降低对操作者本身素质的要求。是它能准时、实时、高效地显示按键信息,以提高工作效率和资源利用率。 矩阵式键盘乃是当今使用最为广泛的键盘模式,该系统以N个端口连接控制N*N 个按键,显示在LED数码管上。单片机控制依据这是键盘显示系统,该系统可以对不同的按键进行实时显示,其核心是单片机和键盘矩阵电路部分,主要对按键与显示电路的关系、矩阵式技术及设备系统的硬件、软件等各个部分进行实现。 4*4矩阵式键盘采用AT89C51单片机为核心,主要由矩阵式键盘电路、译码电路、显示电路等组成,软件选用C语言编程。单片机将检测到的按键信号转换成数字量,显示于LED显示器上。该系统灵活性强,易于操作,可靠性高,将会有更广阔的开发前景。

目录 第一章:系统功能要求-------------------------------------------------------- 4*4 矩阵式键盘系统概述------------------------------------------------ 本设计任务和主要内容--------------------------------------------------- 第二章:方案论证--------------------------------------------------------------- 第三章:系统硬件电路的设计------------------------------------------------ 单片机控制系统原理----------------------------------------------------- 原理图绘制说明---------------------------------------------------------- 画出流程图---------------------------------------------------------------- 原理图绘制--------------------------------------------------------------- 第四章:系统程序的设计------------------------------------------------------ 程序的编写步骤-----------------------------------------------------------

4×5矩阵键盘驱动程序

4×5矩阵键盘驱动程序 一、工作原理及接口电路 4×5矩阵键盘有4条列线,5条行线共20个按键。每个按键对应不同键值,键盘扫描采用外部中断扫描方式,本系统中键盘为无源结构,键盘工作时不依靠任何外部电源。4×5矩阵键盘结构图如图2-10 所示。 图2-10 4×5矩阵键盘结构图 1)4×5矩阵键盘结构及按键抖动消除 当键盘中按键数量较多时为减少I/O口的占用,通常将按键排列成矩阵形式,如图2-12所示。在矩阵式键盘中,每条行线和列线在交叉处不直接连通,而是通过一个机械弹性开关加以连接。这样5条列线(R0~R4)和4条行线(L0~L3)就可以构成20个按键的矩阵键盘。键盘采用了无源结构,工作是不依靠任何外部电源。 由于机械弹性开关的机械触点的弹性作用,一个按键开关在闭合时并不会马上稳定的闭合,在断开时也不会马上断开,因而机械开关在闭合及断开瞬间均伴有一连串的抖动,如图2-11所示。

图2-11 按键时的抖动 抖动的时间长短由按键开关机械特性及按键的人为因素决定,一般为5ms~20ms。按键抖动如果处理不当会引起一次按键被误处理多次,所以消除抖动是必要的。消除抖动的有硬件处理和软件处理两种方法。当按键较多一般采用软件消抖方式。软件消抖原理为当检测出按键闭合后执行一个延时程序(产生5ms~20ms的延时),待前沿抖动消失后再次检测按键的状态,如果按键仍保持闭合状态则可确认为有键按下。当检测到按键释放并执行延时程序,待后沿抖动消失后才转入按键的处理程序。 1)矩阵键盘的工作原理 从4×5矩阵键盘的4条列线和5条行线分别引出9条端线接于单片机的9个I/O 口,由于键盘采用了无源结构所以行列线的电平由单片机I/O口的电平决定。进入按键处理程序后先使4条列线全为低电平,5条行线全为高电平,为读行线状态做准备,没有按键时这种状态不会被改变。当键盘上的某个按键闭合时,则该键所对应的行线和列线被短路。例如:6号键被按下时列线L2与行线R1被短路,此时行线R1电平被列线L2拉低,由原来的高电平变为低电平而其它行线电平依然不变,为低电平。此时单片机可读得行线状态进而判断按键所在行并记录下行号。之后使得4条列线全为高电平,5条行线全为低电平,为读列线状态做准备。同理6号键被按下时列线L2与行线R1被短路,此时列线L2电平被行线R1拉低,由原来的高电平变为低电平而其它行线电平依然不变,为低电平。此时单片机可读得列线状态进而判断按键所在列并记录下列号。然后按一定的按键编码规则可计算出6号键的键值。 2)键盘扫描方式 键盘扫描方式一般有三种:循环扫描方式,定时扫描方式,外部中断扫描方式。循环扫描方式需要不停地扫描键盘,影响其它功能执行工作效率低。定时扫描方式是利用单片机内部的定时器,产生一个适当时间的定时中断,单片机响应中断时对键盘进行扫描取键值过程,但是这种扫描方式不管键盘上是不是有键闭合单片机总是定时地扫描工作效率还是不高。外部中断扫描方式是只在键盘上有

4X4矩阵式键盘输入程序

4*4键盘程序 readkeyboard: begin: acall key_on jnz delay ajmp readkeyboard delay:acall delay10ms acall key_on jnz key_num ajmp begin key_num:acall key_p anl a,#0FFh jz begin acall key_ccode push a key_off:acall key_on jnz key_off pop a ret key_on: mov a,#00h orl a,#0fh mov p1,a mov a,p1 orl a,#0f0h cpl a ret key_p: mov r7,#0efh l_loop:mov a,r7 mov p1,a mov a,p1 orl a,#0f0h mov r6,a cpl a jz next ajmp key_c next: mov a,r7 jnb acc.7,error rl a mov r7,a ajmp l_loop error:mov a,#00h ret key_c:mov r2,#00h mov r3,#00h mov a,r6 mov r5,#04h again1:jnb acc.0,out1 rr a inc r2 djnz r5, again1 out1: inc r2 mov a,r7 mov r5,#04h again2:jnb acc.4,out2 rr a inc r3 djnz r5,again2 out2: inc r3 mov a, r2 swap a add a,r3 ret key_ccode:push a swap a anl a,#0fh dec a rl a ;行号乘 4 rl a mov r7,a pop a anl a,#0fh dec a add a,r7 ret delay10ms: anl tmod,#0f0h orl tmod,#01h mov th0,#0d8h mov tl0,#0f0h setb tr0 wait:jbc tf0,over ajmp wait clr tr0 over:ret 单片机键盘设计 (二)从电路或软件的角度应解决的问题 软件消抖:如果按键较多,硬件消抖将无法胜任,常采用软件消抖。通常采用软件延时的方法:在第一次检测到有键按下时,执行一段延时10ms的子程序后,再确认电平是否仍保持闭合状态电平,如果保持闭合状态电平,则确认真正有键按下,进行相应处理工作,消除了抖动的影响。(这种消除抖动影响的软件措施是切实可行的。) 2.采取串键保护措施。串键:是指同时有一个以上的键按下,串键会引起CPU错误响应。 通常采取的策略:单键按下有效,多键同时按下无效。 3.处理连击。连击:是一次按键产生多次击键的效果。要有对按键释放的处理,为了消除连击,使得一次按键只产生一次键功能的执行(不管一次按键持续的时间多长,仅采样一个数据)。否则的话,键功能程序的执行次数将是不可预知,由按键时间决定。连击是可以利用的。连击对于用计数法设计的多功能键特别有效。 三、键盘工作方式 单片及应用系统中,键盘扫描只是CPU的工作内容之一。CPU忙于各项任务时,如何兼顾键盘的输入,取决于键盘的工作方式。考虑仪表系统中CPU任务的份量,来确定键盘的工作方式。 键盘的工作方式选取的原则是:既要保证能及时响应按键的操作,又不过多的占用CPU的工作时间。 键盘的工作方式有:查询方式(编程扫描,定时扫描方式)、中断扫描方式。

简单的单片机矩阵键盘程序的写法

#include//QQ591421516编写 #define uint unsigned int #define uchar unsigned char uchar num; uchar code we[]={0xfe,0xfd}; uchar code du[]={0xc0,0xf9, 0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; void delay1ms(uint t) { uint x,y; for(x=t;x>0;x--) for(y=110;y>0;y--); } void keyinit() { uchar temp; P2=0x7f; temp=P2; temp&=0x0f; if(temp!=0x0f) { delay1ms(2); temp=P2; temp&=0x0f; if(temp!=0x0f) { temp=P2; switch(temp) { case 0x77:num=0;break; case 0x7b:num=1;break; case 0x7d:num=2;break; case 0x7e:num=3;break; } } } P2=0xbf; temp=P2; temp&=0x0f; if(temp!=0x0f) {

temp=P2; temp&=0x0f; if(temp!=0x0f) { temp=P2; switch(temp) { case 0xb7:num=4;break; case 0xbb:num=5;break; case 0xbd:num=6;break; case 0xbe:num=7;break; } } } P2=0xdf; temp=P2; temp&=0x0f; if(temp!=0x0f) { delay1ms(2); temp=P2; temp&=0x0f; if(temp!=0x0f) { temp=P2; switch(temp) { case 0xd7:num=8;break; case 0xdb:num=9;break; case 0xdd:num=10;break; case 0xde:num=11;break; } } } P2=0xef; temp=P2; temp&=0x0f; if(temp!=0x0f) { delay1ms(2);

单片机课程设计4X4矩阵键盘显示

长沙学院 《单片机原理及应用》 课程设计说明书 题目液晶显示4*4矩阵键盘按键号 程序设计 系(部)电子与通信工程系 专业(班级)电气1班 姓名龙程 学号09 指导教师刘辉、谢明华、王新辉、马凌 云 起止日期— 长沙学院课程设计鉴定表

《单片机技术及应用》课程设计任务书系(部):电子与电气工程系专业:11级电子一班指导教师:谢明华、刘辉

目录 前言 .......................................................................................................................................... 错误!未定义书签。 一、课程设计目的 .................................................................................................................... 错误!未定义书签。 二、设计内容及原理 ................................................................................................................ 错误!未定义书签。 单片机控制系统原理 ...................................................................................................... 错误!未定义书签。 阵键盘识别显示系统概述 ................................................................................................ 错误!未定义书签。 键盘电路 ............................................................................................................................ 错误!未定义书签。 12864显示器 ................................................................................................................... 错误!未定义书签。 整体电路图 ........................................................................................................................ 错误!未定义书签。 仿真结果 ............................................................................................................................ 错误!未定义书签。 三、实验心得与体会 ................................................................................................................ 错误!未定义书签。 四、实验程序 ............................................................................................................................ 错误!未定义书签。参考文献 .................................................................................................................................... 错误!未定义书签。

矩阵键盘单片机识别实验与程序

4×4矩阵键盘51单片机识别实验与程序 1.实验任务 如图所示,用AT89S51的并行口P1接4×4矩阵键盘,以-作输入线,以-作输出线;在数码管上显示每个按键的“0-F”序号。对应的按键的序号排列如图所示 图 2.硬件电路原理图

图 3.系统板上硬件连线 (1.把“单片机系统“区域中的-端口用8芯排线连接到“4X4行列式键盘” 区域中的C1-C4 R1-R4端口上; (2.把“单片机系统”区域中的AD0-AD7端口用8芯排线连接到“四路静态数码显示模块”区域中的任一个a-h端口上;要求:AD0对应着a,AD1 对应着b,……,AD7对应着h。 4.程序设计内容 (1.4×4矩阵键盘识别处理 (2.每个按键有它的行值和列值,行值和列值的组合就是识别这个按键的编码。矩阵的行线和列线分别通过两并行接口和CPU通信。每个按键 的状态同样需变成数字量“0”和“1”,开关的一端(列线)通过电 阻接VCC,而接地是通过程序输出数字“0”实现的。键盘处理程序的 任务是:确定有无键按下,判断哪一个键按下,键的功能是什么;还 要消除按键在闭合或断开时的抖动。两个并行口中,一个输出扫描码, 使按键逐行动态接地,另一个并行口输入按键状态,由行扫描值和回 馈信号共同形成键编码而识别按键,通过软件查表,查出该键的功能。 5.程序框图

图 C语言源程序 #include <> unsigned char code table[]={0x3f,0x06,0x5b,0x4f, 0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c, 0x39,0x5e,0x79,0x71}; unsigned char temp;

STM矩阵键盘程序

S T M矩阵键盘程序公司标准化编码 [QQX96QT-XQQB89Q8-NQQJ6Q8-MQM9N]

/*--------------------------------------------------------------------------------------* 矩阵键盘驱动 * 文件: * 编写人: LiuHui * 描述:扫描4x4 矩阵键盘输入,并返回键值 * 适用范围:驱动采用库编写,适用于STM32F10x 系列单片机 * 所用引脚: PA0-PA7 * 编写时间: 2014 年5 月20 日 --------------------------------------------------------------------------------------*/ #include "" #include "" #include "" /*--------------------------------矩阵键盘初始化----------------------------------------* 功能:初始化stm32 单片机GPIO //PA0-PA7 * 参数传递: * 输入:无 * 返回值:无 --------------------------------------------------------------------------------------*/ void KeyBoard_Init(void) { GPIO_InitTypeDef GPIO_InitStructure; = GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3; = GPIO_Speed_10MHz; = GPIO_Mode_Out_PP; GPIO_Init(GPIOA, &GPIO_InitStructure); = GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7; = GPIO_Speed_10MHz; = GPIO_Mode_IPD; GPIO_Init(GPIOA, &GPIO_InitStructure); GPIO_SetBits(GPIOA, GPIO_Pin_0 | GPIO_Pin_1 | GPIO_Pin_2 | GPIO_Pin_3); GPIO_ResetBits(GPIOA, GPIO_Pin_4 | GPIO_Pin_5 | GPIO_Pin_6 | GPIO_Pin_7); } /*------------------------------矩阵键盘扫描--------------------------------------------* 功能:扫描矩阵键盘,并返回键值 * 参数: * 输入:无 * 返回:有键按下返回该键值 * 无键按下时则返回0

单片机4X4矩阵键盘中断处理程序(1)

#include void main() { P0=0x00; //初始化LED数码管 TCON=0x01; //设置INT0、INT1触发方式IE=0x85; //使能INT0、INT1中断 while(1) { P3=0x0f; //接通矩阵键盘} } void counter0(void) interrupt 0 //INT0中断服务程序 { char key,key_h,key_l,delay; if(P3!=0x0f) //确认是否有键按下 for(delay=0;delay<100;delay++); //延时去抖动 if(P3!=0x0f) //重新确认是否有键按下 { P3=0x0f; key_h=P3^0x0f; //检测按键所在行 P3=0xf0; key_l=P3^0xf0; //检测按键所在列 key=key_h+key_l; } switch(key) //确定按键值并送入LED显示{ case 0x11:P0=0x06;break; case 0x21:P0=0x5b;break; case 0x41:P0=0x4f;break; case 0x81:P0=0x66;break; case 0x12:P0=0x6d;break; case 0x22:P0=0x7d;break; case 0x42:P0=0x07;break; case 0x82:P0=0x7f;break; case 0x14:P0=0x6f;break; case 0x24:P0=0x3f;break; case 0x44:P0=0x77;break; case 0x84:P0=0x7c;break; case 0x18:P0=0x39;break; case 0x28:P0=0x5e;break; case 0x48:P0=0x79;break; case 0x88:P0=0x71;break; default : P0=0x00;break; }

矩阵键盘设计实验报告

南京林业大学 实验报告 基于AT89C51 单片机4x4矩阵键盘接口电路设计 课程机电一体化设计基础 院系机械电子工程学院 班级 学号 姓名 指导老师杨雨图 2013年9月26日

一、实验目的 1、掌握键盘接口的基本特点,了解独立键盘和矩阵键盘的应用方法。 2、掌握键盘接口的硬件设计方法,软件程序设计和贴士排错能力。 3、掌握利用Keil51软件对程序进行编译。 4、用Proteus软件绘制“矩阵键盘扫描”电路,并用测试程序进行仿真。 5、会根据实际功能,正确选择单片机功能接线,编制正确程序。对实验结果 能做出分析和解释,能写出符合规格的实验报告。 二、实验要求 通过实训,学生应达到以下几方面的要求: 素质要求 1.以积极认真的态度对待本次实训,遵章守纪、团结协作。 2.善于发现数字电路中存在的问题、分析问题、解决问题,努力培养独立 工作能力。 能力要求 1.模拟电路的理论知识 2.脉冲与数字电路的理念知识 3.通过模拟、数字电路实验有一定的动手能力 4.能熟练的编写8951单片机汇编程序 5.能够熟练的运用仿真软件进行仿真 三、实验工具 1、软件:Proteus软件、keil51。 2、硬件:PC机,串口线,并口线,单片机开发板 四、实验内容 1、掌握并理解“矩阵键盘扫描”的原理及制作,了解各元器件的参数及格 元器件的作用。 2、用keil51测试软件编写AT89C51单片机汇编程序 3、用Proteus软件绘制“矩阵键盘扫描”电路原理图。 4、运用仿真软件对电路进行仿真。 五.实验基本步骤 1、用Proteus绘制“矩阵键盘扫描”电路原理图。 2、编写程序使数码管显示当前闭合按键的键值。 3、利用Proteus软件的仿真功能对其进行仿真测试,观察数码管的显示状 态和按键开关的对应关系。 4、用keil51软件编写程序,并生成HEX文件。 5、根据绘制“矩阵键盘扫描”电路原理图,搭建相关硬件电路。 6、用通用编程器或ISP下载HEX程序到MCU。 7、检查验证结果。

51单片机矩阵键盘程序示例

;lab5_asm ;vol 1.0 ;zqy ;2012/2/18 ;定义初始化 LED_CHABIT PSW.5;数码管显示标志位,为1显示十位,为0显示个位;数字0-9 ORG 00H JMP START ORG 000BH JMP INT_T0;转到中断服务程序,更改数码管显示 ORG 0100H LED_TAB1:DB 0BFH,86H,0DBH,0CFH,0E6H,0EDH DB 0FDH,87H,0FFH,0EFH,0BFH DB 86H,0DBH,0CFH,0E6H,0EDH,0FDH LED_TAB2: DB 0BFH,0BFH,0BFH,0BFH,0BFH DB 0BFH,0BFH,0BFH,0BFH,0BFH DB 86H,86H,86H,86H DB 86H,86H,86H

START: ;工作寄存器和某些数据单元的初始化 MOV R0,#0 ;数码管显示初始化 SETB LED_CHA MOVDPTR, #8300H;位选地址赋给DPTR高八位P2口,选中U13锁存器MOVA,#0FEH;位选数据,选中个位数码管,置低为选中 MOVX@DPTR, A;位选数据,对片外I/O口的外设芯片访问 MOVDPTR,#8200H;段选地址 MOVA,#0BFH;段选数据,个位显示0 MOVX@DPTR, A ;定时器初始化 MOV IE,#82H;开启定时器T0中断 MOV TMOD,#01H;设定定时器T0为模式1 MOV TH0,#0D8H MOV TL0,#0F0H;装入初值,10MS延时12MHZ SETB TR0 ;启动定时器T0 KEY: ;按键处理 LCALL KEY_START;调用判断有无键按下子程序 JZ KEY;无键按下,重新扫描

相关主题
文本预览
相关文档 最新文档