矩阵键盘的检测

矩阵键盘的检测
//主要错误:1.少了delay(10)  2.少了break,
//   3.位选,段选位置错误
//   4.while(temp!=0xf0) 写成 while(temp)
//调试过程:将key提到外面
// 功能: 显示0~16 的平方
#include<reg52.h>
#define uchar unsigned char
#define uint unsigned int
sbit dula=P2^6;
sbit wela=P2^7;
sbit led=P1^5;
uchar code table[]={
0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71};
void delay(int x)
{
 uint i,j;
 for(i=0;i<110;i++)
  for(j=0;j<x;j++);
}
int x1,x2,x3,x4,x5,x6,x7,num ;
void display1()
{
 dula=1;
 P0=table[x1];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfe;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x2];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfd;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x3];
 dula=0;
 P0=0xf0;
 wela=1;
 P0=0xfb;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x4];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xf7;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x5];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xef;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x6];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xdf;
 wela=0;
 delay(5);
}
void display2()
{
 dula=1;
 P0=table[x2];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfe;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x3];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfd;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x4];
 dula=0;
 P0=0xf0;
 wela=1;
 P0=0xfb;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x5];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xf7;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x6];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xef;
 wela=0;
 delay(5);
}
void display3()
{
 dula=1;
 P0=table[x3];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfe;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x4];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfd;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x5];
 dula=0;
 P0=0xf0;
 wela=1;
 P0=0xfb;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x6];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xf7;
 wela=0;
 delay(5);
}
void display4()
{
 dula=1;
 P0=table[x4];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfe;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x5];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfd;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x6];
 dula=0;
 P0=0xf0;
 wela=1;
 P0=0xfb;
 wela=0;
 delay(5);
}
void display5()
{
 dula=1;
 P0=table[x5];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfe;
 wela=0;
 delay(5);
 dula=1;
 P0=table[x6];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfd;
 wela=0;
 delay(5);
}
void display6()
{
 dula=1;
 P0=table[x6];
 dula=0;
 P0=0xff;
 wela=1;
 P0=0xfe;
 wela=0;
 delay(5);
}
void display(uint key)
{   
 num=key*key;
 x6=num%10; ///个
 x5=num/10%10; ///十
 x4=num/100%10; ///百
 x3=num/1000%10;//千
 x2=num/10000%10;///万
 x1=num/100000;///亿
 if(x1) display1();
 else if(x2) display2();
 else if(x3) display3();
 else if(x4) display4();
 else if(x5) display5();
 else display6();
}
int key; 
uint matrixkeyscan()
{
 uchar temp; 
 P3=0xfe;
 temp=P3;
 temp=temp&0xf0;
 if(temp!=0xf0)
 {
  delay(10);      
  temp=P3;
  temp=temp&0xf0;
  if(temp!=0xf0)
  {
   temp=P3;
   switch(temp)
   {
    case 0xee:
     key=1;
     break;
    case 0xde:
     key=2;
     break;
    case 0xbe:
     key=3;
     break;
    case 0x7e:
     key=4;
     break;
   }
   while(temp!=0xf0)
   {
    temp=P3;
    temp=temp&0xf0;
   }
   return key;
  }
 }
 P3=0xfd;
 temp=P3;
 temp=temp&0xf0;
 if(temp!=0xf0)
 {
  delay(10);
  temp=P3;
  temp=temp&0xf0;
  if(temp!=0xf0)
  {
   temp=P3;
   switch(temp)
   {
    case 0xed:
     key=5;
     break;
    case 0xdd:
     key=6;
     break;
    case 0xbd:
     key=7;
     break;
    case 0x7d:
     key=8;
     break;
   }
   while(temp!=0xf0)
   {
    temp=P3;
    temp=temp&0xf0;
   }
   return key;
  }
 }
 P3=0xfb;
 temp=P3;
 temp=temp&0xf0;
 if(temp!=0xf0)
 {
  delay(10);
  temp=P3;
  temp=temp&0xf0;
  if(temp!=0xf0)
  {
   temp=P3;
   switch(temp)
   {
    case 0xeb:
     key=9;
     break;
    case 0xdb:
     key=10;
     break;
    case 0xbb:
     key=11;
     break;
    case 0x7b:
     key=12;
     break;
   }
   while(temp!=0xf0)
   {
    temp=P3;
    temp=temp&0xf0;
   }
  return key+1;
  }
 }
 P3=0xf7;
 temp=P3;
 temp=temp&0xf0;
 if(temp!=0xf0)
 {
  delay(10);
  temp=P3;
  temp=temp&0xf0;
  if(temp!=0xf0)
  {
   temp=P3;
   switch(temp)
   {
    case 0xe7:
     key=13;
     break;
    case 0xd7:    
     key=14;
     break;
    case 0xb7:
     key=15;
     break;
    case 0x77:
     key=16;
     break;
   } 
   while(temp!=0xf0)
   {
    temp=P3;
    temp=temp&0xf0;
   }
  return key;
  }
 }
 return key;
}
uchar num1;
void main()
{
 TMOD=0x01;
 TH0=(65536-45872)/256;
 TL0=(65536-45872)%256;
 EA=1;
 ET0=1;
 TR0=1;
 while(1) display(matrixkeyscan());
}
void T0_time()interrupt 1
{
 TH0=(65536-45872)/256;
 TL0=(65536-45872)%256;
 num1++;
 if(num1==4)
 {
  num1=0;
  led=~led;
 }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值