网上关于单片机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:初始化中断使能标记;
-
void InitIO(void)
-
{
-
P0INP |= 0X40; //P0_6(open) 设置为three state
-
// P0IEN |= 0X40; //P0_6(open) 设置为中断方式
-
-
P0SEL&=~0x08;
-
P0DIR|=0x08;
-
-
//-------for IR test--------//
-
// P0SEL &= ~0x80; //P0_7设置为通用IO
-
P0INP |= 0x80; //P0_7设置为三态
-
// P0DIR &= 0x7F; //P0_7设置为输入
-
// P2INP &=~ 0x20; //p0 port pull up
-
// P2INP |= 0X20; //p0 port pull down
-
// P0INP &= 0x7F; //上拉、下拉电阻
-
// P0IEN |= 0x80; //P0_7设置为中断使能
-
//--------------------------//
-
-
// PICTL |= 0X01; //P0 下降沿触发
-
// PICTL &=~0X01; //改成上升沿
-
// EA = 1;
-
// IEN1 |= 0X20; // P0设置为中断方式;
-
-
// P0IFG = 0x00; //初始化中断标志位
-
}
如果是中断方式操作IO,下面就是中断服务程序:
很简单,判断中断标志寄存器对应的位是否使能,是的话就执行对应操作,ISR要尽量简单。
-
#pragma vector = P0INT_VECTOR
-
__interrupt void P0_ISR(void)
-
{
-
if(P0IFG>0) //按键中断
-
{
-
if (P0IFG&0x80)
-
{
-
P0_3=!P0_3;
-
}
-
if (P0IFG&0x40)
-
{
-
P0_3=!P0_3;
-
}
-
P0IFG = 0;
-
}
-
P0IF = 0; //清中断标志
-
}
如果是轮询,那就写个死循环吧:
-
void main(void)
-
{
-
InitIO(); //初始化LED灯控制IO口
-
while(1) //死循环
-
{
-
if (P0_7 == 1)
-
{
-
P0_3 = 0;
-
}
-
else
-
{
-
P0_3 = 1;
-
}
-
-
if (P0_6 == 0)
-
{
-
P0_3 = !P0_3;
-
}
-
-
Delay(10000);
-
-
}
阅读(4848) | 评论(0) | 转发(0) |