打印

MSP430--数字IO 流水灯程序

[复制链接]
798|8
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
春风的暖暖|  楼主 | 2015-9-30 20:59 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
1.数字IO共有6组,其中P1,P2可以设置外部中断。
2.通用寄存器:
PxIN,PxOUT,PxDIR,PxSEL
   上电默认PxDIR为0,即默认为输入。PxSEL若为1,则表示数字IO用作外设功能,这时候P1或P2的中断功能丢失。
3.P1的寄存器:每个地址对应8位寄存器,对应IO的8个PIN.
    026h P1SEL  
    025h P1IE: 中断使能  
    024h P1IES:中断响应上升沿变化(0),响应下降沿变化(1)  
    023h P1IFG:中断发生就置位为1,中断执行后要手动清除  
    022h P1DIR  
    021h P1OUT  
    020h P1IN read only  


相关帖子

沙发
春风的暖暖|  楼主 | 2015-9-30 21:00 | 只看该作者
4.流水灯电路:P2端口输出低电平时二极管发光。P2DIR=0XF8,对应表示P27-P23均为输出,若这时P2OUT=0XFF,则L1-L5都会亮。

5.流水灯程序:实现流水灯以三种流动方式和四种流动速度的不同组合而进行点亮"流动"
    #include  <msp430x14x.h>  
      
      
    typedef unsigned int  uint;  
      
      
    uint i = 0,j = 0,dir = 0;  
    uint flag = 0,speed = 0;  //flag--灯光流动方式,speed--灯光流动速度  
      
      
    /****************主函数****************/  
    void main(void)  
    {  
        
        /*给IO一个初始的状态*/  
        P1DIR = 0XFF;P1OUT = 0XFF;  
        P2DIR = 0XFF;P2OUT = 0XFF;  
        P3DIR = 0XFF;P3OUT = 0XFF;  
        P4DIR = 0XFF;P4OUT = 0XFF;  
        P5DIR = 0XFF;P5OUT = 0XFF;  
        P6DIR = 0XFF;P6OUT = 0XFF;  
        
        WDTCTL = WDTPW + WDTHOLD;       //关闭看门狗  
        P6DIR |= BIT2;P6OUT |= BIT2;    //关闭电平转换  
        P5OUT &= ~BIT7;  
         
        CCTL0 = CCIE;                   //使能CCR0中断  
        CCR0 = 50000;  
        TACTL = TASSEL_2 + ID_3 + MC_1; //定时器A的时钟源选择SMCLK,增计数模式  
        P2DIR = 0xff;                   //设置P2口方向为输出  
        P2OUT = 0xff;  
      
        _EINT();                        //使能全局中断  
        LPM0;                           //CPU进入LPM0模式  
    }  
      
      
    /*******************************************
    函数名称:Timer_A  
    功    能:定时器A的中断服务函数,在这里通过标志
              控制流水灯的流动方向和流动速度
    参    数:无
    返回值  :无
    ********************************************/  
    #pragma vector = TIMERA0_VECTOR  
    __interrupt void Timer_A (void)  
    {   
        if(flag == 0)  
        {  
            P2OUT = ~(0x80>>(i++));    //灯的点亮顺序D8 -> D1  
        }  
        else if(flag == 1)  
        {  
            P2OUT = ~(0x01<<(i++));    //灯的点亮顺序D1 -> D8  
        }  
        else   
        {  
            if(dir)                  //灯的点亮顺序D8->D1,D1->D8,循环绕圈                          
            {  
                P2OUT = ~(0x80>>(i++));  
            }  
            else  
            {  
                P2OUT = ~(0x01<<(i++));  
            }  
        }  
        
        if(i == 8)   
        {  
            i = 0;  
            dir = ~dir;  
        }  
        
        j++;  
        if(j == 40) //循环5次就改变flag改变流动方向  
        {  
            i = 0;  
            j = 0;  
            flag++;  
            if(flag == 4) flag = 0;  
            switch(speed)  
            {  
            case 0:  
                TACTL &=~ (ID0 + ID1);  
                TACTL |= ID_3;  
                break;  
            case 1:  
                TACTL &=~ (ID0 + ID1);  
                TACTL |= ID_2;  
                break;  
            case 2:  
                TACTL &=~ (ID0 + ID1);  
                TACTL |= ID_1;  
                break;  
            case 3:  
                TACTL &=~ (ID0 + ID1);  
                TACTL |= ID_0;  
                break;  
            default:  
                break;  
            }  
            if(flag != 3)   speed++;  
            if(speed == 4) speed = 0;  
        }   
    }  

使用特权

评论回复
板凳
houjiakai| | 2015-9-30 23:04 | 只看该作者
谢谢分享。

使用特权

评论回复
地板
houjiakai| | 2015-9-30 23:04 | 只看该作者
还不错。

使用特权

评论回复
5
迪卡| | 2015-10-12 20:11 | 只看该作者
   026h P1SEL  
    025h P1IE: 中断使能  
    024h P1IES:中断响应上升沿变化(0),响应下降沿变化(1) ......

这是什么

使用特权

评论回复
6
蜕变吧| | 2015-10-30 09:20 | 只看该作者
流水灯都做的这么细致,佩服。

使用特权

评论回复
7
mmbs| | 2015-10-31 15:07 | 只看该作者
流水灯,c程序实现更简单一些。

使用特权

评论回复
8
lihuami| | 2015-10-31 16:12 | 只看该作者
这个流水灯执行花样太少

使用特权

评论回复
9
lihuami| | 2015-10-31 16:13 | 只看该作者
建议存成数组然后执行流水灯。

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

37

主题

306

帖子

2

粉丝