4×4矩阵键盘数码管显示按键值程序

发布时间:2016-7-25 10:56    发布者:designapp
关键词: 数码管 , 矩阵键盘
  4×4矩阵键盘数码管显示按键值程序
  //电路说明如下。
  //单片机:使用51系列兼容的即可;
  //4×4矩阵键盘:接在P1口;
  //两位数码显示器: P0口输出七段码,P2口输出位选码。
  //==============================================================
  //C语言程序如下。
  /*************************************************************
  * 文件名: KEY_LED.c
  * 功能 : 对4×4矩阵键盘进行输出,在数码管后两位显示按键值。
  **************************************************************/
  #include
  #include
  #define uint unsigned int
  #define uchar unsigned char
  //uchar code table[10] = {0x03, 0x9f, 0x25, 0x0d, 0x99, 0x49, 0x41, 0x1f, 0x01, 0x09};
  uchar code table[10] = {0xC0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90};
  /**************************************************************
  * 名称 : Delay_1ms()
  * 功能 : 延时子程序,延时时间为 1ms * x
  * 输入 : x (延时一毫秒的个数)
  * 输出 : 无
  ***************************************************************/
  void Delay_1ms(uint x)
  {
  uint i;
  uchar j;
  for(i = 0; i < x; i++) for(j = 0; j <= 148; j++);
  }
  /**************************************************************
  * 名称: Keyscan()
  * 功能: P1外接4×4按键, 按照扫描法读出键值
  * 输出: 按键值0~15/如无键按下, 返回16
  ***************************************************************/
  uchar Keyscan(void)
  {
  uchar i, j, temp, Buffer[4] = {0xef, 0xdf, 0xbf, 0x7f};
  for(j = 0; j < 4; j++) { //循环四次
  P1 = Buffer[j]; //在P1高四位分别输出一个低电平
  temp = 0x01; //计划先判断P1.0位
  for(i = 0; i < 4; i++) { //循环四次
  if(!(P1 & temp)) //从P1低四位,截取1位
  return (i + j * 4); //返回取得的按键值
  temp <<= 1; //判断的位,左移一位
  } }
  return 16; //判断结束,没有键按下,返回16
  } //呵呵,实质性的语句不过8行,就是这么简练!
  /**************************************************************
  * 名称: Display(uchar k)
  * 功能: 将参数分成十位、个位分别显示
  * 输入: k (键盘数值)
  * 输出: P0口输出七段码,P2口输出位选码
  ***************************************************************/
  void Display(uchar k)
  {
  P2 = 0; //消隐
  P0 = table[k / 10];
  P2 = 0x02; Delay_1ms(5); //显示5ms十位
  P2 = 0; //消隐
  P0 = table[k % 10];
  P2 = 0x01; Delay_1ms(5); //显示5ms个位
  }
  /**************************************************************
  * 名称 : Main()
  * 功能 : 主函数
  ***************************************************************/
  void Main(void)
  {
  uchar Key_Value = 16, Key_Temp1, Key_Temp2; //两次读出的键值
  while(1) {
  //---------以下读入按键、消抖、等待按键释放
  P1 = 0xff;
  Key_Temp1 = Keyscan(); //先读入按键
  if(Key_Temp1 != 16) { //如果有键按下
  //Delay_1ms(10); //延时一下
  Display(Key_Value); //可用显示代替延时
  Key_Temp2 = Keyscan(); //再读一次按键
  if (Key_Temp1 == Key_Temp2) {//必须是两次相等
  Key_Value = Key_Temp1; //才保存下来,这就是消除抖动
  while(Keyscan() < 16) //等待按键释放
  Display(Key_Value); //等待期间显示键值
  //---------以下是对按键的处理
  Display(Key_Value); //显示键值
  } }
  Display(Key_Value); //没有按键按下,也显示键值
  }
  }
  //用PROTEUS仿真运行时的屏幕截图如下:

                                
                                                               
                                
               
本文地址:https://www.eechina.com/thread-171099-1-1.html     【打印本页】

本站部分文章为转载或网友发布,目的在于传递和分享信息,并不代表本网赞同其观点和对其真实性负责;文章版权归原作者及原出处所有,如涉及作品内容、版权和其它问题,我们将根据著作权人的要求,第一时间更正或删除。
您需要登录后才可以发表评论 登录 | 立即注册

厂商推荐

关于我们  -  服务条款  -  使用指南  -  站点地图  -  友情链接  -  联系我们
电子工程网 © 版权所有   京ICP备16069177号 | 京公网安备11010502021702
快速回复 返回顶部 返回列表