打印

键盘扫描进入中断后出问题,大虾帮忙解决下

[复制链接]
2121|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
pental|  楼主 | 2009-9-11 22:51 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 pental 于 2009-9-11 23:08 编辑

sbit Col0 = P3^0;
sbit Col1 = P3^1;
sbit Col2 = P3^3;
sbit Col3 = P3^4;
sbit Col4 = P3^5;
sbit Col5 = P3^7;
sbit pcled=P1^5;     //PC control
sbit tvled=P1^6;     //TV control      
sbit redout=P1^7;     //RED      

void C52_Init()
{
   P3=0x44;  //与键盘的操作有关//初始化各并口都为0xFF,为使中断有效,部分位置0,要保证中断口为输入即置1  
  
   EA=1;
   ET0=1;
   EX0=1;
    TMOD=0x02;
   TH0=84;
   TL0=84;
   timer0_count=0;   
   send1_flag=0;  
   mod_count=0;   
   pcled=0;
   tvled=0;
   redout=0;      //红外发射管初始化为0.
   //pout=0;
}
/***************************************************************************************************/
/**********************15ms延迟,用于消除抖动**********************/
void delay()
{
  unsigned char i=100,n=200;                  
for(;i>0;i--)
{
  while(n) n--;
}
}
/****************************************************************/
/***********扫描键盘,返回键值(高四位代表行,低四位代表列)*******/
unsigned char scan_key()                    
{
    unsigned char temp,keycode;
temp=P1&0x0F;          //存储列值  
if(temp==0x0E) keycode=0;
else if (temp==0x0D) keycode=1;
else if (temp==0x0B) keycode=2;
else if (temp==0x07) keycode=3;
   
    P1 = temp;             //列输出进行行扫描   
     
    P3 = 0xFF;             //有用端口置为输入(写1)         
if(Col0==0) keycode=keycode;
else if (Col1==0) keycode=keycode+4;
else if (Col2==0) keycode=keycode+8;
else if (Col3==0) keycode=keycode+12;
    else if (Col4==0) keycode=keycode+16;
else if (Col5==0) keycode=keycode+20;
    return(keycode);
}
/******************************************************************/
/****************************键盘扫描处理**************************/
void program_SCANkey() interrupt 0  //键盘扫描的处理,P1端只要有低电平输入/输出,会产生此中断
{
unsigned char temp;
IE=0x00;       //必须禁止,不然在进行列扫描会出现问题,P0会输出低电平,从而再次产生中断
                              //延时10ms左右,消除抖动干扰
    P1=0x0F;
delay();   
temp=P1;      //P1口输入
if((temp&0x0F)!=0x0F)                 //判断是否有效按键
    {      
         key_code=scan_key();          //获取键值
         while(P1&0x0F!=0x0F) pcled=~pcled;          //等待按键释放
       }
else while(1) tvled=~tvled;     :@                     
P3=0x44;                      //保持中断有效,P3输出为低
IE=0x8F;  
return;
}


void main(void)
{
  unsigned char i,j;
  C52_Init();           //初始化,主要是定时器初始化和键盘中断初始化
  while(1)
  {
   while(key_code==0xFF) ;     //等待键盘中断,产生0-0F的键盘值,若有数据,发送数据,若没数据,等待中断
buffer[2]=key_code;
buffer[3]=~key_code;   
    while(1)                                //用于测试
{
for (i=0;i<200;i++)
       for (j=0;j<200;j++);             //初始空闲
     SendData();       //发数据
    for (i=0;i<200;i++)
      for (j=0;j<200;j++);
   }         
   }
}
/******************************************************************************************/
测试过了,能运行到有个人头的地方,错在哪

相关帖子

沙发
duojinian| | 2009-9-12 12:41 | 只看该作者
中断函数设置标志,然后立即退出。主函数中巡检标志。记住中断函数最好不要超过20行。越短越好。5句话之内最好。等待按键抬起需要太多时间。

使用特权

评论回复
板凳
pental|  楼主 | 2009-9-12 15:13 | 只看该作者
中断函数设置标志,然后立即退出。主函数中巡检标志。记住中断函数最好不要超过20行。越短越好。5句话之内最好。等待按键抬起需要太多时间。
duojinian 发表于 2009-9-12 12:41

之前我用的4*4键盘用这个程序没问题,应该不是这个问题。我改用4*6后没有改动

使用特权

评论回复
地板
fugong| | 2009-9-13 22:45 | 只看该作者
while(1)   这是个死循环吧。。。。。。。

使用特权

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

本版积分规则

3

主题

5

帖子

0

粉丝