各位老师,下面是我几乎原本照抄 宋雪松老师的键盘矩阵程序,只是我的是三行四例,数组名称改用中文字母,不知为什么不正常,和原程序比对了几次也没有找出问题,所以求教。
#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]传不进主函数里一样,,求教。谢谢,,我比对了快三个小时就是找不出。
|