一个51单片机的键盘扫描程序

发布者:SecretWhisper最新更新时间:2017-11-14 来源: eefocus关键字: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 
#include 

//独立键盘.无按键动作时其返回值num_key=0,否则返回按键号num_key 
extern unsigned char keyboard_self() 

        unsigned char num_key=0;//按键号 
        unsigned char temp=0;//用于读取P2线上按键值 
        static unsigned char temp_code=0;//保存按键值 
        static unsigned char num_check=0;//低电平有效次数 
        static unsigned char key_flag=0;//按键有效标识 

        temp=P2&0xF0;//读取P2线数据 

        if(temp!=0xF0)//低电平判断 
        { 
                num_check++; 
                if(num_check==10)//连续10次(10ms)低电平有效,则认为按键有效 
                { 
                        key_flag=1;//使能按键有效标识 
                        temp_code=temp;//保存按键值 
                } 
        } 
        else//松手时判断 
        { 
                num_check=0; 

                if(key_flag==1)//按键有效 
                { 
                        key_flag=0; 

                        switch(temp_code)//读取按键号 
                        { 
                                case 0xE0: num_key=1; 
                                           break; 
                                case 0xD0: num_key=2; 
                                           break; 
                                case 0xB0: num_key=3; 
                                           break; 
                                case 0x70: num_key=4; 
                                           break; 
                        } 
                } 
        } 

        return(num_key); 

 

现在是矩阵键盘的 
----------------------------------------------------------------------- 
#include 
#include  

//矩阵键盘.无按键动作时其返回值num_key=0,否则返回按键号num_key****检测高四位 
extern unsigned char keyboard_matrix() 

        unsigned char num_key=0;//按键号 
        unsigned char temp=0;//读取P2口线数据 
        static unsigned char temp_code=0;//用于保存按键值 
        static unsigned char temp_circle=0xFE;//保存P2线上的循环扫描值 
        static unsigned char num_check=0;//低电平计数 
        static unsigned char key_flag=0;//按键有效标识 

        P2=temp_circle;//0xFX 
        temp=P2;//读取P2口线数据 
        if(temp!=temp_circle)//有按键动作 
        { 
                num_check++;//低电平计数|逢低电平加1 
                if(num_check==10)//连续10次(10ms)低电平有效 
                { 
                        key_flag=1;//按键有效标识置1 
                        temp_code=temp;//保存按键值 
                } 
        } 
        else//松手OR无按键动作,此时应该改变扫描线 
        { 
                num_check=0; 
                if(key_flag==1)//按键有效判断 
                { 
                        key_flag=0; 
                        switch(temp_code)//读取按键号 
                        { 
                                //P2^0线 
                                case 0xEE: num_key=1; 
                                           break; 
                                case 0xDE: num_key=2; 
                                           break; 
                                case 0xBE: num_key=3; 
                                           break; 
                                case 0x7E: num_key=4; 
                                           break; 
                                //P2^1线 
                                case 0xED: num_key=5; 
                                           break; 
                                case 0xDD: num_key=6; 
                                           break; 
                                case 0xBD: num_key=7; 
                                           break; 
                                case 0x7D: num_key=8; 
                                           break; 
                                //P2^2线 
                                case 0xEB: num_key=9; 
                                           break; 
                                case 0xDB: num_key=10; 
                                           break; 
                                case 0xBB: num_key=11; 
                                           break; 
                                case 0x7B: num_key=12; 
                                           break; 
                                //P2^3线 
                                case 0xE7: num_key=13; 
                                           break; 
                                case 0xD7: num_key=14; 
                                           break; 
                                case 0xB7: num_key=15; 
                                           break; 
                                case 0x77: num_key=16; 
                                           break; 
                        } 
                } 
                temp_circle=_crol_(temp_circle,1);//改变扫描线 
                if(temp_circle==0xEF) 
                { 
                        temp_circle=0xFE; 
                } 
        } 
        return(num_key);//返回按键号 


/************************************************************************* 

未按键时,扫描线一直变化。 
长按键时,扫描线不变化,使得该行按键变成了独立按键,这样的扫描效率极高。 
如当按下P2.0线上的某个键时,程序将扫描到这个键,而后扫描线不变化, 
当键盘程序连续10次进入时检测到10次按键有效,直到松手后扫描线才变化 

*************************************************************************/

关键字:51单片机  键盘扫描程序 引用地址:一个51单片机的键盘扫描程序

上一篇:51单片机特殊功能寄存器和位定义
下一篇:51单片机简易加法计算器

推荐阅读最新更新时间:2024-03-16 15:44

51单片机入门 - DS18B20温度传感器
DS18B20——温度传感器,单片机可以通过 1-Wire 和 DS18B20 进行通 信,最终将温度读出。1-Wire 总线的硬件接口很简单,只需要把 18B20 的数据引脚和单片 机的一个 IO 口接上就可以通信。最高12为的温度存储值,补码形式存储。 2字节,LSB低字节,MSB高字节,-55~125 1、初始化 检测存在脉冲:总线上存在DS18B20,总线会根据时序要求返回一个低电平脉冲。单片机要拉低这个引脚,持续大概 480us到960us之间 的时间即可,我们的程序中持续了 500us。然后,单片机释放总线,就是给高电平,DS18B20 等待大概 15 到 60us 后,会主动拉低这个引脚大概是 60 到 240u
[单片机]
MCS - 51单片机寄存器功能
21个特殊功能寄存器(52系列是26个)不连续地分布在128个字节的SFR存储空间中,地址空间为80H-FFH,在这片SFR空间中,包含有128个位地址空间,地址也是80H-FFH,但只有83个有效位地址,可对11个特殊功能寄存器的某些位作位寻址操作(这里介绍一个技巧:其地址能被8整除的都可以位寻址)。 在51单片机内部有一个CPU用来运算、控制,有四个并行I/O口,分别是P0、P1、P2、P3,有ROM,用来存放程序,有RAM,用来存放中间结果,此外还有定时/计数器,串行I/O口,中断系统,以及一个内部的时钟电路。在单片机中有一些独立的存储单元是用来控制这些器件的,被称之为特殊功能寄存器(SFR)。这样的特殊功能寄存器51单片机
[单片机]
MCS - <font color='red'>51单片机</font>寄存器功能
基于51单片机的电子闹钟设计
使用的单片机是 STC89C52 此设计可以 年 月 日 时 分 秒显示和闹钟功能 能通过8个按键自由调整 时 分 秒 闹钟响铃时间 带复位按键,要是模块抽风,摁复位按键即可! 使用 LCD16020A 屏幕显示 屏幕电路设有电位器,可以调整清自由屏幕晰度 原理图上均标注了每个元件的 值和型号,方便购买正确的元件 程序代码在附件里 无需改动,直接烧录即可 原理图: PCB: 实物图: 程序运行图: 部分程序: /** * @brief 利用定时器中断 完成LED流水 */ #include REGX52.H #include LCD1602.h #include Key.h #include Buzzer.h
[单片机]
MCS-51单片机的无条件转移指令用法介绍
控制转移指令用于控制程序的流向,所控制的范围即为程序存储器区间,MCS-51系列单片机的控制转移指令相对丰富,有可对64kB程序空间地址单元进行访问的长调用、长转移指令,也有可对2kB字节进行访问的绝对调用和绝对转移指令,还有在一页范围内短相对转移及其它无条件转移指令,这些指令的执行一般都不会对标志位有影响。 MCS-51单片机的无条件转移指令用法介绍 无条件转移指令 这组指令执行完后,程序就会无条件转移到指令所指向的地址上去。长转移指令访问的程序存储器空间为16地址64kB,绝对转移指令访问的程序存储器空间为11位地址2kB空间。 LJMP addr16 ;addr16→(PC),给程序计数器赋予新值(16位地址) AJ
[单片机]
基于51单片机的音频交换控制系统设计
1、引言   小型会议系统或语音群聊系统是由多路音频电路组成的.为了使通话井然有序,需要通过音频交换电路来控制各路音频信号的输出。音频交换电路主要用于完成语音信号的切换。以实现同频终端的话音通信。经对可靠性、经济性、兼容性和供货情况进行多方面的综合考虑,该控制系统选用了AT89S52型单片机和交换控制矩阵器件MT8816AE。其中,AT89S52型单片机具有实用,价廉,功耗小,速度快,体积小,功能强等优点:MT8816AE是CMOS单片集成电路,具有功耗小,可靠性高等特点。 2、控制系统组成和电路设计   图1给出整个系统组成框图。它由主控计算机、音频交换电路、终端设备等组成。其工作原理是:在主控计算机捕获终端的工作频率后。向
[单片机]
基于<font color='red'>51单片机</font>的音频交换控制系统设计
浮点数出栈--MCS-51单片机实用子程序
FPOP 功能:浮点数出栈 入口条件:操作数处于栈顶。 出口信息:操作数弹至 中。 影响资源:A、R2、R3 堆栈需求: 2字节 FPOP: POP ACC ;将返回地址保存在R2R3中 MOV R2,A POP ACC MOV R3,A INC R0 INC R0 POP ACC ;将操作数弹出堆栈,传送到 中 MOV @R0,A DEC R0 POP ACC MOV @R0,A DEC R0 POP ACC MOV @R0,A MOV A,R3 ;将返回地址压入堆栈 PUSH ACC MOV A,R2 PUSH ACC RET ;返回主程序
[单片机]
51单片机风扇和测温程序
使用的模块有:直流电机,舵机,蜂鸣器,红外,温度传感器,lcd1602, , 舵机,这种舵机它的频率是50HZ,一个周期为20ms,是通过一个周期中高低电平的占比来控制角度的角度的,本程序舵机是来回摆动,不是停在五个角度(0,45,90,135,180)的某个角度,可通过红外遥控来实现停在某个角度,电扇的开关,也由红外来控制。 为了方便起见,将过温自动报警,和使用舵机的功能,分成两种模式,可通过红外遥控来切换,因为我之前遇到过,使用了舵机后(需要用到定时器),温度就不能正常显示, 通过DS18b20来测温度,在lcd1602上显示温度和时间,当温度超过26度时(可在代码中修改),直流电机打开,蜂鸣器报警,低于26关闭。也可
[单片机]
ARM芯片和51单片机区别
第一,处理速度块、处理能力强、储存容量大、给用户带来便利。 传统的51单片机为8为处理器,而ARM芯片为32位处理器,简单的说,51单片机就是前期我们应用的 赛扬 式电脑,而ARM芯片就是我们现在应用的 双核 式电脑。虽然两者本质区别不大,都能够作为硬件设计平台去实现技术要求,但是ARM芯片由于自身特性(处理速度、处理能力和储存容量等)比51单片机都要强很多,为此在技术实现上也显得比51单片机游刃有余。正是这种游刃有余,后期更容易给客户提供升级、扩容、改造等便利。 第二
[单片机]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved