4*4键盘<br />中断方式为PROTB口的RB7-RB4电平变化中断;<br />RB7-RB4接行扫描线,RB3-RB0接列扫描; 具体电路见张明峰的《PIC单片机入门与实战》第172页。<br /> <br />出现的问题是。能正常显示扫描码(外接了一个带字库的LCD屏。但是同时按下一行(4个)按键程序就死了(LCD屏上的扫描码不刷新了 ——没开看门狗)。<br />请前辈指点下,谢谢了。<br /><br />//端口的初始化;<br />void port_init()<br />{<br /> ADCON1=0X07; // 初始化I/O,使其工作在数字I/O状态<br /> TRISA = 0xFF; //ff; 0 out; 1 in<br /><br />//初始化RB口为电平变化中断<br /> TRISB = 0xF0; //RB口设置为输入,低输出;<br /> RBPU=0; //使用RB口弱上拉<br /> PORTB=0; //PORTB 低4位输出0<br /> INTCON=0; // 清除INTCON 所有中断禁止;<br /> RBIE=1 ; //允许RB口电平变化中断;<br /> <br /><br />//****在这里没有打开全局中断***************<br /> TRISC = 0x3E; //fe "0011 1110"<br /> TRISD = 0x00; <br /> TRISE = 0x01; //df; "0000 0001" busy(输入) req(输出)<br /> } <br /><br /><br /><br /><br /><br />static uchar key_t,key_i;<br />uchar key_a=200;<br />void interrupt INTS(void)<br />{<br /> if(RBIE && RBIF)<br /> {<br /> if(PORTB!=0xf0)<br /> { <br /> <br /> while(key_a--); //有键按下消抖后再判断;<br /> <br /> if(PORTB!=0xf0)<br /> {<br /> <br /> PORTB=0xfe; //准备扫描码;<br /> NOP();<br /> NOP();<br /> for(key_i=0;key_i<4;key_i++) //最多扫4次;<br /> {<br /> if((PORTB&0xf0)!=0xf0)<br /> {key=PORTB; //得到的扫描码。<br /> press++;<br /> break;<br /> } <br /> else <br /> {CARRY=1; //置位进位标志。<br /> PORTB=PORTB<<1;<br /> NOP();<br /> NOP();<br /> }<br /> }<br /> <br /> <br /> }<br /> else<br /> {<br /> interfere++; //可能干扰;<br /> }<br /><br /> }<br /> else <br /> {<br /> rebound++;//按键弹起;<br /> }<br /> <br /> }<br /> end:<br /> enter++; //中断进入次数;<br /> <br /><br /><br />PORTB=0; // 清0 RB口;进行下一次扫描;<br />key_t=PORTB; //读一次RB口清中断标志;<br />RBIF=0; //清软件中断标志<br />GIE=1; //开中断;<br />} <br /> |
|