×

《深入浅出玩转51单片机》配套例程(60例)

消耗积分:1 | 格式:zip | 大小:28710KB | 2017-08-01

叶荣

分享资料个

深入浅出玩转51单片机书籍实例

  // 简单描述 : 本文件是行列扫描法实现矩阵按键扫描程序

  /* ***************************************************** */

  #include 《reg52.h》

  /* ***************************************************** */

  // 宏定义

  /* ***************************************************** */

  #define uInt16 unsigned int

  #define uChar8 unsigned char

  #define DATA P0 //数据口

  #define KEYPORT P3 //键盘接入端口

  /* ***************************************************** */

  // 位定义

  /* ***************************************************** */

  sbit SEG_SELECT = P1^7; //段选控制端

  sbit BIT_SELECT = P1^6; //位选控制端

  /* ***************************************************** */

  // 数组定义

  /* ***************************************************** */

  uChar8 code SEG_Tab[] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,

  0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};//段选显示表格

  /* ***************************************************** */

  // 全局变量定义

  /* ***************************************************** */

  uChar8 g_ucKeyNum = 16; //键值

  /* ***************************************************** */

  // 函数名称:MelayMS()

  // 函数功能:毫秒延时

  // 入口参数:延时毫秒数(ValMS)

  // 出口参数:无

  /* ***************************************************** */

  void DelayMS(uInt16 ValMS)

  {

  uInt16 uiVal,ujVal;

  for(uiVal = 0; uiVal 《 ValMS; uiVal++)

  for(ujVal = 0; ujVal 《 121; ujVal++);

  }

  /* ***************************************************** */

  // 函数名称:ScanKey()

  // 函数功能:矩阵按键扫描

  // 入口参数:无

  // 出口参数:无

  /* ***************************************************** */

  void ScanKey(void)

  {

  uChar8 ucTemp;

  KEYPORT = 0xfe; //检测第一行

  ucTemp = KEYPORT; //读取键盘端口数值

  if(ucTemp != 0xfe) //若是不等于0xF0表示有按键按下

  {

  DelayMS(5); //去抖

  ucTemp = KEYPORT; //读端口值

  if(ucTemp != 0xfe) //再次判断

  {

  ucTemp = KEYPORT; //取键值

  switch(ucTemp) //判断键值对应键码

  {

  case 0xee:g_ucKeyNum = 0;break;

  case 0xde:g_ucKeyNum = 1;break;

  case 0xbe:g_ucKeyNum = 2;break;

  case 0x7e:g_ucKeyNum = 3;break;

  }

  while(KEYPORT != 0xfe); //按键释放检测

  }

  }

  KEYPORT = 0xfd;

  ucTemp = KEYPORT;

  if(ucTemp != 0xfd)

  {

  DelayMS(5);

  ucTemp = KEYPORT;

  if(ucTemp != 0xfd)

  {

  ucTemp = KEYPORT;

  switch(ucTemp)

  {

  case 0xed:g_ucKeyNum = 4;break;

  case 0xdd:g_ucKeyNum = 5;break;

  case 0xbd:g_ucKeyNum = 6;break;

  case 0x7d:g_ucKeyNum = 7;break;

  }

  while(KEYPORT != 0xfd);

  }

  }

  KEYPORT = 0xfb;

  ucTemp = KEYPORT;

  if(ucTemp != 0xfb)

  {

  DelayMS(5);

  ucTemp = KEYPORT;

  if(ucTemp != 0xfb)

  {

  ucTemp = KEYPORT;

  switch(ucTemp)

  {

  case 0xeb:g_ucKeyNum = 8;break;

  case 0xdb:g_ucKeyNum = 9;break;

  case 0xbb:g_ucKeyNum = 10;break;

  case 0x7b:g_ucKeyNum = 11;break;

  }

  while(KEYPORT != 0xfb);

  }

  }

  KEYPORT = 0xf7;

  ucTemp = KEYPORT;

  if(ucTemp != 0xf7)

  {

  DelayMS(5);

  ucTemp = KEYPORT;

  if(ucTemp != 0xf7)

  {

  ucTemp = KEYPORT;

  switch(ucTemp)

  {

  case 0xe7:g_ucKeyNum = 12;break;

  case 0xd7:g_ucKeyNum = 13;break;

  case 0xb7:g_ucKeyNum = 14;break;

  case 0x77:g_ucKeyNum = 15;break;

  }

  while(KEYPORT != 0xf7);
《深入浅出玩转51单片机》配套例程(60例)
 

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(6)
发评论
白叁水 2019-06-28
0 回复 举报
感谢分享,回顾起来很快 收起回复
吴无吴悟 2019-06-24
0 回复 举报
感谢楼主分享,刚好在学习单片机,编程是一个难点,资料不错。 收起回复
全部评论

下载排行榜

全部6条评论

快来发表一下你的评论吧 !