找回密码
 立即注册

QQ登录

只需一步,快速开始

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

键盘矩阵程序问题

[复制链接]
跳转到指定楼层
楼主
ID:64817 发表于 2014-10-12 18:39 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
各位老师,下面是我几乎原本照抄 宋雪松老师的键盘矩阵程序,只是我的是三行四例,数组名称改用中文字母,不知为什么不正常,和原程序比对了几次也没有找出问题,所以求教。
#include<reg52.h>
sbit h1=P2^3;//第一行
sbit h2=P2^2;
sbit h3=P2^1;
sbit h4=P2^0;//第四行
sbit l1=P2^6;//第一例
sbit l2=P2^5;
sbit l3=P2^4;
sbit q1=P0^5;//数码管段选
unsigned code shumaguan[]={0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xF8,
    0x80, 0x90         };
unsigned anjdqzhi[4][3]={{1,1,1},{1,1,1},{1,1,1},{1,1,1}};//按键当前状态值。               
void main()
{
  unsigned char h ,l;
  unsigned char anjbfzhi[4][3]={{1,1,1},{1,1,1},{1,1,1},{1,1,1}};//按健备份值保存前一次状态
  EA=1; //开总中断
  TMOD=0x01; //设置定时器0工作模式
  TH0=0xFC;  //设置定时时间值
  TL0=0x67;
  ET0=1;  //打开中断使能
  TR0=1;  //打开定时器
  q1=0;
  P1= shumaguan[0];//默认显示0
  while(1)
   {
for(h=0;h<3;h++)
  {
     for(l=0;l<4;l++) //按健备份值与按键当前状态值相比较,相同时说明按健无动作
   {
    if(anjbfzhi[h][l]!=anjdqzhi[h][l])//按健备份值与按键当前状态值相比较,不相同时说明按健动作按下
   {
    if(anjdqzhi[h][l]!=0) //按健弹起  //按键当前状态值检测是在中断中进行
      {
     P1= shumaguan[h*4+l];  //数码管显示对应数字
      }
    anjbfzhi[h][l]=anjdqzhi[h][l]; //更新备份值
    }
   }
  }
   }
}
void  zd()  interrupt 1   
{
unsigned char i;
static unsigned char h0=0;
static unsigned char jphch[4][3]={  {0xFF,0xFF,0xFF}, //phch[][3]按健扫描缓冲区,四行三例12个按健
{0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF},{0xFF,0xFF,0xFF}}; //
TH0=0XFC; //定期器重新装入初值
TL0=0X18;         // h0出始化为0; jphch[h0][0]为按健描缓冲区的0行0例个按健
jphch[h0][0]=(jphch[h0][0]<<1)|l1; //jphch[h0][1]为按健描缓冲区的0行1例个按健,以此类推
jphch[h0][1]=(jphch[h0][1]<<1)|l2; // jphch[h0][1]的按键左移一位(0XFF变为0XFE)与l2(l2有按键动作为0)
jphch[h0][2]=(jphch[h0][2]<<1)|l3; //相或后(0与0或为0,1与0或为1),再赋予 jphch[h0][1]。
         //一行三个例键 所以对应三次 .

for(i=0;i<3;i++)
{
  if(jphch[h0]&0X0F==0X00)
    {
  anjdqzhi[h0]=0;
    }
else if(jphch[h0]&0X0F==0X0F)
    {
     anjdqzhi[h0]=1;
    }
}
h0++;
h0=h0&0X03; //类似if(h0<3){语名;h0==2;h0=0}
switch(h0)
{
case 0: h4=1;h1=0;break;
case 1: h1=1;h2=0;break;
case 2: h2=1;h3=0;break;
case 3: h3=1;h4=0;break;
default: break;
}
不知如何按按键,数码管一直为0;中断进去了,,好像是中断里anjdqzhi[h0]传不进主函数里一样,,求教。谢谢,,我比对了快三个小时就是找不出。
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:1 发表于 2014-10-12 20:55 | 只看该作者
改用中文字母??
回复

使用道具 举报

板凳
ID:64817 发表于 2014-10-13 19:10 | 只看该作者
问题找出来了,主要还是C基础不牢,if(jphch[h0]&0X0F==0X00),改为
if((jphch[h0]&0X0F)==0X00)
;&的运算及别没有==高,,必须加()
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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