按键程序 PORT中断程序

发布者:lidong4069最新更新时间:2015-11-09 来源: eefocus关键字:按键程序  PORT  中断程序 手机看文章 扫描二维码
随时随地手机看文章
MSP 430里面 P1口和P2口有中断功能。

我们的项目里面,P1口的1-7管脚做键盘,0脚做风速传感器的输入。P2口的0-4做键盘,5-7做其他用。

 

 

【按键PORT】按键程序 <wbr>PORT中断程序
 

 //键盘引脚配置
 P1DIR=0x00;                                   // P1 口为输入(0:风速传感器输入,1-7中断信号输入)

 P2DIR&=~(BIT0+BIT1+BIT2+BIT3+BIT4);           //把P2.0-P2.4设为输入
  //下降沿触发是指按下的时候进入中断,上升沿触发是在放开按键的时候进入中断
  P1IES|=BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7;  //设置P1口中断边沿选择寄存器,置1为下跳沿,置0为

                                              //上跳沿
  P1IE=0xFE;                                  //设置P1中断使能寄存器,置1为允许中断,置0为禁止中断

 //(因为P1.0他用,为了不影响我们的按键的判断,所以P1.0脚的中断我们不打开,只开P1.1-P1.7,所以

 //就是P1IE的bit置位是:1111 1110 =P1IE)
  P2DIR=0x00;//设置P2口方向寄存器,置0为输入,置1为输出
  P2IES|=BIT0+BIT1+BIT2+BIT3+BIT4;          //设置P2口中断边沿选择寄存器,置1为下跳沿,置0为上跳沿
  P2IE=0x1F;                                //设置P2中断使能寄存器,置1为允许中断,置0为禁止中断

(因为P2.5-P2.7他用,为了不影响我们的按键的判断,所以这些脚的中断我们不打开,只开P2.0-P2.4,所以就是P2IE的bit置位是:0001 1111 =P1IE)

 

I/O口的每一bit都可以单独设置,为了不影响其他管脚的工作,我们设定我们按键所需管脚的时候,都是使用位操作来设定相应的位,无关位保存原样,如:P2IES|=BIT0+BIT1+BIT2+BIT3+BIT4;只选择了P2.0-P2.4为下降沿触发,P2.5-P2.7保持原设置,否则容易相互干扰出错。
 

在头文件中我们可以找到P1口的中断向量集是:PORT1_VECTOR
                      P2口的中断向量集是:PORT2_VECTOR


 

所以中断函数可以写成:

 

#pragma vector=PORT1_VECTOR
__interrupt void PORT1_ISR (void)
{
  unsigned temp1;                          //局部变量:? //temp 暂时存放端口的中断标志寄存器中的值
                                           //temp 暂时存放端口的中断标志寄存器中的值
   delay(250000);                          // 消除抖动20ms延时(一般是10ms-20ms,看后面备注1)
    if ((P1IN&0xFE)!=0xFE)                 //如果有键按下

  {
    temp1=P1IFG;                           //temp1 记录中断标志
    switch(temp1)
    {
    case 1:
       draw_circle(400,300,cyclenum*15,0,0xec);   
       break;
    case 2:
       draw_circle(600,300,cyclenum*15,0,0xec);   
       break;
    case 4:
      break;
    case 8:
      break;
    case 16:
      break;
    case 32:
      break;
    case 64:
      break;
    case 128:
      break;
    //default: keyvaluep1=0;break;
    }
  }
  P1IFG=0X00; //清除中断标志,返回主程序
}
//以下是port2的中断服务程序
#pragma vector=PORT2_VECTOR
__interrupt void PORT2_ISR (void)
{
  unsigned char temp1;
 __delay_cycles(250000);            // 20MS消除抖动延时 备注1:
  if ((P2IN&0x1F)!=0x1F)              //仅使用了0、1、2、3、4脚所以与0x1F 

{
    temp1=P2IFG;
    switch(temp1)
    { case 1:
       程序1;

      break;
    case 2: 
        程序2;     

    break;
    case 4: 
        程序3;
      break;
    case 8:
      break;
    case 16:
      break;
    case 32:
      break;
    case 64:
      break;
    case 128:
      break;
    //default: keyvaluep2=0;break;
    }
  }
  P2IFG=0X00;
}

[page]

备注1:

   1、假如你的按键处理事件非常短,不做延时处理可能会判断有几次按键按下的可能!
按键也为机械接触开关,正常情况下,按一次按键,在按下瞬间,可能会有很多毛刺出现,就会有很多低平出现,所以要延时确认,即使没有这种情况,也要做延时处理,这样做是去干扰!正常情况下一个干扰脉冲也不可能会长达10-20MS.所以去干扰去抖动还是很有必要的。而这点时间对一个按键按下并不影响效果!

 

   2、易出错的地方:

     P1IES=0x01 或 P1IES=1    易被当成  P1IES=0xFF 。 P1IES=0x01  仅设置了P1.0   

   

 

 

相关资料:

 

  MSP430的端口有P1、P2、P3、P4、P5、P6、S和COM(型号不同,包含的端口也不仅相同,如MSP430X11X系列只有P1,P2端口,而MSP430X4XX系列则包含全部上述端口),它们都可以直接用于输入/输出。MSP430系统中没有专门的输入/输出指令,输入/输出操作通过传送指令来实现。端口P1`P6的每一位都可以独立用于输入/输出,即具有位寻址功能。常见的键盘接口可以直接用端口进行模拟,用查询或者中断方式控制。由于MSP430的端口只有数据口,没有状态口或控制口,在实际应用中,如在查询式输入/输出传送时,可以用端口的某一位或者几位来传送状态信息,通过查询对应位的状态来确定外设是否处于“准备好”状态。

      端口的功能。(1)P1,P2端口: I/O,中断功能,其他片内外设功能如定时器、比较器;(2)P3,P4P5P6端口:I/O,其他片内外设功能如SPI、UART模式,A/D转换等;(3)S,COM端口:I/O,驱动液晶。

       MSP430各端口具有丰富的控制寄存器供用户实现相应的操作。其中P1,P2具有7个寄存器,P3~P6具有4个寄存器。通过设置寄存器我们可以实现:(1)每个I/O位独立编程;(2)任意组合输入,输出和中断;(3)P1,P2所有8个位全部可以用作外部中断处理;(4)可以使用所以指令对寄存器操作;(5)可以按字节输入、输出,也可按位进行操作。

       端口P1,P2的功能可以通过它们的7个控制寄存器来实现。这里,Px代表P1或P2。

(1)PxDIR:输入/输出方向寄存器。 8位相互独立,可以分别定义8个引脚的输入/输出方向。8位再PUC后都被复位。使用输入/输出功能时,应该先定义端口的方向。作为输入时只能读,作为输出时,可读可写。0:输入模式;1:输出模式。如:P1DIR|=BIT4;   //P1.4输出 ,P2DIR=0XF0;   //高4位输出,低4位输入。

(2)PXIN:输入寄存器,为只读寄存器。用户不能对它进行写入,只能通过读取其寄存器的内容来知道I/O口的输入信号。所以其引脚的方向要选为输入。如再键盘键盘扫描程序中经常要读取行线或者列线的端口寄存器值来判断案件情况。例如:unsigned char key;

P1DIR&=~BIT4;   //P1.4输入

……

key=P1IN&0X10;   //输出端口P1.4的值

……

(3)PXOUT:输出寄存器。该寄存器为I/O端口的输出缓冲寄存器,再读取时输出缓存的内容与引脚方向定义无关。改变方向寄存器的内容,输出缓存的内容不受影响。如:PIOUT|=0X01;   //P1.0输出1 , PIOUT&=~0X01;   //P1.0输出0 。

(4)PXIFG:中断标志寄存器。他的8个标志位标志相应引脚是否有中断请求有待处理。0:无中断请求, 1:有中断请求。其中断标志分别为PXIFG.0~PXIFG.7。应该注意的是:PXIFG.0~PXIFG.7共用一个中断向量,为多源中断。当任一事件引起的中断进行处理时,PXIFG.0~PXIFG.7不会自动复位,必须由软件来判断是对哪一个事件,并将相应的标志复位。另外,外部中断事件的时间必须保持不低于1.5倍的MCLK时间,以保证中断请求被接受,且使相应中断标志位置位。

(5)PXIES:中断触发沿选择寄存器。如果允许PX口的某个引脚中断,还需定义该引脚的中断触发方式。0:上升沿触发使相应标志置位,1:下降沿触发相应标志置位。如:MOV.B #07H, &P1IES ;p1低3位下降沿触发中断。

(6)PXIE:中断使能寄存器。PX口的每一个引脚都有一位用以控制该引脚是否允许中断。0:禁止中断,1:允许中断。MOV.B #0E0H, &P2IE ;P2高3位允许中断。

(7)PXSEL:功能选择寄存器。P1,P2两端口还具有其他片内外设功能,将这些功能与芯片外的联系通过复用P1,P2引脚的方式来实现。PXSEL用来选择引脚的I/O端口功能与外围模块功能。0:选择引脚为I/O端口,1:选择引脚为外围模块功能。如:P1SEL|=0X10; //P1.4为外围模块功能。

       端口P3、P4、P5、P6没有中断能力,其余功能同PI,P2。除掉端口P1,P2与中断相关的3个寄存器,端口P3,P4,P5,P6的4个寄存器(用法同P1,P2)分别为PXDIR,PXIN,PXOUT,PXSEL可供用户使用。

      端口COM和S,他们实现与液晶片的直接接口。COM为液晶片的公共端,S为液晶片的段码端。液晶片输出端也可经软件配置为数字输出端口。

关键字:按键程序  PORT  中断程序 引用地址:按键程序 PORT中断程序

上一篇:MSP430的上拉电阻&I/O口的第二功能
下一篇:【IAR学习】学习笔记

推荐阅读最新更新时间:2024-03-16 14:38

MSP430F149按键检测程序
该程序由IAR编译运行,使用单片机的P1.0~P1.3口作为四个独立按键。由外部中断的下降沿触发。 /********************************************** *程序描述:单片机的P1.0~P1.3连接四个独立按键,外部中断下触发 *作者 :huasir *时间 :2017.10.28 22:10 ***********************************************/ #include msp430x14x.h #define keyin (P1IN & 0X0F) unsigned int KeyVal = 0; // 键值,0表示异常,1,2,3,4分
[单片机]
AVR单片机外部中断C程序框架
Avr mega16a 单片机在studio4 开发环境中外部中断C程序框架如下: #include avr/io.h //头文件. #include avr/interrupt.h //中断头文件; typedef unsigned char uint8; //习惯宏定义数据类型语法.应用时只需写入数据类型: // uint8 s=0; typedef unsigned int uint16; //习惯宏定义数据类型语法.应用时只需写入数据类型: // uint16 i=0; Int main() //主函数; { MCUCR=0Xnn: //中断模式触发寄存器,用来设置外部
[单片机]
PIC16C71单片机按键换醒CPU源程序
简介:本文给出PIC16C71单片机按键换醒CPU源程序,希望对感兴趣的朋友有所帮助。 ;p=pic16c71,xt=40000hz LISTP=16c71 ; ZEQU2 RBPUEQU7 TEMPEQU10H OPTIONREGEQU1H FEQU1 PORT_BEQU06H ; INCLUDE P16c71.INC LIST ; ORG0;复位地址 GOTOSTART ; ORG4;中断向量 GOTOSERVICEINTERRUPT ; START CALLINITPORT_B;初始化B口 LOOP SLEEP;省电睡眠,等待被唤醒
[单片机]
mini2440按键裸机程序编写运行
开发环境 操作系统:linux 开发板:mini2440 2.原理图 GPGCON控制寄存器地址: GPGCON控制寄存器功能说明: 3. 操作流程 (只需要操作GPGCON寄存器即可操作K1按键) a)设置控制寄存器GPGCON为输入功能:00 (即:可读取GPGDAT寄存器的值) //按键 unsigned long *GPGCON = 0x56000060; unsigned long *GPGDAT = 0x56000064; *GPGCON &= 0xffffc33c;//只用到4个按键GPG0 GPG3 GPG5 GPG6,功能设为00:输入功能 b)我们按下按键,想让对应的LED1
[单片机]
mini2440<font color='red'>按键</font>裸机<font color='red'>程序</font>编写运行
stc15单片机外部中断0程序(下降沿中断方式)
外部中断0(下降沿中断)实验步骤: 1、MINI USB连接线给开发板通电下载程序,下载软件中内部IRC时钟选择11.0592MHZ; 2、下载程序后,按下用户按键S3观察绿色指示灯有何变化; 3、原理图可知按键不按时IO口是高电平,故按下按键的瞬间在P32上产生下降沿,灯亮,而松开按键会产生上升沿,灯状态不翻转; 4、故按下一次按键,灯状态翻转一次(由亮变灭或由灭变亮)。 单片机源程序如下: /****************************************Copyright (c)**************************************************** **
[单片机]
单片机外部中断详解及程序
单片机在自主运行的时候一般是在执行一个死循环程序,在没有外界干扰(输入信号)的时候它基本处于一个封闭状态。比如一个电子时钟,它会按时、分、秒的规律来自主运行并通过输出设备(如液晶显示屏)把时间显示出来。在不需要对它进行调校的时候它不需要外部干预,自主封闭地运行。如果这个时钟足够准确而又不掉电的话,它可能一直处于这种封闭运行状态。但事情往往不会如此简单,在时钟刚刚上电、或时钟需要重新校准、甚至时钟被带到了不同的时区的时候,就需要重新调校时钟,这时就要求时钟就必须具有调校功能。因此单片机系统往往又不会是一个单纯的封闭系统,它有些时候恰恰需要外部的干预,这也就是外部中断产生的根本原由。 实际上在第二个示例演示中,就已经举过有按键输入的例子
[单片机]
S3C2410中断程序的实现
S3C2410(IRQ)中断处理过程: 在此要注意的是区别中断向量表和异常向量表。中断发生后总是从IRQ 或者FIQ 异常入口处进入,然后跳转到相应的异常处理程序处执行,这个异常处理程序一般都是进行查找中断向量表的操作,然后调用中断处理程序。 以下是在应用中中断处理实现的过程:从中不难体会到中断的处理过程。 定义中断向量表的物理地址: 代码 .equ pISR_DABORT , (_ISR_STARTADDRESS+0x10) .equ pISR_RESERVED, (_ISR_STARTADDRESS+0x14) .equ pISR_IRQ , (_ISR_STARTA
[单片机]
μC/OS—II下中断服务程序和外设驱动的开发
在嵌入式应用中,使用RTOS的主要原因是为了提高系统的可靠性,其次是提高开发效率、缩短开发周期。 μC/OS-II是一个占先式实时多任务内核,使用对象是嵌入式系统,对源代码适当裁减,很容易移植到8~32位不同框架的微处理器上。但μC/OS-II仅是一个实时内核,它不像其他实时操作系统(如嵌入式Linux)那样提供给用户一些API函数接口。在μC/OS-II实时内核下,对外设的访问接口没有统一完善,有很多工作需要用户自己去完成。串口通信是单片机测控系统的重要组成部分,异步串行口是一个比较简单又很具代表性的中断驱动外设。本文以单片机中的串口为例,介绍μC/OS—II下编写中断服务程序以及外设驅动程序的一般思路。 1 μC/OS-I
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved