找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3712|回复: 7
打印 上一主题 下一主题
收起左侧

4*4矩阵键盘问题,我是新手求大神解答,谢了

[复制链接]
跳转到指定楼层
楼主
ID:66897 发表于 2014-10-2 18:49 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
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不行吗???求指教


分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:51348 发表于 2014-10-3 23:48 | 只看该作者
因为赋值后没有读入,没有读入检测什么呀,temp=P是读入
回复

使用道具 举报

板凳
ID:66032 发表于 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);
    }


}

回复

使用道具 举报

地板
ID:66968 发表于 2014-10-5 13:23 | 只看该作者
4*4矩阵键盘 那里用写得这么复杂!!! 程序里面也有很多错误!!建议楼主参考一下网上的一些特例吧
回复

使用道具 举报

5#
ID:66032 发表于 2014-10-5 20:41 | 只看该作者
我这是在板子上运行过的,一点问题都没有, 你说说什么问题?
回复

使用道具 举报

6#
ID:66897 发表于 2014-10-8 16:20 | 只看该作者
mqwu 发表于 2014-10-4 14:37
错误太多,还是给PIC16F877的例子你参考一下吧

#include

没问题,编的挺好的、、就是有个地方一直想不通,就是switch检测前为什么必须有temp=PORTB;直接switch检测temp&0x0f为什么不行呢,一直不明白。。
回复

使用道具 举报

7#
ID:66032 发表于 2014-10-8 16:56 | 只看该作者
也可以,你看这个你就会明白, if ((temp&0x0f)!=0x0f)这样写起来只是多个括号,不是很通俗的格式。
回复

使用道具 举报

8#
ID:66032 发表于 2014-10-8 17:17 | 只看该作者
如果没有中间变量temp, 那么每次运算和算法都要涉及IO口的运算, 会有一些你不希望看到的中间过程的值会对IO口进行读-修改-写的操作, 引入中间变量temp,让中间变量参与运算将消除这些问题。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表