Chinaunix首页 | 论坛 | 博客
  • 博客访问: 60661
  • 博文数量: 19
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 107
  • 用 户 组: 普通用户
  • 注册时间: 2015-08-27 09:53
文章分类

全部博文(19)

分类: 嵌入式

2015-09-17 17:41:35

网上关于单片机IO口基本操作的文章很多,其实单片机操作也是大同小异,所以在这里新开一文只是对这两天工作的一个记录,方便以后查询。

PS: 当然了,早在五年之前读研的时候就做IO轮询和中断的实验了,时隔五年还来写这种文章,真是没有长进!

再PS: 折腾了两天一直以为程序哪里写错了或者没有设置好,最后发现是两块板子没有共地,电平漂了

单片机的IO操作,主要就是设置几个控制寄存器,对于CC2530来说,就是PxDIR PxSEL PxINP PxIFG PICTL 和PxIEN.

下面开始贴代码,P0_6 P0_7做输入,P0_3做输出:

首先是通过P0SEL设置IO功能,到底是通用IO还是外设,
然后是通过P0DIR设置方向,也就是输入输出,对于设置为输入的,还需要通过P0INP设置输入模式,三态、上拉、下拉
如果是轮询,这就OK啦,但是对于中断,还要再增加几个寄存器设置:
P0IEN:分别设置P0口每个IO口中断使能;
PICTL:端口的中断配置,选择上升沿还是下降沿中断;
EA:总中断;
IEN1:设置整个P0口为中断方式;
P0IFG:初始化中断使能标记;

点击(此处)折叠或打开

  1. void InitIO(void)
  2. {
  3.   P0INP |= 0X40; //P0_6(open) 设置为three state
  4.   // P0IEN |= 0X40; //P0_6(open) 设置为中断方式
  5.   
  6.   P0SEL&=~0x08;
  7.   P0DIR|=0x08;

  8.     //-------for IR test--------//
  9.   // P0SEL &= ~0x80; //P0_7设置为通用IO
  10.   P0INP |= 0x80; //P0_7设置为三态
  11.   // P0DIR &= 0x7F; //P0_7设置为输入
  12.   // P2INP &=~ 0x20; //p0 port pull up
  13.   // P2INP |= 0X20; //p0 port pull down
  14.   // P0INP &= 0x7F; //上拉、下拉电阻
  15.   // P0IEN |= 0x80; //P0_7设置为中断使能
  16.   //--------------------------//

  17.   // PICTL |= 0X01; //P0 下降沿触发
  18.   // PICTL &=~0X01; //改成上升沿
  19.   // EA = 1;
  20.   // IEN1 |= 0X20; // P0设置为中断方式;

  21.   // P0IFG = 0x00; //初始化中断标志位
  22. }
如果是中断方式操作IO,下面就是中断服务程序:
很简单,判断中断标志寄存器对应的位是否使能,是的话就执行对应操作,ISR要尽量简单。

点击(此处)折叠或打开

  1. #pragma vector = P0INT_VECTOR
  2.  __interrupt void P0_ISR(void)
  3.  {
  4.         if(P0IFG>0) //按键中断
  5.         {
  6.           if (P0IFG&0x80)
  7.           {
  8.             P0_3=!P0_3;
  9.           }
  10.           if (P0IFG&0x40)
  11.           {
  12.             P0_3=!P0_3;
  13.           }
  14.           P0IFG = 0;
  15.         }
  16.         P0IF = 0; //清中断标志
  17.  }
如果是轮询,那就写个死循环吧:

点击(此处)折叠或打开

  1. void main(void)
  2. {
  3.     InitIO();        //初始化LED灯控制IO口    
  4.     while(1) //死循环
  5.     {
  6.     if (P0_7 == 1)
  7.     {
  8.       P0_3 = 0;
  9.     }
  10.     else
  11.     {
  12.       P0_3 = 1;
  13.     }

  14.     if (P0_6 == 0)
  15.     {
  16.       P0_3 = !P0_3;
  17.     }

  18.     Delay(10000);
  19.            
  20.     }





阅读(4769) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~