打印

高手帮我看一下

[复制链接]
1380|7
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
tx040316|  楼主 | 2007-4-17 20:14 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我想一片8255做一个矩阵键盘,PA口八个口作列线,PC0到PC4作行线加上拉电阻接电源,下面程序,但编译不过去,希望高手们指点下:
#include <REG51.H>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int 
void delay (uint);
uchar scankey(void);
uchar keyscan(void);
void main(void)

  uchar key;
  while (1)
  { 
    key = keyscan();
    delay (2000);
  }
}
// 延时//
void delay(uint i)

  uint j;
  for (j=0;j<i;j++)
       {}
}
//检测有无按键//
uchar checkkey() //检测按键,有返回0XFF,无返回0//

  uchar i;
  XBYTE[0x7f00]=0x00;
  i=XBYTE[0x7f02];
  i=i&0x0f;
  if (i= = 0x0f) return (0);
  else return (0xff);
}
// 键盘扫描//
uchar keyscan()//扫描键盘,有键按下返回键编码,无返回0XFF//
{
  uchar scancode;//列扫描变量//
  uchar codevalue;//返回的编码变量//
  uchar m;//行首编码变量//
  uchar k;//行检测码//
  uchar i,j;
  if (checkkey()= =0) return (0xff);//检测按键,无返回0XFF//
  else 
      {
       delay(200);
       if (checkkey()= =0) return (0xff);
       else 
           {
            scancode=0xfe;m=0x00;//列扫描码,行首码赋初值
            for(i=0;i<8;i++)
               { k=0x01;
                 XBYTE[0x7f00]=scancode;//送列扫描码
                 for (j=0;j<4;j++)
                    {
                     if ((XBYTE[0x702]&k = = 0)//检测当前行是否有键按下
                      { 
                       codevalue=m+j;//有,求编码
                       while(checkkey()!=0);//等键释放
                       return (codevalue);//返回编码
                      }
                 else k=k<<1;//检测下一行
                }
            m=m+8;//计算下一行首编码
            scancode=scancode<<1;//列扫描码左移一位,扫描下一列
            }
        }
    }

相关帖子

沙发
ayb_ice| | 2007-4-18 07:44 | 只看该作者

编译不过去一般是语法等简单问题...

使用特权

评论回复
板凳
tx040316|  楼主 | 2007-4-18 19:01 | 只看该作者

高手帮我看一下

请问一下你调试过吗?你帮我调试一下,看看问题出在哪?谢谢

使用特权

评论回复
地板
dreambird| | 2007-4-18 20:18 | 只看该作者

re

编译不过有什么错误报告?

使用特权

评论回复
5
ljj168| | 2007-4-18 20:34 | 只看该作者

看看这回编译能通过否?

#include <REG51.H>
#include<absacc.h>
#define uchar unsigned char
#define uint unsigned int 
void delay (uint);
uchar scankey(void);
uchar keyscan(void);
void main(void)

  uchar key;
  while (1)
  { 
    key = keyscan();
    delay (2000);
  }
}
// 延时//
void delay(uint i)

  uint j;
  for (j=0;j<i;j++)
       {}
}
//检测有无按键//
uchar checkkey() //检测按键,有返回0XFF,无返回0//

  uchar i;
  XBYTE[0x7f00]=0x00;
  i=XBYTE[0x7f02];
  i=i&0x0f;
  if (i== 0x0f) return (0);
  else return (0xff);
}
// 键盘扫描//
uchar keyscan()//扫描键盘,有键按下返回键编码,无返回0XFF//
{
  uchar scancode;//列扫描变量//
  uchar codevalue;//返回的编码变量//
  uchar m;//行首编码变量//
  uchar k;//行检测码//
  uchar i,j;
  if (checkkey()==0) return (0xff);//检测按键,无返回0XFF//
  else 
      {
       delay(200);
       if (checkkey()==0) return (0xff);
       else 
           {
            scancode=0xfe;m=0x00;//列扫描码,行首码赋初值
            for(i=0;i<8;i++)
               { k=0x01;
                 XBYTE[0x7f00]=scancode;//送列扫描码
                 for (j=0;j<4;j++)
                    {
                     if ((XBYTE[0x702]&k == 0))//检测当前行是否有键按下
                      { 
                       codevalue=m+j;//有,求编码
                       while(checkkey()!=0);//等键释放
                       return (codevalue);//返回编码
                      }
                 else k=k<<1;//检测下一行
                }
            m=m+8;//计算下一行首编码
            scancode=scancode<<1;//列扫描码左移一位,扫描下一列
            }
        }
    }
}

使用特权

评论回复
6
tx040316|  楼主 | 2007-4-18 20:58 | 只看该作者

谢谢

通过是通过了,但我不明白刚开始的时候为什么通过不了?在什么地方出现错误了?

使用特权

评论回复
7
ljj168| | 2007-4-19 20:11 | 只看该作者

小毛病

1."= ="和"=="怎么能一样呢???
2.uchar keyscan()子程序少了一个"}"

使用特权

评论回复
8
tx040316|  楼主 | 2007-4-20 11:37 | 只看该作者

回复7楼

谢谢你的指点,我前两天查了一下书,明白了,你说得很对.

使用特权

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

本版积分规则

3

主题

19

帖子

0

粉丝