单片机矩阵键盘

2019-07-15 20:40发布

#include<reg51.h>   sbit P34=P3^4;      sbit P35=P3^5;      sbit P36=P3^6;      sbit P37=P3^7;      unsigned char code Tab[ ]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F};   unsigned char keyval;    //定义变量储存按键值void delayms(unsigned int z)  {        unsigned int x,y;        for(x=z;x>0;x--)        for(y=110;y>0;y--)  ;        }void display(unsigned char k){   P1=0xbf;            //点亮数码管times New Roman">DS6   P0=Tab[k/10];       //显示十位    delayms(2);        //动态扫描延时       P1=0x7f;            //点亮数码管DS7   P0=Tab[k%10];       //显示个位    delayms(2);       //动态扫描延时      P0=0;   //关闭数码管  消除重影}void main( ){    EA=1;                  //开总中断        ET0=1;                 //定时器T0中断允许                 TMOD=0x01;            //使用定时器T0的模式1        TH0=(65536-500)/256;  //定时器T0的高8位赋初值        TL0=(65536-500)%256;  //定时器T0的高8位赋初值        TR0=1;                //启动定时器T0        while(1)                //无限循环        {                display(keyval);   //调用按键值的数码管显示子程序        }}void timer0( ) interrupt 1     //定时器T0的中断编号为1{     TR0=0;                  //关闭定时器T0     P3=0xf0;                 //所有行线置为低电平“0”,所有列线置为高电平“1          if((P3&0xf0)!=0xf0)      //列线中有一位为低电平“0”,说明有键按下          delayms(20);           //延时一段时间、软件消抖          if((P3&0xf0)!=0xf0)      //确实有键按下          {              P3=0xfe;             //第一行置为低电平“0”(P3.0输出低电平“0”)               if(P34==0)           //如果检测到接P3.4引脚的列线为低电平“0             keyval=1;            //可判断是S1键被按下           if(P35==0)             //如果检测到接P3.5引脚的列线为低电平“0             keyval=2;            //可判断是S2键被按下           if(P36==0)             //如果检测到接P3.6引脚的列线为低电平“0             keyval=3;            //可判断是S3键被按下           if(P37==0)            //如果检测到接P3.7引脚的列线为低电平“0             keyval=4;           //可判断是S4键被按下         P3=0xfd;             //第二行置为低电平“0”(P3.1输出低电平“0”)               if(P34==0)           //如果检测到接P3.4引脚的列线为低电平“0             keyval=5;            //可判断是S5键被按下           if(P35==0)             //如果检测到接P3.5引脚的列线为低电平“0             keyval=6;            //可判断是S6键被按下           if(P36==0)             //如果检测到接P3.6引脚的列线为低电平“0             keyval=7;            //可判断是S7键被按下           if(P37==0)            //如果检测到接P3.7引脚的列线为低电平“0             keyval=8;           //可判断是S8键被按下         P3=0xfb;             //第三行置为低电平“0”(P3.2输出低电平“0”)                if(P34==0)          //如果检测到接P3.4引脚的列线为低电平“0             keyval=9;          //可判断是S9键被按下           if(P35==0)           //如果检测到接P3.5引脚的列线为低电平“0             keyval=10;         //可判断是S10键被按下           if(P36==0)          //如果检测到接P3.6引脚的列线为低电平“0             keyval=11;        //可判断是S11键被按下           if(P37==0)          //如果检测到接P3.7引脚的列线为低电平“0             keyval=12;        //可判断是S12键被按下         P3=0xf7;             //第四行置为低电平“0”(P3.3输出低电平“0”)                if(P34==0)          //如果检测到接P3.4引脚的列线为低电平“0             keyval=13;          //可判断是S13键被按下           if(P35==0)           //如果检测到接P3.5引脚的列线为低电平“0             keyval=14;         //可判断是S14键被按下           if(P36==0)          //如果检测到接P3.6引脚的列线为低电平“0             keyval=15;        //可判断是S15键被按下           if(P37==0)          //如果检测到接P3.7引脚的列线为低电平“0             keyval=16;        //可判断是S16键被按下     }     TR0=1;                    //开启定时器T0     TH0=(65536-500)/256;  //定时器T0的高8位赋初值          TL0=(65536-500)%256;  //定时器T0的高8位赋初值                  }      
按第三列都是13    按第四列都是16    为什么?????     
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。