MSP430中断以和一个键盘例子.docVIP

  1. 1、本文档共8页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
MSP430中断以和一个键盘例子

最近在学习和实践的过程中接触到了线程的概念。当你需要处理一大堆数据或者等待一个事件发生时候,系统其实并不需要等在那里,只需建立一个线程,适时的让它在后台运行,处理这些很占用系统的事件。我想这与中断的功能很是相似,有些时候你让程序卡在那里仅仅是为了等待一个参数的改变,而这个参数完全可以在中断中实现修改,所以巧妙的使用中断对于高效的程序是必须的。 MSP430提供了3类中断: 系统复位; 非可屏蔽中断; 可屏蔽中断。 下表列出了三种中断各自的中断源: 系统复位中断源 可屏蔽中断中断源 可屏蔽中断中断源 加电源电压 RST/NMI引脚有上升信号 看门狗定时器溢出(定时器模式) RST/NMI引脚加低电平 振荡器故障 其他有中断能力的外部模块 看门狗定时器溢出(看门狗模式) 看门狗定时器密钥不符 MSP430中断优先级结构图如上图所示。各模块的中断优先级由模块连接链决定,越接近CPU/NMIRS的模块,其中断优先级越高。 上图给出了中断的执行过程,相信大家可以在任何其他的书本中找到类似的流程图。中断发生,全局中断开启,并且允许相应此中断,此时需要等待当前指令完成。保存短点和寄存器值。然后清除寄存器的值以及中断标志位,如果同时有多个中断发生则选择优先级最高的执行,进入中断服务子程序,执行完后,恢复断点,继续执行主程序。通过这种前后台程序的切换控制程序运行,得到高效率。 下面让我们来看一个4x4键盘的例子。我们通过中断的方式来感知键盘的操作,通过一个键盘扫描程序来确认按下的键,然后通过数码管动态的显示出来。 #includemsp430x24x.h static int nRes; int nP10,nP11,nP12,nP13; static char LEDData[16]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,0x88,0x83,0xc6,0xa1,0x86,0x8e}; void delay(int number) { while(--number); } int KeyProcess(void) { int nres=0; //P1.4输出低电平 P1OUT = 0xe0; nP10 = P1INBIT0; if (nP10 == 0) nres = 13; nP11 = (P1IN BIT1) 1; if (nP11 == 0) nres = 14; nP12 = (P1IN BIT2) 2; if (nP12 == 0) nres = 15; nP13 = (P1IN BIT3) 3; if (nP13 == 0) nres = 16; //P1.5输出低电平 P1OUT = 0xd0; nP10 = P1INBIT0; if (nP10 == 0) nres = 9; nP11 = (P1IN BIT1) 1; if (nP11 == 0) nres = 10; nP12 = (P1IN BIT2) 2; if (nP12 == 0) nres = 11; nP13 = (P1IN BIT3) 3; if (nP13 == 0) nres = 12; //P1.6输出低电平 P1OUT = 0xb0; nP10 = P1INBIT0; if (nP10 == 0) nres = 5; nP11 = (P1IN BIT1) 1; if (nP11 == 0) nres = 6; nP12 = (P1IN BIT2) 2; if (nP12 == 0) nres = 7; nP13 = (P1IN BIT3) 3; if (nP13 == 0) nres = 8; //P1.7输出低电平 P1OUT = 0x70; nP10 = P1INBIT0; if (nP10 == 0) nres = 1; nP11 = (P1IN BIT1) 1; if (nP11 == 0) nres = 2; nP12 = (P1IN BIT2) 2; if (nP12 == 0) nres = 3; nP13 = (P1IN BIT3) 3; if (nP13 == 0) nres = 4; while(!(nP10 nP11 nP12 nP13 )) { P1OUT = 0x00; //恢复以前值 //读取各个管脚的状态 nP10 = P1INBIT0; nP11 = (P1INBIT1) 1; nP12 = (P1INBIT2) 2; nP13 = (P1INBIT3) 3; } return nres; } void display(int number) { int tens,single; tens = nu

您可能关注的文档

文档评论(0)

jgx3536 + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

版权声明书
用户编号:6111134150000003

1亿VIP精品文档

相关文档