找回密码
 立即注册

QQ登录

只需一步,快速开始

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

键盘设计行列扫描

[复制链接]
跳转到指定楼层
楼主
ID:360512 发表于 2018-6-27 19:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
//********"键盘及其显示"**************
//"当按下一个键的时候显示按下键的键值,其余时间显示字母“P”"
// "P1口作为数码管的位选,P0口作为数码管的段选"
//"P2口是键盘连接口,低4位为列,高4位为行"
#include"reg52.h"
//"下面为数码管显示码"
unsigned char code table[19]={0x3f,0x06,0x5b,0x4f,0x66,//0~4
                              0x6d,0x7d,0x07,0x7f,0x6f,//5~9
         0x77,0x7c,0x39,0x5e,0x79,//A~E
         0x71,0x73,0xc3,0x00};//F.p.=..
unsigned char key_scan(void);
//*************"键盘显示"********************
//"函数名称:void key_display(void)"
//"函数功能:显示所按下键的键值"
//"参数说明:无  P0口作为段码,  P1作为位码"
//******************************************
void key_display(void)
{
unsigned char key_value_1=16;
P1=0x00;//"选通所有的数码管"
key_value_1=key_scan();//"返回键值"
P0=table[key_value_1];//"输出显示码"
}
//***********"延时"*********************
//"函数名称:void delay(unsigned char delay_time)"
//"函数功能:延时"
//"参数说明:有 delay_time"
//*************************************
void delay(unsigned int delay_time)
{
  while(delay_time){delay_time--;}
       //"延时8+6*delay_time  us"
}
//***********"按键扫描"*******************
//"函数名称:unsigned char key_scan(void)"
//"函数功能:用行列扫描方式进行键盘扫描,P2口高四位作为行,低四位作为列"
//"参数说明:无"
//***************************************
unsigned char key_scan(void)
{
  unsigned char key_code;//"键盘行编码"
  unsigned char key_value;//"键值"
  unsigned char row=0;//"行值"
  unsigned char line=0;//"列值"
  unsigned char temp=0xfe;//"列扫描码"
  unsigned char i;
  P2=0xf0;//"P2口赋初值,准备进行行,列扫描"
  if((P2&0xf0)!=0xf0)//"表示有键按下"
  {
       delay(2000);//"延时10ms消抖"
               if((P2&0xf0)!=0xf0)//"表明确实有键按下,进行键盘扫描"
     {
          for(i=0;i<4;i++)//"列扫描"
       {
      P2=temp;//"送列扫描码"
      if((P2&0xf0)!=0xf0)
         {
        key_code=P2&0xf0;//"得出行编码"
     row=i;//"计算出列值"
     break;
      }
    temp=(temp<<1)|0x01;//"进行下一列扫描"
    }
    switch(key_code)//"根据行编码得出行值"
       {
      case 0xe0: line=0;break;
      case 0xd0: line=1;break;
      case 0xb0: line=2;break;
      case 0x70: line=3;break;
      default:  ;
    }
   key_value=row*4+line;//"根据行,列值计算出键值"
        
  }
  return(key_value);
        while((P2&0xf0)!=0xf0){key_display();}//"等待按键释放"
  }
  
}

//**************"主函数"***********************
//"函数名称:void main(void)"
//"函数功能:"
//"参数说明:无"
//********************************************
void main(void)
{
while(1)
  {
   key_display();
  }
}
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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