赞助论坛
  • 5330阅读
  • 0回复

学习单片机之---C51矩阵键盘 [复制链接]

楼层直达
jswr  
发帖
339
精华
1
金币
264
威望
8
贡献
7
好评
15
注册
2008-06-30
楼主    jswr 发表于: 2008-08-05 14:46:08 
C51矩阵键盘
在一个4乘4的矩阵键盘中,本人的基本识别程序。。(P1口低四位对应键盘行线,高四位对应键盘列线,P2口为6个动态LED数码管)

#i nclude<AT89X51.h>
#i nclude<intrins.h>
void delay(unsigned int i);
const unsigned char leddigit[12]={0x28,0x7e,0xa2,0x62,0x74,0x61,0x21,0x7a,
                0x20,0x60,0xff,0xdf}; /* 字符 0-9 编码,0xff为关显示,0xdf为小数点 */
#define disp(a,b) P2=~(1<<(a));P0=leddigit[b]
#define uchar unsigned char
#define uint unsigned int
void key()
{
uchar k;
P1 = 0xf0;//低位置○,准备查询按键
k = P1;//取得当前P1口的状态
if(k != 0xf0)
{//如果有变化则表示有键按下
k = 0xfe;
do{//循环扫描每一行
P1 = k;
if(k != P1)
{
  switch(P1)
  {
  //第一行
  case 0x77:{disp(1,1);break;}
  case 0xb7:{disp(1,2);break;}
  case 0xd7:{disp(1,3);break;}
  case 0xe7:{disp(1,4);break;}
  //第二行
  case 0x7b:{disp(1,5);break;}
  case 0xbb:{disp(1,6);break;}
  case 0xdb:{disp(1,7);break;}
  case 0xeb:{disp(1,8);break;}
  //第三行
  case 0x7d:{disp(1,9);break;}
  case 0xbd:{disp(1,10);break;}
  case 0xdd:{disp(1,11);break;}
  case 0xed:{disp(4,11);break;}
  //第四行
  case 0x7e:{disp(2,1);break;}
  case 0xbe:{disp(2,2);break;}
  case 0xde:{disp(3,3);break;}
  case 0xee:{disp(4,4);break;}

  }
}
k = _crol_(k,1);//移位,进入下一行扫描
}while(k !=0xef);//超过范围退出
}

}  
main()
{
while(1)
{
key();
}
}