b2科目四模拟试题多少题驾考考爆了怎么补救
b2科目四模拟试题多少题 驾考考爆了怎么补救

单片机系统中I/O口的工作原理和检测方法

电脑杂谈  发布时间:2021-02-15 11:03:29  来源:网络整理

当独立键盘连接到单片机时,每个键都需要单片机的I / O端口。如果一个单片机系统需要更多的键,则如果使用独立的键,它将占用太多的I / O端口资源。单片机系统中的I / O端口资源通常很宝贵。为了在使用多个键时节省I / O端口线,我们引入了矩阵键盘

我们以4X4矩阵键盘为例来说明其工作原理和检测方法。将16个按钮排列为4行4列。第一行将每个按钮的一端连接在一起以形成一行,而第一列将每个按钮的另一端连接在一起以形成一行,因此共有4行。 4列中有8根电线。我们将这8条线连接到在“和”关系之后反射到导线上。”这两个句子构成了矩阵键盘扫描的整体。要很好地理解,如果您无法理解,只需记住即可。

现在,我将详细描述矩阵键盘扫描的原理和步骤:

左岸魔屋百度影音_51 矩阵键盘_同元藏文输入法键盘布局图

矩阵键盘扫描的原理

方法1:

逐行扫描:我们可以通过依次输出高四位中的低电平来逐行扫描矩阵键盘。当低四位接收的数据不是全部为1时,表示存在按键,然后通过接收到的接收数据的哪一位为0来确定按下了哪个按钮。

51 矩阵键盘_左岸魔屋百度影音_同元藏文输入法键盘布局图

方法2:

行和列扫描:我们可以通过高四位输出低电平,通过低四位输出高电平。当接收到的数据的低四位不都为高时,表示按下了按钮,然后根据接收到的数据值,判断哪一列按下了按钮,反之亦然,高四位输出为高等级。低四位数字输出低电平,然后根据高四位数字的接收值,判断哪一行有按钮被按下,从而可以确定哪个按钮被按下。

接下来,给出一个矩阵键盘程序的示例。本示例使用两组IO端口P 0、 P1。 P1用于检测矩阵键盘中是否有按下的键,P0用于驱动静态数字管的显示。

以下是示例程序:

#include "reg52.h"
   typedef unsigned char u8;
   typedef unsigned int u16;
   #define GPIO_DIG P0
   #define GPIO_KEY P1
   u8 code smgduan[16]= {0x3f, 0x06, 0x5b, 0x4f,
                    0x66, 0x6d, 0x7d, 0x07,
					0x7f, 0x6f, 0x77, 0x7c,
					0x39, 0x5e, 0x79, 0x71};//静态数码管码值
  u8 KeyColValue;
  u8 KeyLineValue;
  void delay(u16 i) //延时函数
  {
   while(i --);
  }
  void KeyDown() //键盘按键扫描函数
  {
  char a;
  GPIO_KEY = 0x0f;
  if(GPIO_KEY != 0x0f)//检测4行中哪一行按键是否按下
  {
   delay(1000); //延时消抖
   if(GPIO_KEY != 0x0f) //再次检测4行中哪一行按键是否按下
   {
   switch(GPIO_KEY) //根据IO的值来确定哪一行按键按下
   {
   case(0x07): KeyColValue = 0; break;
   case(0x0b): KeyColValue = 1; break;
   case(0x0d): KeyColValue = 2; break;
   case(0x0e): KeyColValue = 3; break;
   }
   }
  }
  GPIO_KEY = 0xf0;
  if(GPIO_KEY != 0xf0) //检测4行中哪一列按键是否按下
  {
   delay(1000);  //延时消抖
   if(GPIO_KEY != 0xf0) //再次检测4行中哪一列按键是否按下
   {
   switch(GPIO_KEY) //根据IO的值来确定哪一列按键按下
   {
   case(0x70): KeyLineValue = 0; break;
   case(0xb0): KeyLineValue = 1; break;
   case(0xd0): KeyLineValue = 2; break;
   case(0xe0): KeyLineValue = 3; break;
   }
   }
   while((a < 50) && (GPIO_KEY != 0xf0))  //延时,确保没有按键再按下
  {
   delay(1000);
   a ++;
  }
  }
  
  }
   void main()
   {
   while(1)
   {
   KeyDown();//检测按键是否按下
   GPIO_DIG = ~smgduan[KeyLineValue*4 + KeyColValue];//根据按键的行列值,静态数码管显示相应的值
   }
   }


本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/bofangqi/article-357419-1.html

    相关阅读
      发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

      热点图片
      拼命载入中...