找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 12877|回复: 4
打印 上一主题 下一主题
收起左侧

单片机讲义12:矩阵按键

[复制链接]
跳转到指定楼层
楼主
第12讲 矩阵按键
知识点:
1、 单片机程序的一般结构
2、 keil 基本使用
3、 单片机识别按键的注意点
4、 识别矩阵按键的一种方法


一、单片机程序的一般结构
1、前后台结构 前后台结构是最常用的结构。所谓前后台结构就是主循环+中断的方式,主
循环称为后台,前台就是中断程序。主循环用 while(1)或其它死循环结构轮询
任务,而前台负责处理实时性要求较高的任务,或者外部中断任务,一般把按键 扫描、显示扫描放在定时中断里。
2、占用式程序与非占用式程序
凡是用 while、for 等循环语句实现的程序都称为占用式程序。占用式程序的特 点是 CPU 必须执行完所有的循环任务才能退出,除非有中断发生,比如我们做的 独立按键处理程序就是占用式程序。在单片机程序设计中要尽量避免设计占用式 程序。与其相对应的是非占用式程序,非占用式程序能提高 CPU 的使用效率,让 所有的任务都能及时得到响应。
二、keil 基本使用
1、点击工程文件图标,进入源代码编辑区。
2、保存、编译、生成 hex 文件
3、下载、运行

三、单片机识别按键的注意点
识别哪个键被按下(通过读取键码的方式)、识别按键所处的状态(有效方 式),常用的有效方式:抬起有效、按下有效、组合有效、长按有效等

四、识别矩阵按键的一种方法
矩阵式按键接法,是利用单片机的IO 口组成行与列,在行与列的每一个 交点处连接按键。故也称为矩阵式按键。电路结构如下所示:
file:///Z:/TEMP/msohtmlclip1/01/clip_image002.jpg
这种按键的识别方法,我们会在第 5 个知识点上详细讲解。


五、单片机识别按键的一般思路:

一般情况下,单片机识别按键的目的是识别当前按键的状态,意 思就是说,一要识别是哪个键动作了(键码),还要识别当前按键 是何状态,也称为有效方式,当然了这里的状态大多是与时间有关的,并执行相应的动作。比如,开发板上独立式按键实验,当按键

按下并抬起时,LED 被点亮。这是最简单的识别。因为是一支按键,所以不用识别是哪个键被按下,只需识别按键的状态。一般的按键 状态有以下几种:按下,抬起,长按,组合,长按多长时间等等。

一个完整的按键动作必须包含下面四个阶段: 按键按下-à按下消抖-à按键抬起-à抬起消抖 在单片机与按键接口程序中,往往先进行按下消抖,而对按键状态的 判断就是指按键处理了。这里的按键处理不是执行相应的动作,而是 区分按键此刻处于何种状态,并改变相应状态变量的值,以便程序其 它地方通过检测相应的按键状态变量去执行相应的动作。比如,我们可以把按下并抬起的短按点亮 LED,改成长按一段时间点亮 LED。总的来讲,单片机识别按键就分为三个阶段:按键消抖---按键处理---


按键执行。这个思路适用于所有形式的按键。至于为什么要消抖?是 因为我们在操作按键时,不可能立即按下或抬起,机械式按键接触面 不是立刻就接触或断开的,而单片机的检测速度特别快,这样往往会 发生误判,因此,我们要等待电平稳定了,再去处理按键。消抖的方 式很简单,就是利用延时,等待一个稳定电平的到来。

六、识别行列式按键的一种方法
H:表示行;L:表示列;


  L0 P13
  L1 P12
  L2 P11
  L3 P10
   
  H0  P17
  0
  1
  2
  3
   
  H1  P16
  4
  5
  6
  7
   
  H2  P15
  8
  9
  10
  11
   
  H3  P14
  12
  13
  14
  15
   






我们先测试列,测试列时,把行控 IO 设置为 0,列空IO 设置为 1
即:P1 = 0X0F;此时若有按键被按下,我们可以得到 4 组编码:
0X07,0X0B,0X0D,0X0E;每一组又对应列的四个按键。然后我们再测试行:P1 = 0XF0;又可以得出四个按键编码,这样就可以判断是哪个键被按下了。这里依然是抬起有效。




这是以前给小学生培训单片机做的一套讲义,尽可能的做到了通俗易懂,现分享给大家,绝对的纯原创资料.
全部资料下载地址(共15章,pdf格式):http://www.51hei.com/bbs/dpj-98524-1.html









分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏4 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:435312 发表于 2018-12-2 19:01 | 只看该作者
学习一下
回复

使用道具 举报

板凳
ID:508017 发表于 2019-5-11 19:56 | 只看该作者
给小学生培训的,,惭愧啊
回复

使用道具 举报

地板
ID:887908 发表于 2021-3-3 09:50 | 只看该作者
怎样下载学习一下呢?
回复

使用道具 举报

5#
ID:1017814 发表于 2022-4-16 15:02 | 只看该作者
我的按键扫描程序如下,讲老大们给于评判。
unsigned char key_scan()
{
        hang1=0;
        hang2=1;
        hang3=1;
        hang4=1;
        if(lie1==0)                                //right         15
        {
                 key_delay();
                if(lie1==0)
                {
                   return 'R'+'\0';
                }
                while(lie1==0);
        }
        if(lie2==0)                                   //up                14
        {
                 key_delay();
                if(lie2==0)
                {
                   return 'U'+'\0';
                }
                while(lie2==0);
        }
        if(lie3==0)                                //down           13
        {
                 key_delay();
                if(lie3==0)
                {
                   return 'D'+'\0';
                }
                while(lie3==0);
        }
        if(lie4==0)                                        //left           12
        {
                 key_delay();
                if(lie4==0)
                {
                   return 'L'+'\0';
                }
                while(lie4==0);
        }
        hang1=1;
        hang2=0;
        hang3=1;
        hang4=1;
        if(lie1==0)                                //ok
        {
                 key_delay();
                if(lie1==0)
                {
                   return 'Y'+'\0';
                }
                while(lie1==0);
        }
        if(lie2==0)                                   //9
        {
                 key_delay();
                if(lie2==0)
                {
                   return 9;
                }
                while(lie2==0);
        }
        if(lie3==0)                                //3
        {
                 key_delay();
                if(lie3==0)
                {
                   return 3;
                }
                while(lie3==0);
        }
        if(lie4==0)                                        //6
        {
                 key_delay();
                if(lie4==0)
                {
                   return 6;
                }
                while(lie4==0);
        }
        hang1=1;
        hang2=1;
        hang3=0;
        hang4=1;
        if(lie1==0)                                //0
        {
                 key_delay();
                if(lie1==0)
                {
                   return 0;
                }
                while(lie1==0);
        }
        if(lie2==0)                                   //8
        {
                 key_delay();
                if(lie2==0)
                {
                   return 8;
                }
                while(lie2==0);
        }
        if(lie3==0)                                //2
        {
                 key_delay();
                if(lie3==0)
                {
                   return 2;
                }
                while(lie3==0);
        }
        if(lie4==0)                                        //5
        {
                 key_delay();
                if(lie4==0)
                {
                   return 5;
                }
                while(lie4==0);
        }
        hang1=1;
        hang2=1;
        hang3=1;
        hang4=0;
        if(lie1==0)                                //ESC
        {
                 key_delay();
                if(lie1==0)
                {
                   return 'N'+'\0';
                }
                while(lie1==0);
        }
        if(lie2==0)                                   //7
        {
                 key_delay();
                if(lie2==0)
                {
                   return 7;
                }
                while(lie2==0);
        }
        if(lie3==0)                                //1
        {
                 key_delay();
                if(lie3==0)
                {
                   return 1;
                }
                while(lie3==0);
        }
        if(lie4==0)                                        //4
        {
                 key_delay();
                if(lie4==0)
                {
                   return 4;
                }
                while(lie4==0);
        }
        return 0xff;                   
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表