打印

分享2个独特矩阵键盘写法,网上收集的

[复制链接]
1846|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tkin1992|  楼主 | 2011-4-22 23:53 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
////////////////////////////////////////////////////
#include<reg51.H>
unsigned char k;
char code tab[4][4]={{0x3f,0x66,0x7f,0x39},
                                {0x06,0x6d,0x6f,0x5e},
                                {0x5b,0x7d,0x77,0x79},
                                 {0x4f,0x07,0x7c,0x71}};      
void delay()
{
unsigned char i,j;
for(i=0;i<100;i++)
  for(j=0;j<100;j++);
}
char kbscan()         
{
  unsigned char hang,lie;
if(P1!=0x0f)
{
  delay();
  if(P1!=0x0f)
  {
  switch(P1&0x0f)
    {
    case 0x0e:hang=0;break;
    case 0x0d:hang=1;break;
    case 0x0b:hang=2;break;
    case 0x07:hang=3;break;
    }
  P1=0xf0;
  switch(P1&0xf0)
    {
    case 0xe0:lie=0;break;
    case 0xd0:lie=1;break;
    case 0xb0:lie=2;break;
    case 0x70:lie=3;break;
    }
  P1=0x0f;
  while(P1!=0x0f);
  k=tab[hang][lie];
  }
}
else
  k=0;
return (k);
}


void main()
{
P2=0xfe;
while(1)
{
kbscan() ;
if(k!=0)
P0=k;
}
}


////////////////////////////////////////////////////////
#ifndef __4_4keyborad_H__
#define __4_4keyborad_H__

#define keyport P1


uchar key;

#define enter 20
#define set 21
#define right 22
#define left 23
#define up 24
#define down 25
#define null 26
#define Null 27
void keyscan()
{
unsigned char temp,hang,lie; //hang 为keyport的高4位,列为keyport的低4 位
unsigned char jianz;
bit scanover=0;
if((keyport&0x0f)!=0x0f)
{
delayms(10);
if((keyport&0x0f)!=0x0f)
{
while(scanover==0)
{
temp=keyport&0x0f;//屏蔽列
switch(temp)
{
case 0x0e: hang=0;break;
case 0x0d: hang=1;break;
case 0x0b: hang=2;break;
case 0x07: hang=3;break;
default: break;
}
keyport=0xf0;
temp=keyport&0xf0;//屏蔽行
switch(temp)
{
case 0xe0: lie=0;break;
case 0xd0: lie=1;break;
case 0xb0: lie=2;break;
case 0x70: lie=3;break;
default: break;
}
scanover=1;
}
jianz=hang*4+lie;

switch(jianz)
{
case 0: key=1; break;
case 1: key=2; break;
case 2: key=3; break;
case 3: key=enter;break;
case 4: key=4; break;
case 5: key=5; break;
case 6: key=6; break;
case 7: key=set; break;
case 8: key=7; break;
case 9: key=8; break;
case 10: key=9; break;
case 11: key=up; break;
case 12: key=left;break;
case 13: key=0; break;
case 14: key=right; break;
case 15: key=down; break;
}

}

}
while(keyport!=0x0f)
{
keyport=0x0f;
}
delayms(10);
keyport=0x0f;
}
#endif


相关帖子

沙发
abin0415| | 2011-4-24 09:16 | 只看该作者
沙发

使用特权

评论回复
板凳
月亮| | 2011-4-24 10:14 | 只看该作者
这种键盘程序还是不用为妙,延时再判断占时间;

使用特权

评论回复
地板
流行音乐| | 2011-4-24 13:52 | 只看该作者
自己花时间设计一个程序都比这个程序好很多。一些烂程序居然还这么流行,汗!

使用特权

评论回复
5
王利110| | 2011-4-24 21:36 | 只看该作者
void  main()
{
while(1)
  {
  DET=0x0f;
  while(DET==0x0f);
  key1=DET&0x0f;
  DET=0xf0;
  while(DET==0xf0);
  key2=DET&0xf0;
  key2=key1|key2;
    switch(key2)
  {
  case 0x7e: key1=smg[0];break;// 0
  case 0x7d:key1=smg[1];break;//1
  case 0x7b:key1=smg[2];break;//2
  case 0x77: key1=smg[3];break;//3

  case 0xbe: key1=smg[4];break;//4
  case 0xbd: key1=smg[5];break;//5
  case 0xbb: key1=smg[6];break;//6
  case 0xb7: key1=smg[7];break;//7

  case 0xde: key1=smg[8];break;//8
  case 0xdd: key1=smg[9];break;//9
  case 0xdb: key1=smg[10];break;//a
  case 0xd7: key1=smg[11];break;//b

  case 0xee: key1=smg[12];break;//c
  case 0xed: key1=smg[13];break;//d
  case 0xeb: key1=smg[14];break;//e
  case 0xe7: key1=smg[15];break;//f
  default:   key1=smg[16];break;
}
P1=key1;
}
}
看看 俺的、代码.......

使用特权

评论回复
6
ayb_ice| | 2011-4-25 11:40 | 只看该作者
没有看到哪里独特
而且基本是个垃圾程序

使用特权

评论回复
7
yx331447791| | 2011-4-25 15:25 | 只看该作者
我觉得SWTICH都可以不用,直接用FOR查找就得了

使用特权

评论回复
8
lixupengIC| | 2011-4-25 18:09 | 只看该作者
:)收下!!!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

0

主题

15

帖子

0

粉丝