基于MSP430高效LED驱动程序部分精编.docx
《基于MSP430高效LED驱动程序部分精编.docx》由会员分享,可在线阅读,更多相关《基于MSP430高效LED驱动程序部分精编.docx(17页珍藏版)》请在冰豆网上搜索。
![基于MSP430高效LED驱动程序部分精编.docx](https://file1.bdocx.com/fileroot1/2023-7/8/9e884589-65b5-45a7-94dc-48d819fc8d77/9e884589-65b5-45a7-94dc-48d819fc8d771.gif)
基于MSP430高效LED驱动程序部分精编
//********************************************************************
//基于tps61040的led
//********************************************************************
#include"msp430x14x.h"
#include"BoardConfig.h"
#include"1602.c"
#definekeyin(P1IN&0x0f)
#defineN10
//***********************************************************************
//端口的初始化
//***********************************************************************
voidPort_Init()
{
P1SEL=BIT6+BIT7;
P1DIR=BIT6+BIT7;
P1IES=BIT0+BIT1+BIT2+BIT3;
P1IE=BIT0+BIT1+BIT2+BIT3;
P2DIR=BIT0;
P2OUT=0x7e;
//P6IN=BIT0;
P6DIR=0xfe;
P6OUT=0xfe;
}
//*********************************************************************
//变量定义
//*********************************************************************
uintResults[32];
uintAverage;
staticucharFlag=0;//标志变量
uintTEMP=0;//ADC值暂存变量
uinttemp,A1,A2,A3,A4,A5,A6,A7;//定义的变量,显示数据处理
volatileuintCount=0,a=0,b=0;//步进计数
intBujin[N]={29,27,25,21,19,17,15,11,9};
intBujin_test[30]={23,67,110,149,186,200,24};//步进3mA
//uintLedwei[N]={0xff,0xfd,0xf9,0xf1,0xe1,0xc1,0x80,0x01};
intBujin1[30]={23,37,52,67,81,94,108,122,136,149,160,173,187};
unsignedintwidth[10]={0,0,0,0,0,0,0,0,0,0};//TB使用
unsignedinti=0;//TB使用
//******************************************************************
//延时去抖
//*********************************************************************
voiddelay(uintt)//延时
{
while(t--);
}
/*
voiddelay_key(void)//按键去抖延时
{
uinttmp;
uchari;
for(i=7;i>0;i--)
{
for(tmp=12000;tmp>0;tmp--);
}
}
*/
//TB初始化
voidTB_Init(void)
{
P4SEL|=BIT0;
BCSCTL1&=~XT2OFF;
do
{
IFG1&=~OFIFG;
for(i=256;i>0;i--);
}
while((IFG1&OFIFG)!
=0);
BCSCTL2=SELM_2+SELS;
TBCCTL0&=~(CCIS1+CCIS0);
TBCCTL0|=CM_2+SCS+CAP;
TBCCTL0|=CCIE;
TBCTL|=ID_3;
TBCTL|=TBSSEL_2;
TBCTL|=TBCLR;
TBCTL|=MC_2;
_EINT();
}
//*******************************************************************
//TA12
//*********************************************************************
voidTA12PWM(uintTA0,uintTA1,uintTA2)//TA12控制函数
{
TACTL|=MC_1+TASSEL_1;
TACCTL1=OUTMOD_7;
TACCTL2=OUTMOD_7;
TACCR0=TA0;
TACCR1=TA1;
TACCR2=TA2;
}
//***********************************************************************
//AD采样显示
//***********************************************************************
voidLCD_DisplayADC()
{
LCD_write_char(0x0b,0,0x30+A1);
LCD_write_char(0x0c,0,0x30+A2);
LCD_write_char(0x0d,0,0x30+A3);
LCD_write_char(0x0e,0,0X30+A4);
}
voidLCD_DisplayVoltage()
{
LCD_write_char(0x0b,1,0x30+A5);
LCD_write_char(0x0c,1,'.');
LCD_write_char(0x0d,1,0x30+A6);
LCD_write_char(0x0e,1,0X30+A7);
LCD_write_char(0x0f,1,'V');
}
//*************************************************************************
//数字量显示处理函数
//*************************************************************************
voidData_do(uinttemp_d)
{
uinttemp_1,temp_2;
A1=temp_d/1000;//分出千,百,十,和个位
temp_1=temp_d%1000;
A2=temp_1/100;
temp_2=temp_1%100;
A3=temp_2/10;
A4=temp_2%10;
}
//*************************************************************************
//电压数据显示处理函数
//*************************************************************************
voidVoltage_do(uinttemp_d)
{
uinttemp_1,temp_2;
ulongtemp_3;
temp_3=(ulong)(temp_d)*250;//转换公式,ADC数字量转换为电压大小,注意数据类型
temp_d=temp_3/4095;//12位精度,除以4095
A5=temp_d/100;//分出百,十,和个位
temp_1=temp_d%100;
A6=temp_1/10;
temp_2=temp_1%10;
A7=temp_2;
}
//*************************************************************************
//ADC初始化程序,用于配置ADC相关寄存器
//*************************************************************************
voidADC_Init()
{
P6SEL|=0x01;//选择ADC通道
ADC12CTL0|=ADC12ON+SHT0_15+REF2_5V+REFON;//ADC电源控制开,16个CLK,内部基准2.5V
ADC12CTL1|=ADC12SSEL1+ADC12SSEL0;//SMCLK做时钟源
ADC12MCTL0=SREF0+INCH_0;//参考控制位及通道选择,这里选择通道0
ADC12IE|=0x01;//中断允许
ADC12CTL0|=ENC;//使能转换器
}
//*************************************************************************
//按键中断执行函数
//****************************************************************************
voidP10_key(void)
{
Count++;
TA12PWM(199,Bujin_test[Count],Bujin_test[Count]);
if(Count==6)
Count=0;
P6OUT=0xef;
//if(Count==4)
//P16DIR=0x
//TACCR0=65;//32.768500KHZ
//P6OUT=Ledwei[Count];
}
voidP11_key(void)
{
a++;
TA12PWM(199,Bujin[a],Bujin[Count]);
if(a==3)
P6OUT=0xff;
if(a==6)
P6OUT=0xef;
//TACCR0=65;//32.768500KHZ
//P6OUT=Ledwei[Count];
}
voidP12_key(void)
{
TA12PWM(199,16,17);
P6OUT=0xef;
delay_ms(1000);
//TA12PWM(199,15,17);
delay_ms(1000);
//TA12PWM(199,14,17);
delay_ms(1000);
delay_ms(1000);
delay_ms(1000);
TA12PWM(199,15,17);
P6OUT=0xff;
delay_ms(1000);
TA12PWM(199,12,17);
delay_ms(1000);
TA12PWM(199,11,17);
//TA12PWM(199,6,17);
delay_ms(1000);
TA12PWM(199,7,17);
delay_ms(1000);
TA12PWM(199,5,17);
delay_ms(3000);
TA12PWM(199,2,17);
delay_ms(5000);
TA12PWM(199,0,17);
}
voidP13_key(void)
{
b++;
TA12PWM(199,Bujin1[b],Bujin1[Count]);
}
//*************************************************************************
//ADC中断服务程序
//*************************************************************************
/*
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
ucharj;
while((ADC12CTL1&0x01)==1);//如果ADC忙,则等待,否则读取ADC转换数值
Flag=1;
TEMP=ADC12MEM0;//读取ADC转换值
Data_do(TEMP);//处理ADC值,用于显示,数字量
Voltage_do(TEMP);//处理ADC值,用于显示,模拟电压值
for(j=0;j<15;j++)
{
LCD_DisplayADC();//显示ADC的数据,ADC数字量
LCD_DisplayVoltage();//显示ADC的电压值
}
}
*/
/*
#pragmavector=ADC_VECTOR
__interruptvoidADC12ISR(void)
{
staticucharindex=0;
uchari;
Results[index++]=ADC12MEM0;//Moveresults,IFGiscleared
if(index==31)
{
//uchari;
Average=0;
for(i=0;i<32;i++)
Average+=Results[i];
Average>>=5;//除以32求平均值
index=0;
_BIC_SR_IRQ(LPM0_bits);//ClearLPM0
}
Data_do(width[1]);//处理ADC值,用于显示,数字量
Voltage_do(width[1]);//处理ADC值,用于显示,模拟电压值
for(i=0;i<15;i++)
{
LCD_DisplayADC();//显示ADC的数据,ADC数字量
LCD_DisplayVoltage();//显示ADC的电压值
}
}
*/
//*************************************************************************
//P1中断服务函数
//************************************************************************
#pragmavector=PORT1_VECTOR//p1中断
__interruptvoidPORT1_ISR(void)
{
//volatileuintCount=1;
if(P1IFG&0x0f)
{
switch(P1IFG)
{
case0x01:
if(keyin==0x0e)
{
delay_ms(7);
if(keyin==0x0e)
{
//while(keyin!
=0x0f);
P10_key();
//TA12PWM(199,89,199);
//delay_ms(2000);
P1IFG=0;
return;
}
}
case0x02:
if(keyin==0x0d)
{
delay_ms(7);
if(keyin==0x0d)
{
//while(keyin!
=0x0f);
P11_key();
//TA12PWM(199,159,199);
//delay_ms(2000);
P1IFG=0;
return;
}
}
case0x04:
if(keyin==0x0b)
{
delay_ms(7);
if(keyin==0x0b)
{
//while(keyin!
=0x0f);
P12_key();
//delay_ms(2000);
P1IFG=0;
return;
}
}
case0x08:
if(keyin==0x07)
{
delay_ms(7);
if(keyin==0x07)
{
//while(keyin!
=0x0f);
P13_key();
//delay_ms(2000);
P1IFG=0;
return;
}
}
default:
while(keyin!
=0x0f);//等待按键放开
P1IFG=0;
return;
}
}
P1IFG=0;
}/*
//定时器TB的CCR0的中断:
用于检测脉冲上升与下降沿
#pragmavector=TIMERB0_VECTOR
__interruptvoidTimerB0(void)
{
if(TBCCTL0&CM1)
{
TBCTL|=TBCLR;
TBCCTL0=(TBCCTL0&(~CM1))|CM0;
}
elseif(TBCCTL0&CM0)
{
width[i++]=TBCCR0;
TBCCTL0=(TBCCTL0&(~CM0))|CM1;
if(i==10)i=0;
}
}
*/
//***********************************************************************
//main主程序
//***********************************************************************
voidmain(void)
{
WDT_Init();//看门狗初始化
Clock_Init();//时钟初始化
Port_Init_1602();//1602端口初始化,用于控制IO口输入或输出
Port_Init();//端口的初始化
ADC_Init();//初始化ADC配置
delay_ms(100);//延时100ms
LCD_init();//液晶参数初始化设置
LCD_clear();//清屏
LCD_Desk();
_EINT();//使能中断
Flag=1;//标志位先置1
//TB_Init();
TA12PWM(199,Bujin_test[0],Bujin_test[7]);
//P4SEL|=BIT0;
//BCSCTL1&=~XT2OFF;//打开XT2振荡器
P6OUT=0xef;
while
(1)
{
//P6OUT=Ledwei[Count];
//inti=9;
/*
while(Flag==1)
{
ADC12CTL0|=ADC12SC;//开启转换
ADC12CTL0&=~ADC12SC;//清零
Flag=0;//清零标志位
}
Data_do(width[1]);//处理ADC值,用于显示,数字量
Voltage_do(width[1]);//处理ADC值,用于显示,模拟电压值
for(i=0;i<15;i++)
{
LCD_DisplayADC();//显示ADC的数据,ADC数字量
LCD_DisplayVoltage();//显示ADC的电压值
}
*/
}
//}
}