qq_29152743
YK1312
采纳率0%
2016-08-10 08:01

求助!外接矩阵键盘,按下键盘无法实现界面切换?

  用89C52做了一个温度数据采集器,LCD12864显示,自己添加了外接矩阵键盘,但按下键盘无法实现界面切换。求大神帮忙解决一下
  之前的子函数经过测试,没有问题,皆可独立显示,但在按键反馈切换上出了问题 
        部分代码如下:

unsigned char xdata K; //键盘返回值
/*************************************************************************/
unsigned char KeyScan() //按键扫描
{
unsigned char cord_l,cord_h; //声明列线和行线的值的储存变量
P1 = 0xf0; //P1^7-P1^0=11110000
if( (P1 & 0xf0) != 0xf0) //判断是否有按键按下
{
delay(5); //软件消抖
if( (P1 & 0xf0) != 0xf0) //判断是否有按键按下
{
cord_l = P1 & 0xf0; // 储存列线值
P1 = cord_l | 0x0f;
cord_h = P1 & 0x0f; // 储存行线值
//while( (P1 & 0x0f) != 0x0f ); //松手检测
return (cord_l + cord_h); //返回键值码
}

}

}
/*********************************************************************/

主界面(可单独显示):
void tempmenu1(); //分别是三个界面的子函数,都可以独立显示
void tempmenu2();
void presmenu();
void mainmenu()
{
unsigned char code TITLE[]={"****功能菜单****"};
unsigned char code DAT1[]={"1:温度监测----"};
unsigned char code DAT2[]={"2:相关指标----"};
unsigned char code DAT3[]={"3:其它参数----"};

lcd_int();
delay(25);
write_cmd(0x01);                                    
showstring1(0x80,TITLE,0x10);
delay(20);
showstring1(0x90,DAT1,0x07);
delay(20);             
showstring1(0x88,DAT2,0x06);
delay(20);
showstring1(0x98,DAT3,0x07);
delay(20);
do
 {
  K=KeyScan();
  delay(1);
 }
while( (K!=0xee)&&(K!=0xde)&&(K!=0xbe) );
if (K==0xee)
 {lcd_int();
  tempmenu1();}
else if (K==0xde)
 {lcd_int();
  tempmenu2();}
else if (K==0xbe)
 {lcd_int();
  presmenu();}
else
  delay(1);

}
/*********************************************************************/
温度界面1(可单独显示):
void mainmenu();
void tempmenu1() //温度显示界面
{
unsigned char code TITLE[]={"****温度监测****"};
unsigned char code DAT1[]={"温度1 :"};
unsigned char code DAT2[]={"温度2 :"};
unsigned char code DAT3[]={"温度3 :"};
unsigned char code DW[]={"℃----"};
unsigned int T1,T2,T3;
unsigned char t1[6];
unsigned char t2[6];
unsigned char t3[6];

lcd_int();
delay(25);
write_cmd(0x01);                                    //显示温度一二三标识
showstring1(0x80,TITLE,0x10);
delay(50);
showstring1(0x90,DAT1,0x07);
delay(50);             
showstring1(0x88,DAT2,0x07);
delay(50);
showstring1(0x98,DAT3,0x07);
delay(50);
do
{
 delay(20);
 T1 = MAX6675_ReadReg1();
 delay(40);                                         //获取温度值
 T2 = MAX6675_ReadReg2();
 delay(40);
 T3 = MAX6675_ReadReg3();
 delay(40);

 sprintf(t1,"%d",T1);
 sprintf(t2,"%d",T2);
 sprintf(t3,"%d",T3);       

 showstring1(0x94,t1,0x04);
 delay(50);
 showstring1(0x95,DW,0X03);
 delay(50);
 showstring1(0x8c,t2,0x04);
 delay(50);
 showstring1(0x8d,DW,0X03);
 delay(50);
 showstring1(0x9c,t3,0x04);
 delay(50);
 showstring1(0x9d,DW,0X03);
 delay(50);
 K=KeyScan();
}
while(K!=0x7d);
if(K==0x7d)
  mainmenu();
else
  delay(1);  

}
/******************************************************/
剩下的两个界面代码与温度界面1相似,但按下矩阵键盘后没有反应
/****************************************************/
主函数就是初始的主菜单,但烧录后按下键盘没有反应
void main()
{

tempmenu1();
}
/**************************************************************/
只是想利用矩阵键盘来实现界面的切换,但是无法成功,特在此求助。。。
不知道是不是代码有问题?

  • 点赞
  • 写回答
  • 关注问题
  • 收藏
  • 复制链接分享
  • 邀请回答

2条回答