找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 3883|回复: 1
收起左侧

MSP430用I2C扩展键,编程实现8个LED灯的流水点亮,点亮时间由定时器确定,长短用键...

[复制链接]
ID:538816 发表于 2019-5-15 15:42 | 显示全部楼层 |阅读模式
利用I2C扩展键,编程实现8个LED灯的流水点亮,点亮时间由定时器确定,长短用键盘可调。

单片机源程序如下:
  1. #include "MSP430G2553.h"
  2. void P1_IODect();
  3. void P13_Onclick();
  4. void GPIO_init();
  5. void WDT_init();
  6. void Timer1_init();
  7. void Timer1_ISR();

  8. void main(void) {
  9.         WDTCTL = WDTPW + WDTHOLD;        //关狗
  10.         GPIO_init();
  11.         WDT_init();
  12.         Timer1_init();//初始化timer1
  13.         _enable_interrupts();                                                        //使能总中断
  14.         _bis_SR_register(LPM3_bits+GIE);                                //LPM0方式休眠
  15. }
  16. void GPIO_init()
  17. {
  18.         //-----配合机械按键,启用内部上拉电阻-----
  19.         P1DIR|=BIT0;                                        //启用P1.3内部上下拉电阻
  20.         P1OUT|=BIT0;//LED输出 P1.6
  21.         P2DIR|=BIT4;
  22.         P2SEL|=BIT4;//PWM输出 P2.4
  23.         P2DIR&=~BIT2;
  24.         P2SEL|=BIT2;//捕获模式,要善于查捕获IO口//将电阻设置为上拉
  25.         //-----配置P1.3中断参数-----
  26.         P1REN|=BIT3;//电阻使能寄存器
  27.         P1OUT|=BIT3;
  28.         P1DIR&=~BIT3;//设为输入(可省略)
  29. }
  30. void WDT_init()
  31. {
  32.         WDTCTL=WDT_ADLY_16;
  33.         IE1|=WDTIE;//WDT中断开关
  34. }
  35. void Timer1_init()
  36. {
  37.         //通道1控制寄存器,捕获通道
  38.         TA1CCTL1=CAP+CCIE+CM_3+CCIS_1+SCS;//捕获,中断分开关,测脉宽需上升和下降沿均捕获
  39.         //通道2控制寄存器,比较通道
  40.         TA1CCTL2=OUTMOD_6;
  41.         TA1CCR0 = 32700;//将近1秒,使肉眼可见
  42.         TA1CCR2 = 16000;
  43.         //设置主定时器,主定时器增计数,增减模式周期可调
  44.         TA1CTL =TASSEL_1+MC_1+TACLR;//主定时器工作模式设定,捕获比较功能打开
  45. }
  46. //Timer1中断函数,多中断源合用
  47. #pragma vector=TIMER1_A1_VECTOR//中断向量
  48. __interrupt  void TIMER1_A1(void)//名称任取,可读性强
  49. {
  50.         switch(TA1IV)//中断向量寄存器
  51.         {
  52.         case TA1IV_TACCR1:Timer1_ISR();
  53.                                   break;       
  54.         default:break;
  55.         }

  56. }

  57. void Timer1_ISR()
  58. {
  59.         volatile unsigned int width=0;
  60.         static unsigned int pwm_start=0;
  61.         unsigned int pwm_end=0;
  62.         //读取电平读取上升下降沿,通过寄存器读取状态

  63.         if(TA1CCTL1&CCI)//高电平
  64.         {
  65.                 pwm_start=TA1CCR1;//捕获值放到变量中,捕获完成
  66.                 P1OUT|=BIT0;//LED点亮显示高电平
  67.         }
  68.         else if(TA1CCTL1&COV==2)  TA1CCTL1 &=~COV;//判断溢出
  69.                 else
  70.                 {
  71.                         pwm_end =TA1CCR1;
  72.                         width=pwm_end-pwm_start;//高电平脉宽
  73.                         P1OUT&=~BIT0;//LED显示低电平
  74.                         pwm_start=0;
  75.                         pwm_end=0;//变量清零
  76.                         _bis_SR_register(LPM0_bits+GIE);
  77.                 }
  78.         TA1CCTL1&=~COV;
  79. }

  80. void P1_IODect()
  81. {
  82.         unsigned int Push_Key=0;
  83.         //-----排除输出IO的干扰后,锁定唯一被触发的中断标志位-----
  84.         Push_Key=P1IFG&(~P1DIR);
  85.         //-----延时一段时间,避开机械抖动区域-----
  86.         __delay_cycles(10000);                                                        //消抖延时
  87.         //----判断按键状态是否与延时前一致-----
  88.         if((P1IN&Push_Key)==0&&Push_Key==BIT3)                                 //如果该次按键确实有效
  89.           P13_Onclick();
  90. }

  91. void P13_Onclick()                                                                        //P1.3的事件处理函数
  92. {
  93.         //-----Bright在函数执行完后不能被清空,所以得设为静态局部变量-----
  94.         static unsigned int temp=16000;
  95.                 TA1CCR2+=4000;
  96.                 temp=TA1CCR2;
  97.                 if(temp>=32700)
  98.                    TA1CCR2=0;
  99.         }

  100. #pragma vector = WDT_VECTOR//中断向量
  101. __interrupt void WDT_ISR(void)//名称任取,可读性强
  102. {
  103.         P1_IODect();
  104. }

复制代码

所有资料51hei提供下载:
4_2.zip (38.77 KB, 下载次数: 6)

评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

回复

使用道具 举报

ID:547542 发表于 2019-5-26 14:48 | 显示全部楼层
此帖仅作者可见

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

快速回复 返回顶部 返回列表