哪位高手帮我解决下4*8的键盘扫描问题,谢谢啦!

2019-07-16 06:57发布

单片机中我高置的是P2.0~P2.3为四列,P1.0~P1.7为八行。
刚开始学单片机,现写这个程序卡住了,请求高手帮帮忙,不胜感激,谢谢!
请帮写一个4*8键盘扫描程序 C程序。谢谢
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
2条回答
assingle
1楼-- · 2019-07-16 07:24
只有个4*4的供参考下。

矩阵式键盘扫描c程序.doc 下载积分: 积分 -1 分

68 KB, 下载次数: 5, 下载积分: 积分 -1 分

ericjenny
2楼-- · 2019-07-16 08:00
assingle 发表于 2011-6-23 14:47
只有个4*4的供参考下。

你好,谢谢你给我提供的资料,我也有同一个端口的4*4键盘扫描我会写,但是不同端口的老出错,现有一段程序,麻烦您帮我看下谢谢。以下是我的程序 :以P2.0~P2.3为列,P1.0~P1.3为先做4*4的扫描,但数码管只显示列的数。

#include<reg51.h>
#define uchar unsigned char
#define uint unsigned int
uchar code DSY_CODE[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71,0x00};
uchar Pre_keyno=32;keyno=32;

void delay(uint x)
{
uint y;
while(x--)
for(y=0;y<120;y++);
}

void keys_Scan()
{
uchar tmp;
P2=0x0f;
delay(5);
tmp=P2^0x0f;
switch(tmp)
{
  case 1:keyno=0;break;
  case 2:keyno=1;break;
  case 4:keyno=2;break;
  case 8:keyno=3;break;
  //default:keyno=32;
  }
P1=0xf0;
delay(5);
tmp=P1>>4^0x0f;
switch(tmp)
{
case 1:keyno=keyno+0;break;
case 2:keyno=keyno+4;break;
case 4:keyno=keyno+8;break;
case 8:keyno=keyno+12;
}
}

void main()
{
P3=0x38;
P0=0x00;
  while(1)
{
  if(P2^0x0f!=0x0f)keys_Scan();
  if(Pre_keyno!=keyno)
  {
   P0=DSY_CODE[keyno];
   Pre_keyno=keyno;
   }
   delay(100);
   }
  }



一周热门 更多>