独立按键和矩阵键盘练习

内容来自b站小蜜蜂老师
小蜜蜂老师

practise 1

一、原理图

二、结构分析
从上面电路图可以看出当J5跳帽接为2 3时s7 s6 s5 s4为独立键盘
此时接地端gnd当我们的I/O口检测到低电平时说明我们的按键已经按下
#include "reg52.h"/********************************************
Date:2022-1-11
Author:小殷同学
Learn From:B 站小蜜蜂老师
*********************************************///独立按键定义
sbit S7 = P3^0;
sbit S6 = P3^1;
sbit S5 = P3^2;
sbit S4 = P3^3;//Led定义
sbit L0 = P0^0;
sbit L1 = P0^1;
sbit L2 = P0^2;
sbit L3 = P0^3;void delay(unsigned char t)
{while(t--);
}//-----------------------------74HC138初始化-----------------------
void Init_74HC138(unsigned char n)
{switch(n){case 4:P2 = P2 | 0x1f; P2 = 0x80; break;        //Y4case 5:P2 = P2 | 0x1f; P2 = 0xa0; break;      //Y5case 6:P2 = P2 | 0x1f; P2 = 0xc0; break;      //Y6case 7:P2 = P2 | 0x1f; P2 = 0xe0; break;      //Y7}
}
//------------------------------------------------------------------//---------------------------关闭继电器和蜂鸣器------------------------
void InitSystem(void)
{Init_74HC138(5);P0 = 0x00;            //关闭继电器和蜂鸣器
}
//---------------------------------------------------------------------//----------------------------独立按键扫描函数-------------------------
void KeyScan_Single(void)
{if(S7 == 0){delay(20);if(S7 == 0){L0 = 0;while(S7 == 0);      //等待按键松开L0 = 1;}}if(S6 == 0){delay(20);if(S6 == 0){L1 = 0;while(S6 == 0);     //等待按键松开L1 = 1;}}if(S5 == 0){delay(20);if(S5 == 0){L2 = 0;while(S5 == 0);    //等待按键松开L2 = 1;}}if(S4 == 0){delay(20);if(S4 == 0){L3 = 0;while(S4 == 0);              //等待按键松开L3 = 1;}}
}
//---------------------------------------------------------------------//-----------------------------------主函数-----------------------------
void main(void)
{InitSystem();Init_74HC138(4);P0 = 0xff;while(1){KeyScan_Single();}}

prctise 2 io扩展

//将下面这个功能函数在主函数中调用就行了
//在这里使用一个状态标志位很灵活的处理了不同按键之间的相互控制
//----------------------------独立按键扫描函数-------------------------
unsigned char status = 0;//状态标志位
void KeyScan_Single(void)
{if(S7 == 0){delay(20);if(S7 == 0){if(status  == 0){L1 = 0;status = 1;}else if(status == 1){L1 = 1;status = 0;}while(S7 ==0);         }}if(S6 == 0){delay(20);if(S6 == 0){if(status == 0){L2 = 0;status = 2;}else if(status == 2){L2 = 1;status = 0;}while(S6 == 0);}}if(S5 == 0){delay(20);if(S5 == 0){if(status == 1){L3 = 0;while(S5 == 0);L3 = 1;}else if(status == 2){L5 = 0;while(S5 == 0);L5 = 1;}}}if(S4 == 0){delay(20);if(S4 == 0){if(status == 1){L4 = 0;while(S4 == 0);L4 = 1;}else if(status == 2){L6 = 0;while(S4 == 0);L6 = 1;}}}
}
//---------------------------------------------------------------------

3.矩阵键盘

当我们把J5跳帽接在1的时候为矩阵键盘 在使用过程中特别要注意 有两个引脚为P4^2-WR P4^4-RD 在单片机中并没有定义P4 io口所以需要我们自己设置一下
sfr P4 = 0xC0

#include "reg52.h"/********************************************
Date:2022-1-11
Author:小殷同学
Learn From:B 站小蜜蜂老师
*********************************************/sfr P4 = 0xC0;   //定义行
sbit H1 = P3^0;
sbit H2 = P3^1;
sbit H3 = P3^2;
sbit H4 = P3^3;//定义列
sbit L1 = P3^4;
sbit L2 = P3^5;
sbit L3 = P4^2;
sbit L4 = P4^4;//共阳数目管段码    0-f
unsigned char code SMG_Duan[] = {0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E};//简单延时函数
void delay(unsigned int t)
{while(t--);while(t--);
}//----------------------------74HC138初始化---------------------------
void Init_74HC138(unsigned char n)
{switch(n){case 4:P2 = P2| 0x1f; P2 = 0x80; break;        //Y4case 5:P2 = P2| 0x1f; P2 = 0xa0; break;       //Y5case 6:P2 = P2| 0x1f; P2 = 0xc0; break;       //Y6case 7:P2 = P2| 0x1f; P2 = 0xe0; break;       //Y7}
}
//---------------------------------------------------------------------//----------------------------系统初始化-------------------------------
void InitSystem(void)
{Init_74HC138(5); P0 = 0x00;           //关闭继电器和蜂鸣器Init_74HC138(4); P0 = 0xff;         //关闭led
}
//---------------------------------------------------------------------//-------------------------------数码管安位显示------------------------
void SMG_DispalyBit(unsigned char pos ,unsigned char dat)
{Init_74HC138(6);  //选通数码管位P0 = 0x01 << pos;Init_74HC138(7);  //段选P0 = dat;
}
//---------------------------------------------------------------------//------------------------------矩阵逐行扫描---------------------------//逐行扫描:通过高四位轮流输出低电平来对矩阵键盘进行逐行扫描,
//当低四位接收到的数据不全为1的时候,说明有按键按下
//然后通过接收到的数据是哪一位为0来判断是哪一个按键被按下unsigned char Key_Num = 0; //记录按下的键值void MaxtrixKeyScans(void)
{H1 = 0; //第一行为0 去分别扫描列H2 = H3 = H4 =1;L1 = L2 = L3 =L4 =1;if(L1 ==0){while(L1 == 0);Key_Num = 0;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L2 == 0){while(L2 == 0);Key_Num = 1;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L3 == 0){while(L3 == 0);Key_Num = 2;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L4 == 0){while(L4 == 0);Key_Num = 3;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}H2 = 0; //第二行为0 去分别扫描列H1 = H3 = H4 =1;L1 = L2 = L3 =L4 =1;if(L1 ==0){while(L1 == 0);Key_Num = 4;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L2 == 0){while(L2 == 0);Key_Num = 5;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L3 == 0){while(L3 == 0);Key_Num = 6;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L4 == 0){while(L4 == 0);Key_Num = 7;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}H3 = 0; //第三行为0 去分别扫描列H1 = H2 = H4 =1;L1 = L2 = L3 =L4 =1;if(L1 ==0){while(L1 == 0);Key_Num = 8;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L2 == 0){while(L2 == 0);Key_Num = 9;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L3 == 0){while(L3 == 0);Key_Num = 10;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L4 == 0){while(L4 == 0);Key_Num = 11;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}H4 = 0; //第四行为0 去分别扫描列H2 = H3 = H1 =1;L1 = L2 = L3 =L4 =1;if(L1 ==0){while(L1 == 0);Key_Num = 12;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L2 == 0){while(L2 == 0);Key_Num = 13;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L3 == 0){while(L3 == 0);Key_Num = 14;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}else if(L4 == 0){while(L4 == 0);Key_Num = 15;SMG_DispalyBit(0,SMG_Duan[Key_Num]);}}
//---------------------------------------------------------------------//-----------------------------矩阵扫描二行列扫描----------------------
//原理思想:行列扫描:通过高四位全部输出低电平,低四位输出高电平。
//当接收到的数据,低四位不全为高电平时,说明有按键按下,然后通过接收的数据值,
//判断是哪一列有按键按下,然后再反过来,高四位输出高电平,低四位输出低电平,
//然后根据接收到的高四位的值判断是那一行有按键按下,这样就能够确定是哪一个按键按下了//--------------------------------------------------------------------void main(void)
{InitSystem();while(1){MaxtrixKeyScans();}
}

【蓝桥杯练习-独立按键和矩阵键盘】相关推荐

  1. 蓝桥杯单片机 独立按键与矩阵按键

    文章目录 前言 一.蓝桥杯按键原理图 二.独立按键与矩阵按键处理思路 1.独立按键 2.矩阵按键 代码实现 总结 前言 按键设计一般分为两种:独立按键和矩阵键盘.按键数量较少的用前者,按键数量较多的用 ...

  2. 蓝桥杯国信长天单片机--独立按键和矩阵键盘模块(七)

    独立按键模块 1-2短接实现矩阵按键:2-3短接实现独立按键. 案例: 独立按键,S6,打开所有LED ,S7,关闭所有LED.S4 ,打开蜂鸣器,S5,关闭蜂鸣器 #include "re ...

  3. vba循环通过键盘某个按键按下退出循环_51单片机按键检测--独立按键与矩阵键盘...

    按键可以说是51单片机项目开发的一个重要组件了,它是作为51单片机IO口输入的一种重要方式.我们可以通过按键控制单片机执行相应的程序,得到我们想要得效果.51单片机的按键输入主要有两种,一种是独立按键 ...

  4. 按键(独立按键、矩阵键盘)——附带程序

    按键 一.独立按键: 简介: 消抖: 代码: 二.矩阵键盘 : 行列反转扫描法: 按键对照表: 三.矩阵键盘实验 效果展示: 仿真电路图: 代码: 一.独立按键: 简介: 接触式按键,又叫轻触开关 接 ...

  5. 蓝桥杯 单片机 独立按键 的使用

    独立按键 使用 独立按键原理 独立按键在电路中相当于一个开关,当按键按下时,电路闭合,松手时按键自动抬起,电路断开. 独立按键一端连接单片机I/O口,一端接地. 单片机I/O顾名思义,就是既能输入也能 ...

  6. 51单片机键盘接口-独立按键和矩阵按键

    51单片机键盘接口-独立按键和矩阵按键 按键的分类 键输入原理 独立式键盘 矩阵键盘 消抖 键码识别 键盘程序 按键的分类 按键按照结构原理可分为两类:一类是触点式开关按键,如机械开关.导电橡胶开关等 ...

  7. 51单片机独立按键和矩阵按键实现

    这里写目录标题 独立按键实验 矩阵按键实验 独立按键实验 按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开.我们开发板上使用的按键及内部简易图如下图所示 管脚与管脚之间( ...

  8. m0单片机io口_51单片机独立按键和矩阵按键实现

    独立按键实验 按键是一种电子开关,使用时轻轻按开关按钮就可使开关接通,当松开手时, 开关断开.我们开发板上使用的按键及内部简易图如下图所示 管脚与管脚之间(注意是距离)距离长的是导通状态,短的是接通状 ...

  9. 独立按键和矩阵按键c语言,第八章 独立按键和矩阵按键

    我们和单片机之间进行信息交互,主要包含两大类,输入设备和输出设备.前边讲的LED小灯.数码管.点阵都是输出设备,这节课我们学习一下最常用的输入设备--按键.在本节课的学习过程中我们还会穿插介绍一点硬件 ...

最新文章

  1. STM32 定时器 定时时间的计算
  2. springboot出现Requested bean is currently in creation: Is there an unresolvable circular reference?
  3. Multilink ppp多链接PPP协议的配置
  4. java定义接口_一文知道Java中接口的定义
  5. Java Long类shortValue()方法与示例
  6. 各厂商服务器ESXI最高版本适配情况
  7. 学习ASP.NET Core Razor 编程系列三——创建数据表及创建项目基本页面
  8. Python可视化工具Matplotlib 3.0版出炉,改进默认后端选择,饼图终于变圆了
  9. Android 跳转权限设置界面的终极方案
  10. svg 贝塞尔曲线图解(记录)
  11. 11个审查Linux是否被入侵的方法
  12. python进阶(一)
  13. 编译原理(紫龙书)第2版习题答案
  14. Power Query批量合并Excel文件
  15. 《今日简史》2018比尔盖茨推荐(pdf, mobi, epub三种格式)
  16. Adobe国际认证设计师证书含金量怎么样?
  17. 校园二手物品交易平台实现查询交易订单情况功能
  18. itunes下载的软件怎么安装到手机
  19. Android应用程序(APK)的编译打包过程
  20. 【java基础】数据类型是啥?有啥用?

热门文章

  1. 火爆全网的《鱿鱼游戏》你看了吗?Python来全面分析一波!
  2. 【微信小程序】蓝牙连接 流程
  3. 好的架构就是--把模块与模块之间的直接关系均转换成通过架构来发生的间接关系
  4. localtime的c语言实现(gmtime64)
  5. 【操作系统】Operating System Conceptions第三章知识整理总结
  6. Redis事件驱动框架
  7. 【汇编程序】实现判断输入字母大小写
  8. linux之find命令,Linux之Find命令详解
  9. 地震wiggle图显示
  10. 编程:是一门艺术(转)