请教我用PIC16f77做的键盘中断扫描程序有错吗 同时按4个键死

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

哈哈~~~零耗时键盘

  <br /> 相关链接:<a href='http://www.google.cn/search?hl=zh-CN&q=%E9%9B%B6%E8%80%97%E6%97%B6%E9%94%AE%E7%9B%98&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f&oq='>http://www.google.cn/search?hl=zh-CN&q=%E9%9B%B6%E8%80%97%E6%97%B6%E9%94%AE%E7%9B%98&btnG=Google+%E6%90%9C%E7%B4%A2&meta=&aq=f&oq=</a>
 楼主| yjypmypm 发表于 2009-2-24 21:09 | 显示全部楼层

虽然键盘延时有点短,但显示的扫描码没出过问题。

&nbsp;&nbsp;&nbsp;&nbsp;虽然键盘延时有点短,但显示的扫描码没出过问题.调试时用过整型变量,&nbsp;uint&nbsp;&nbsp;key_a=2000;&nbsp;&nbsp;(值200也是如此)&nbsp;来延时2MS,但按下按键程序停了少说也有1秒(LCD不停地显示字符),后来改为uchar型变量就很快了。&nbsp;&nbsp;不知道为什么。编译器问题?&nbsp;编译环境MPLAB7.20+PICC8.05**版;<br /><br />
兰天白云 发表于 2009-2-25 08:39 | 显示全部楼层

一:<br />static&nbsp;uchar&nbsp;key_t,key_i;<br /><br />void&nbsp;interrupt&nbsp;INTS(void)<br />{<br />uchar&nbsp;key_a=200;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//放在这里合适<br />if(RBIE&nbsp;&&&nbsp;RBIF)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if(PORTB!=0xf0)<br /><br /><br />二:<br /><br />for(key_i=0;key_i&lt4;key_i++)&nbsp;&nbsp;&nbsp;&nbsp;//最多扫4次;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if((PORTB&0xf0)!=0xf0)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{key=PORTB;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//得到的扫描码。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;press++;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />如果一行键都按下,key值不对<br />
 楼主| yjypmypm 发表于 2009-2-27 00:43 | 显示全部楼层

谢谢兰天前辈的指点。

我又对程序做了以下修改。<br />扫描方式完全根据张工给出的汇编语言“翻译”出来的;<br />&nbsp;&nbsp;现在同时按下一行4个键后(按下任意2或3个键没有什么问题),程序不哪么容易死了(有时还会死),只是按下4个键进入中断次数不断增加。(一直不停的进入中断)。不知道为什么?<br /><br />&nbsp;&nbsp;&nbsp;程序死我估计是跑飞了。<br />&nbsp;&nbsp;&nbsp;&nbsp;向显示屏发送数据的函数<br />&nbsp;&nbsp;&nbsp;void&nbsp;send&nbsp;(uchar&nbsp;dat)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//写命令或数据<br />{<br />&nbsp;&nbsp;while(busy==1);&nbsp;&nbsp;&nbsp;//估计程序飞到这里了;<br />&nbsp;&nbsp;bus=dat;<br />&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;req=1;<br />&nbsp;while(busy==0);//或这里;<br />&nbsp;&nbsp;req=0;<br />&nbsp;&nbsp;return;<br />}<br /><br /><br /><br /><br />新的键盘处理程序<br /><br />#include&nbsp;&ltpic.h&gt<br />#define&nbsp;SLEEP()&nbsp;&nbsp;asm(&quot;sleep&quot;)<br />#define&nbsp;NOP()&nbsp;&nbsp;&nbsp;&nbsp;asm(&quot;nop&quot;)<br />#define&nbsp;clrwdt()&nbsp;asm(&quot;clrwdt&quot;)<br /><br /><br />#define&nbsp;uchar&nbsp;&nbsp;unsigned&nbsp;char&nbsp;&nbsp;<br />#define&nbsp;uint&nbsp;&nbsp;&nbsp;unsigned&nbsp;int<br /><br />#include&nbsp;&quot;include.h&quot;<br />extern&nbsp;uchar&nbsp;key;<br /><br /><br />extern&nbsp;bank1&nbsp;uint&nbsp;interfere;<br />extern&nbsp;bank1&nbsp;uint&nbsp;press;<br />extern&nbsp;bank1&nbsp;uint&nbsp;rebound;<br />extern&nbsp;bank1&nbsp;uint&nbsp;enter;<br />extern&nbsp;bank1&nbsp;uint&nbsp;zero;<br /><br />static&nbsp;uchar&nbsp;key_t,key_i;<br /><br /><br /><br />void&nbsp;interrupt&nbsp;INTS(void)<br />{<br /><br />&nbsp;&nbsp;uchar&nbsp;key_a=200,i=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;while(key_a--);&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//先消抖;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;if(RBIE&nbsp;&&&nbsp;RBIF)<br />&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;if((PORTB&0xf0)^0xf0)//屏蔽低4位,并取反,判断高4位是否有1;有1即键按下<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTB=0x0e;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//有键按下,则置打描码,查询<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;while(i)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//&nbsp;i&nbsp;的值为PROTB取反,在PROTB左移8次后i的值将变为0退出循环。张工比较高明的做法&nbsp;呵呵。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;i=PORTB^0xff;&nbsp;&nbsp;//获得i的值;为PROTB的值取反;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(i&0xf0)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//如果屏蔽低4位,高位有1,则找到按键。<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{key=PORTB;&nbsp;&nbsp;//获得按键;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;press++;&nbsp;&nbsp;&nbsp;&nbsp;//显示按下的次数用以显示;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;break;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//获得按键后,退出循环;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;CARRY=1;&nbsp;&nbsp;//为下一个扫描码,置进位标志;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;PORTB=PORTB&lt&lt1;&nbsp;&nbsp;//扫描下一列<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;NOP();<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;rebound++;&nbsp;&nbsp;//记录弹起次数,用以显示;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;}<br />&nbsp;&nbsp;&nbsp;&nbsp;<br />enter++;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//记录中断次数,用以显示;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br /><br /><br />PORTB=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//为下一次按键做准备;<br />key_t=PORTB;&nbsp;&nbsp;//读一次RB口清硬件中断标志;<br />RBIF=0;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//清硬件中断标志;<br />GIE=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开中断<br />}&nbsp;&nbsp;<br /><br /><br />兰天前辈说的&nbsp;key值不对,是指哪里不对。<br /><br /><br />
 楼主| yjypmypm 发表于 2009-3-2 22:44 | 显示全部楼层

困扰一周了,原因找出来了

最后一句<br />GIE=1;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;//开中断&nbsp;<br />在中断还没退出时又进入中断,<br />
backupyan 发表于 2009-3-3 23:01 | 显示全部楼层

真不容易啊。

  
 楼主| yjypmypm 发表于 2009-3-4 01:04 | 显示全部楼层

虽然现在按一行4个键不死机了(按一列只有一个扫描码.)

但同时按下一行4个键,老是不停的进入中断。1秒可能进入上百次不知道问题出在哪。<br />不可能是按键抖动,因为同是按一行3个键都没事。<br />继续困扰中。。。。<br />
 楼主| yjypmypm 发表于 2009-3-15 13:17 | 显示全部楼层

自已顶下。

没有哪位前辈遇到这个问题吗。。。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

6

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部

6

主题

21

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部