标题: 4*4矩阵键盘问题,我是新手求大神解答,谢了 [打印本页]

作者: qq550376723    时间: 2014-10-2 18:49
标题: 4*4矩阵键盘问题,我是新手求大神解答,谢了
4*4矩阵键盘写了个程序,仿真后发现按下矩阵按键不显示,后来查资料改了一个地方成功了,却又不知道原来没改的那个程序为什么不行。。
原来的程序如下
#include<reg52.h>
#define p   P3
sbit  DU=P2^6;
sbit  WEI=P2^7;
unsigned char a,b[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
void main()
{ int key;
void display(unsigned char num);
void delay(int ms);
unsigned char temp;
P0=0X00;
  WEI=1;
  WEI=0;
while(1)
{ p=0xfe;
  temp=p|0x0f;
  if(temp!=0xff)
  {  delay(5);
  temp=p|0x0f;
     if(temp!=0xff)
       {   
    switch(temp)
            {
          case 0xef: display(0);break;
          case 0xdf: display(1);break;
          case 0xbf: display(2);break;
          case 0x7f: display(3);break;
             }}
   }
    p=0xfd;
  temp=p|0x0f;
  if(temp!=0xff)
  {  delay(5);
   temp=p|0x0f;
     if(temp!=0xff)
       {   
        switch(temp)
            {
          case 0xef: display(4);break;
          case 0xdf: display(5);break;
          case 0xbf: display(6);break;
          case 0x7f: display(7);break;
             }}
   }
    p=0xfb;
  temp=p|0x0f;
  if(temp!=0xff)
  {  delay(5);
   temp=p|0x0f;
     if(temp!=0xff)
       {   
        switch(temp)
            {
          case 0xef: display(4);break;
          case 0xdf: display(5);break;
          case 0xbf: display(6);break;
          case 0x7f: display(7);break;
             }}
   }
    p=0xf7;
  temp=p|0x0f;
  if(temp!=0xff)
  {  delay(5);
   temp=p|0x0f;
     if(temp!=0xff)
       {  
      switch(temp)
            {
          case 0xef: display(12);break;
          case 0xdf: display(13);break;
          case 0xbf: display(14);break;
          case 0x7f: display(15);break;
             }}
   }


} }
void display(unsigned char num)
{

  P0=b[num];
  DU=1;
  DU=0;
}
void delay(int ms)
{
int i,k;
for(i=112;i>0;i--)
   for(k=ms;k>0;k--);
}

这个仿真不行,我把每一个switch前加了个temp,把switch里面的十六进制都改成相应的数;

改过后如下
#include<reg52.h>
#define p   P3
sbit  DU=P2^6;
sbit  WEI=P2^7;
unsigned char a,b[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,0x00};
void main()
{ int key;
void display(unsigned char num);
void delay(int ms);
unsigned char temp;
P0=0X00;
  WEI=1;
  WEI=0;
while(1)
{ p=0xfe;
  temp=p|0x0f;
  if(temp!=0xff)
  {  delay(5);
  temp=p|0x0f;
     if(temp!=0xff)
       { temp=p;  
    switch(temp)
            {
          case 0xee: display(0);break;
          case 0xde: display(1);break;
          case 0xbe: display(2);break;
          case 0x7e: display(3);break;
             }}
   }
    p=0xfd;
  temp=p|0x0f;
  if(temp!=0xff)
  {  delay(5);
   temp=p|0x0f;
     if(temp!=0xff)
       {  temp=p;
        switch(temp)
            {
          case 0xed: display(4);break;
          case 0xdd: display(5);break;
          case 0xbd: display(6);break;
          case 0x7d: display(7);break;
             }}
   }
    p=0xfb;
  temp=p|0x0f;
  if(temp!=0xff)
  {  delay(5);
   temp=p|0x0f;
     if(temp!=0xff)
       { temp=p;  
        switch(temp)
            {
          case 0xeb: display(4);break;
          case 0xdb: display(5);break;
          case 0xbb: display(6);break;
          case 0x7b: display(7);break;
             }}
   }
    p=0xf7;
  temp=p|0x0f;
  if(temp!=0xff)
  {  delay(5);
   temp=p|0x0f;
     if(temp!=0xff)
       { temp=p;
      switch(temp)
            {
          case 0xe7: display(12);break;
          case 0xd7: display(13);break;
          case 0xb7: display(14);break;
          case 0x77: display(15);break;
             }}
   }


} }
void display(unsigned char num)
{

  P0=b[num];
  DU=1;
  DU=0;
}
void delay(int ms)
{
int i,k;
for(i=112;i>0;i--)
   for(k=ms;k>0;k--);
}
然后仿真通过了。。。。不知道原来的为什么不行。。temp为什么一定=p,直接用temp=p|0x0x去switch不行吗???求指教



作者: T29    时间: 2014-10-3 23:48
因为赋值后没有读入,没有读入检测什么呀,temp=P是读入
作者: mqwu    时间: 2014-10-4 14:37
错误太多,还是给PIC16F877的例子你参考一下吧

#include<pic.h>
__CONFIG(0x3b31);
#define uchar unsigned char
#define uint unsigned int
//#define beep RE0

const uchar table[]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,
                        0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
uchar key, dis_buf;
uchar temp;
/*void port_init()
{
    TRISB=0x0f;
    TRISD=0;
    TRISA=0;
    TRISE0=0;
    RE0=0;
    PORTD=0;
    PORTA=0xff;
}*/
void port_init(void)
{
  OPTION=0x00;
  ADCON1=0x06;
  TRISA=0x00;
  TRISB=0x0f;
  TRISC=0x00;
  TRISD=0x00;

  PORTD=0x00;
  PORTA=0xff;

    TRISE0=0;
    RE0=0;
  
}

void delay(uint ms)
{
  uint m,n;
  for(m=0;m<ms;m++)
   for(n=0;n<100;n++);
}

void beep_sound(uchar num)
{
   uchar i;
   for (i=num; i>0;i--)
    {
       RE0=1;
       delay(20);
       RE0=0;
       delay(20);
    }
}

void matrixkey(void)
{
  uchar temp;
  PORTB=0xef;
  temp=PORTB;
  temp=temp&0x0f;
  if (temp!=0x0f);
   {
     delay(10);
     temp=PORTB;
     temp=temp&0x0f;
     if (temp!=0x0f)
       {
         temp=PORTB;
         switch(temp)
          {
            case 0xee: key=0; break;
            case 0xed: key=1; break;
            case 0xeb: key=2; break;
            case 0xe7: key=3; break;
            default: break;
          }
   
          beep_sound(2);
          dis_buf=table[key];
      
          while(temp!=0x0f)
          {
             temp=PORTB;
             temp=temp&0x0f;
          }
       }
   }

  PORTB=0xdf;
  temp=PORTB;
  temp=temp&0x0f;
  if (temp!=0x0f);
   {
     delay(10);
     temp=PORTB;
     temp=temp&0x0f;
     if (temp!=0x0f)
       {
         temp=PORTB;
         switch(temp)
          {
            case 0xde: key=4; break;
            case 0xdd: key=5; break;
            case 0xdb: key=6; break;
            case 0xd7: key=7; break;
            default:break;
          }
      
          beep_sound(2);
          dis_buf=table[key];
         
          while(temp!=0x0f)
          {
             temp=PORTB;
             temp=temp&0x0f;
          }
       }
   }

PORTB=0xbf;
  temp=PORTB;
  temp=temp&0x0f;
  if (temp!=0x0f);
   {
     delay(10);
     temp=PORTB;
     temp=temp&0x0f;
     if (temp!=0x0f)
       {
         temp=PORTB;
         switch(temp)
          {
            case 0xbe: key=8; break;
            case 0xbd: key=9; break;
            case 0xbb: key=10; break;
            case 0xb7: key=11; break;
          }
      
         beep_sound(2);
          dis_buf=table[key];
         
          while(temp!=0x0f)
          {
             temp=PORTB;
             temp=temp&0x0f;
          }
       }
   }

  PORTB=0x7f;
  temp=PORTB;
  temp=temp&0x0f;
  if (temp!=0x0f);
   {
     delay(10);
     temp=PORTB;
     temp=temp&0x0f;
     if (temp!=0x0f)
       {
         temp=PORTB;
         switch(temp)
          {
            case 0x7e: key=12; break;
            case 0x7d: key=13; break;
            case 0x7b: key=14; break;
            case 0x77: key=15; break;
          }
      
          beep_sound(2);
          dis_buf=table[key];
         
          while(temp!=0x0f)
          {
             temp=PORTB;
             temp=temp&0x0f;
          }
       }
   }
}

void main()
{
    port_init();
    dis_buf=0xbf;
    PORTD=dis_buf;
    while(1)
    {
      matrixkey();
      PORTD=dis_buf;
      delay(2);
    }


}


作者: 804534944    时间: 2014-10-5 13:23
4*4矩阵键盘 那里用写得这么复杂!!! 程序里面也有很多错误!!建议楼主参考一下网上的一些特例吧
作者: mqwu    时间: 2014-10-5 20:41
我这是在板子上运行过的,一点问题都没有, 你说说什么问题?
作者: qq550376723    时间: 2014-10-8 16:20
mqwu 发表于 2014-10-4 14:37
错误太多,还是给PIC16F877的例子你参考一下吧

#include

没问题,编的挺好的、、就是有个地方一直想不通,就是switch检测前为什么必须有temp=PORTB;直接switch检测temp&0x0f为什么不行呢,一直不明白。。
作者: mqwu    时间: 2014-10-8 16:56
也可以,你看这个你就会明白, if ((temp&0x0f)!=0x0f)这样写起来只是多个括号,不是很通俗的格式。
作者: mqwu    时间: 2014-10-8 17:17
如果没有中间变量temp, 那么每次运算和算法都要涉及IO口的运算, 会有一些你不希望看到的中间过程的值会对IO口进行读-修改-写的操作, 引入中间变量temp,让中间变量参与运算将消除这些问题。




欢迎光临 (http://www.51hei.com/bbs/) Powered by Discuz! X3.1