标题:
MSP430用I2C扩展键,编程实现8个LED灯的流水点亮,点亮时间由定时器确定,长短用键...
[打印本页]
作者:
1998年
时间:
2019-5-15 15:42
标题:
MSP430用I2C扩展键,编程实现8个LED灯的流水点亮,点亮时间由定时器确定,长短用键...
利用I2C扩展键,编程实现8个LED灯的流水点亮,点亮时间由定时器确定,长短用键盘可调。
单片机源程序如下:
#include "MSP430G2553.h"
void P1_IODect();
void P13_Onclick();
void GPIO_init();
void WDT_init();
void Timer1_init();
void Timer1_ISR();
void main(void) {
WDTCTL = WDTPW + WDTHOLD; //关狗
GPIO_init();
WDT_init();
Timer1_init();//初始化timer1
_enable_interrupts(); //使能总中断
_bis_SR_register(LPM3_bits+GIE); //LPM0方式休眠
}
void GPIO_init()
{
//-----配合机械按键,启用内部上拉电阻-----
P1DIR|=BIT0; //启用P1.3内部上下拉电阻
P1OUT|=BIT0;//LED输出 P1.6
P2DIR|=BIT4;
P2SEL|=BIT4;//PWM输出 P2.4
P2DIR&=~BIT2;
P2SEL|=BIT2;//捕获模式,要善于查捕获IO口//将电阻设置为上拉
//-----配置P1.3中断参数-----
P1REN|=BIT3;//电阻使能寄存器
P1OUT|=BIT3;
P1DIR&=~BIT3;//设为输入(可省略)
}
void WDT_init()
{
WDTCTL=WDT_ADLY_16;
IE1|=WDTIE;//WDT中断开关
}
void Timer1_init()
{
//通道1控制寄存器,捕获通道
TA1CCTL1=CAP+CCIE+CM_3+CCIS_1+SCS;//捕获,中断分开关,测脉宽需上升和下降沿均捕获
//通道2控制寄存器,比较通道
TA1CCTL2=OUTMOD_6;
TA1CCR0 = 32700;//将近1秒,使肉眼可见
TA1CCR2 = 16000;
//设置主定时器,主定时器增计数,增减模式周期可调
TA1CTL =TASSEL_1+MC_1+TACLR;//主定时器工作模式设定,捕获比较功能打开
}
//Timer1中断函数,多中断源合用
#pragma vector=TIMER1_A1_VECTOR//中断向量
__interrupt void TIMER1_A1(void)//名称任取,可读性强
{
switch(TA1IV)//中断向量寄存器
{
case TA1IV_TACCR1:Timer1_ISR();
break;
default:break;
}
}
void Timer1_ISR()
{
volatile unsigned int width=0;
static unsigned int pwm_start=0;
unsigned int pwm_end=0;
//读取电平读取上升下降沿,通过寄存器读取状态
if(TA1CCTL1&CCI)//高电平
{
pwm_start=TA1CCR1;//捕获值放到变量中,捕获完成
P1OUT|=BIT0;//LED点亮显示高电平
}
else if(TA1CCTL1&COV==2) TA1CCTL1 &=~COV;//判断溢出
else
{
pwm_end =TA1CCR1;
width=pwm_end-pwm_start;//高电平脉宽
P1OUT&=~BIT0;//LED显示低电平
pwm_start=0;
pwm_end=0;//变量清零
_bis_SR_register(LPM0_bits+GIE);
}
TA1CCTL1&=~COV;
}
void P1_IODect()
{
unsigned int Push_Key=0;
//-----排除输出IO的干扰后,锁定唯一被触发的中断标志位-----
Push_Key=P1IFG&(~P1DIR);
//-----延时一段时间,避开机械抖动区域-----
__delay_cycles(10000); //消抖延时
//----判断按键状态是否与延时前一致-----
if((P1IN&Push_Key)==0&&Push_Key==BIT3) //如果该次按键确实有效
P13_Onclick();
}
void P13_Onclick() //P1.3的事件处理函数
{
//-----Bright在函数执行完后不能被清空,所以得设为静态局部变量-----
static unsigned int temp=16000;
TA1CCR2+=4000;
temp=TA1CCR2;
if(temp>=32700)
TA1CCR2=0;
}
#pragma vector = WDT_VECTOR//中断向量
__interrupt void WDT_ISR(void)//名称任取,可读性强
{
P1_IODect();
}
复制代码
所有资料51hei提供下载:
4_2.zip
(38.77 KB, 下载次数: 6)
2019-5-15 15:42 上传
点击文件名下载附件
下载积分: 黑币 -5
欢迎光临 (http://www.51hei.com/bbs/)
Powered by Discuz! X3.1