51单片机第3步_4X4键盘应用

以前学习51单片机,总想着电路设计,所以程序里也体现了器件的电气连接。这是一个4x4的小键盘,也是用模拟软件仿真的。

#include <reg51.h>

//p1.0~p1.3用作输出,P1.4~ P1.7用做输入,接上拉电阻;

//列号码:       P1.4 P1.5 P1.6  P1.7

//行号码P1.0:    '3'  '2'  '1'   '0'

//行号码P1.1:  '7'  '6'  '5'  '4'

//行号码P1.2:  'B'  'A'  '9'  '8'

//行号码P1.3:  'F'  'E'  'D'  'C'

code keyboard[4][4]=\

{  {'3','2','1','0'},\

   {'7','6','5','4'},\

   {'B','A','9','8'},\

   {'F','E','D','C'}

};

//函数功能:延时400us@12MHz晶振;

void delay_ms()

{ unsigned char i;

  for(i=200;i>0;i--)

    {}

}

//p1.0~p1.3用作输出,P1.4~ P1.7用做输入,接上拉电阻;

//列号码:       P1.4 P1.5 P1.6  P1.7

//行号码P1.0:    3     2    1     0

//行号码P1.1:    7   6    5   4

//行号码P1.2:    11   10 9   8

//行号码P1.3:    15   14 13   12

//函数功能:从键盘读取一个值,便返回该值,若没有读到则返回0;

unsigned char scan_keyboard()

{ unsigned char col,row,key_value;

  key_value=0;

  P1=0xf0; //先将P1口的低4位输出0;

  if( (P1&0xf0)!=0xf0 ) //若读P1口的值不为0xf0,则表示有键被按下;

    { delay_ms();       //延时,消抖;

  if( (P1&0xf0)!=0xf0 )  //若读P1口的值不为0xf0,则表示有键被按下;

     { row=0xfe;         

   while( (row&0x10)!=0 )

//当row到达0xef时,即扫描完4行,没有发现有键按下,可能是键盘误动作;

      { P1=row;

//P1口输出:0xfe(选择第1行,P1.0=0),0xfd

//(选择第2行P1.1=0),0xfb(选择第3行P1.2=0),0xf7(选择第4行P1.3=0);

    if( (P1&0xf0)!=0xf0 )    //若读P1口的值不为0xf0,则表示有键被按下;

   { col=(P1&0xf0)|0x0f;   

//将P1口高4位的值保留,将低4位置1,保存到col中;

                     //为了查表,下面对row和col进行解码;

 if(row==0xfe) row=0;

 else if(row==0xfd) row=1;

 else if(row==0xfb) row=2;

 else if(row==0xf7) row=3;

 else row=4;

 if(col==0xef) col=0;

 else if(col==0xdf) col=1;

 else if(col==0xbf) col=2;

 else if(col==0x7f) col=3;

 else col=4;

 if( (row<4)&&(col<4) )

   { key_value=keyboard[row][col];

//查表,将读到的ASCii码值保存到key_value中;

     break; //退出while循环;

   }

   }  

else row=(row<<1)|0x01;

//将row的值左移1位,同时将最低位补1,从0xfe>0xfd>0xfb>0xf7>0xef进行改变

  }

 }

}

  return(key_value); //返回读到的键盘值,没有读到,则返回0;

}

void main(void)

{

  unsigned char key_value1;

  for(;;)

     {

key_value1= scan_keyboard(); //从键盘读取一个值,便返回该值,若没有读到则返回0;

   delay_ms();  //延时400us@12MHz晶振;

 }

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/37841.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏

前言 今天大姚给大家分享一款由C#语言编写的仅有8KB大小的简易贪吃蛇开源游戏&#xff1a;SeeSharpSnake。 项目特点 该仓库中的项目文件和脚本可以用多种不同的配置构建相同的游戏&#xff0c;每个配置生成的输出大小也不同。 项目源码运行 F5 运行 SeeSharpSnake项目&…

【Android面试八股文】在项目开发过程中,你在什么时候会考虑到使用Service?如何拥有service的进程具有较高的优先级?

文章目录 一、在项目开发过程中,你在什么时候会考虑到使用Service?二、在项目开发过程中,如何拥有service的进程具有较高的优先级?方法一:使用前台服务(Foreground Service)方法二:提高进程优先级(不推荐)注意事项补充一、在项目开发过程中,你在什么时候会考虑到使用…

FFmpeg 关于AV1编码指导文档介绍

介绍 本篇博客主要介绍FFMpeg中关于AV1编码支持说明,主要根据官方wiki说明进行总结。官方wiki地址:AV1AV1是一种由Alliance for Open Media (AOMedia)开发的开源且免版税的视频编解码器,它在压缩效率上比VP9高出约30%,比H.264高出约50%。目前,FFmpeg支持三种AV1编码器:li…

E4A视频APP源码电视盒子Coolpoint酷点电视4.5版后端苹果cms

电视盒子酷点TV版4.5影视APP源码后端对接苹果CMS&#xff0c;此版带会员功能,对接的是 如意验证1.71版苹果cms后端APP 电视TV4.5版,会员功能带注册邀请,绑定邮箱,邮箱找回密码,修改新密码,卡密充值,签到,积分兑换会员&#xff1b; 自带10个解析线路,有电视直播功能,首页滚动公…

Java教程之IO模式精讲,NIO+BIO

第一章 BIO、NIO、AIO介绍 背景 在java的软件设计开发中&#xff0c;通信架构是不可避免的&#xff0c;我们在进行不同系统或者不同进程之间的数据交互&#xff0c;或 者在高并发下的通信场景下都需要用到网络通信相关的技术&#xff0c;对于一些经验丰富的程序员来说&#x…

第11章 规划过程组(11.5创建WBS)

第11章 规划过程组&#xff08;一&#xff09;11.5创建WBS&#xff0c;在第三版教材第380~383页&#xff1b; 文字图片音频方式 视频22 第一个知识点&#xff1a;主要输入 1、项目管理计划 范围管理计划 定义了如何根据项目范围说明书创建WBS2、项目文件 项目范围说明…

十六进制计数器

目录 描述 输入描述&#xff1a; 输出描述&#xff1a; 参考代码 描述 请用Verilog设计十六进制递增计数器电路&#xff0c;每个时钟周期递增1。 电路的接口如下图所示。Q[3:0]中&#xff0c;Q[3]是高位。 接口电路图如下&#xff1a; 输入描述&#xff1a; input …

操作系统期末复习考题三(不挂科系列)

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、前言&#x1f680;&#x1f680;&#x1f680;二、正文☀️☀️☀️三、总结&#x1f353;&#x1f353;&#x1f353; 一、前言&#x1f680;&#x1f680;&am…

生有热爱:成为一束光

坚持每天写作&#xff0c;转眼已过两周。这两周除了每天1&#xff5e;2篇文章的输出外&#xff0c;还看完了《生有热爱》这本书。这应该是看纸质书以来&#xff0c;第一次精确时间点完成一本书的阅读&#xff0c;成就感满满。这本书主要是以篇章的形式&#xff0c;讲述了一个又…

java基于ssm+jsp 房屋租赁系统

1 管理员登录 管理员输入个人的用户名、密码登录系统&#xff0c;这时候系统的数据库就会在进行查找相关的信息&#xff0c;如果我们输入的用户名、密码不正确&#xff0c;数据库就会提示出错误的信息提示&#xff0c;同时会提示管理员重新输入自己的用户名、密码&#xff0c;…

了解WPF控件:OpenFileDialog常用属性与用法(十六)

掌握WPF控件&#xff1a;熟练OpenFileDialog常用属性&#xff08;十六&#xff09; OpenFileDialog控件在WPF中用于需要用户指定文件路径&#xff0c;为用户提供了一个直观且易用的界面来浏览和选择本地文件系统中的文件。例如&#xff0c;当用户需要打开一个已存在的文本文件…

C++自定义智能指针

template <class T> class counted_ptr;// 智能指针引用计数类 template <class T> class Ref_Ptr {friend class counted_ptr<T>; private:T* m_pTtr; // 实际的指针size_t counted_ptr; // 引用计数Ref_Ptr(T* p);virtual ~Ref_Ptr(); };template <clas…

使用tar命令解压文件的教程

使用tar命令解压文件的教程 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01; 在Linux和Unix系统中&#xff0c;tar命令是一个常用的压缩和解压工具&#xff0c;…

【Arduino】实验使用ESP32控制可编程继电器制作跑马灯(图文)

今天小飞鱼实验使用ESP控制继电器&#xff0c;为了更好的掌握继电器的使用方法这里实验做了一个跑马灯的效果。 这里用到的可编程继电器&#xff0c;起始原理并不复杂&#xff0c;同样需要ESP32控制针脚输出高电平或低电平给到继电器&#xff0c;继电器使用这个信号控制一个电…

如何焊铜管 量测射频前端模块

先说结论 要做Port Extension待测物要上电 且根据逻辑表给Enable pin上电网分输入功率 不要太大 -20dBm即可铜管的接地 要足够 以及足够近铜管与待测物之间 必要时 隔一颗电容不要将匹配元件 也包含在量测范围讯号针不要直接焊在焊盘上 首先 铜管要做Port…

深度分析 Apache Flink 窗口机制

什么是 Flink 窗口&#xff1f; Apache Flink 是一个用于处理实时流数据的开源框架&#xff0c;其核心功能之一是窗口&#xff08;Window&#xff09;机制。窗口是 Flink 在处理流数据时用于划分数据流的逻辑概念&#xff0c;它将无限的流数据切割成有限的、可管理的部分&…

二分查找:C++ 库函数 upper_bound、lower_bound 和 binary_search

二分查找是一种在有序数组中查找特定元素的高效算法。在二分查找中&#xff0c;upper_bound、lower_bound 和 binary_search 是三个常用的操作&#xff0c;C标准库也提供了原生 API&#xff0c;它们都利用了二分查找&#xff0c;但用于解决略微不同的问题。 介绍 binary_sear…

LCT——Link Cut Tree及其应用

我们知道&#xff0c;想要维护树上的一段区间&#xff0c;我们可以采用重链剖分来将其划分 但是&#xff0c;树链剖分只能够维护静态&#xff08;树的形态不发生变化&#xff09;的树&#xff0c;倘若我们需要动态对树的形态进行修改&#xff0c;比如将某个结点换为树的根、树…

50-3 内网信息收集 - 域环境搭建

搭建准备: 在搭建准备阶段,我们需要准备三台 Windows 虚拟机:Windows Server 2012、Windows 7 和 Windows Server 2008。接下来,我们将配置 Windows Server 2012 作为域控制器,而 Windows 7 和 Windows Server 2008 将作为成员机加入域。建议保持这三台虚拟机的内存不超过…

51单片机第15步_串口多机通讯使用CRC8校验

本章重点介绍串口多机通讯使用CRC8校验。 数据格式:"$123xxxx*crc8\r\n"; 如:"$1234567890ABCDEF*06\r\n" 如:"$1231234567890*31\r\n" crc8是CRC校验值,为十六进制的ASCII码,不包含$和校验值前面的那个* #include <REG51.h> //包含…