📄 430_dac.c
字号:
//已经调试通过 南京航空航天大学 魏小龙
//DAC TEST TLV6520
////开发板在第一第二DAC通道连接了双色发光二极管,
//本演示程序通过TLV5620循环输出:红色逐渐亮起来、绿色逐渐亮起来、黄色逐渐亮起来
//*****************************************************************************
#include <msp430x44x.h>
#define uchar unsigned char
#define uint unsigned int
uchar key_buffer;
uchar key_long;
uchar dac5620_ch=0;
unsigned char disbuffer[8]={0,1,3,8,0xf,5,0x18,7};
char digit[20] = {1,0,0,0,0,2,1,8
};
char distab[]={ 0xaf,0x06,0x6d,0x4f,
0xc6,0xcb,0xeb,0x0e,
0xef,0xcf, 0x77,0x7c,
0x39,0x5e,0x79,0x71
};
unsigned char seg[]={0x3f,0x06,0x5b,0x4f,
0x66,0x6d,0x7d,0x07,
0x7f,0x6f,0x77,0x7c,
0x39,0x5e,0x79,0x71,
0xbf,0x86,0xdb,0xcf,
0xe6,0xed,0xfd,0x87,
0xff,0xef,0xf7,0xfc,
0xb9,0xde,0xf9,0xf1,
0x80,0x40,0x00,0x73,0xc0};
char dac=160;
void delay(int v)
{
while(v!=0)v--;
}
void disp(void)
{
unsigned char i=0,j=0;
unsigned char temp_wei=0x04,temp_duan=0;
// P1IE=0X0;
P1DIR = 0x1f;
for(i=0;i<8;i++)
{
P1OUT &= ~BIT3;
temp_duan=seg[disbuffer[i]] ;
for(j=0;j<8;j++)
{
if(temp_duan&0x80)
P1OUT |= BIT0;
else
P1OUT &= ~BIT0;
temp_duan=temp_duan<<1;
P1OUT &= ~BIT4; P1OUT |= BIT4;
}
P1OUT = (P3IN&0xf8) | temp_wei;
P1OUT |= BIT3;
temp_wei++;
delay(80);
}
for(i=0;i<8;i++)
{ P1OUT &= ~BIT0; P1OUT &= ~BIT4; P1OUT |= BIT4;
}
P1DIR=0XF;
P1OUT=0XF;
P1IFG=0;
P1IE=0xf0;
}
void clk_5620(void)
{
P2OUT &= ~BIT2; delay(10); P2OUT |= BIT2; delay(10);
}
void dacout(char ch,char x) //通道 转换值
{
uchar a,i;
P2OUT |= BIT1; //LOAD=1
P2OUT &= ~BIT2; //CLK=0
P2OUT &= ~BIT3; //DATA=0
a=ch;
if(a&0x2)
P2OUT |= BIT3;
else
P2OUT &= ~BIT3;
P2OUT |= BIT2; P2OUT &= ~BIT2;
a=ch;
if(a&0x1)
P2OUT |= BIT3;
else
P2OUT &= ~BIT3;
P2OUT |= BIT2; P2OUT &= ~BIT2;
P2OUT &= ~BIT3; //DATA=0
P2OUT |= BIT2; P2OUT &= ~BIT2;
for(i=0;i<8;i++)
{
P2OUT |= BIT2;
if(x&0x80)
P2OUT |= BIT3;
else
P2OUT &= ~BIT3;
P2OUT &= ~BIT2;
x=x<<1;
}
//delay(3);
P2OUT &= ~BIT1;
P2OUT |= BIT1;
}
void main(void)
{
int i;
WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
FLL_CTL0 |= XCAP14PF; // Configure load caps
// LCDCTL = LCDON + LCD4MUX + LCDP2; // STK LCD 4Mux, S0-S17
LCDCTL = 0XFD;
BTCTL = BTFRFQ1; // STK LCD freq
P5SEL = 0xFC; // Common and Rxx all selected
for(i=0;i<20;i++)
LCDMEM[i]=0;
for (i=1; i<9; ++i) // Display "6543210"
LCDMEM[i] = distab[digit[i-1]];//digit[i];
P1DIR=0x1f;
P1DIR=0X0f;
P1OUT=0X0f;
P1IE=0Xf0;
P1IES=0;
P1IFG=0;
P2DIR=0XFF;
P2OUT=0;
dacout(0x1,0x30);
TACTL = TASSEL1 + TACLR; // SMCLK, clear TAR
CCTL0 = CCIE; // CCR0 interrupt enabled
CCR0 = 20000;
TACTL |= MC1; // Start Timer_A in continuous mode
_EINT(); // Enable interrupts
for (;;)
{
_BIS_SR(CPUOFF); // CPU off
_NOP(); // Required only for C-spy
}
}
interrupt[TIMERA0_VECTOR] void Timer_A (void)
{ char i=0;
disp();
for(i=0;i<7;i++)
disbuffer[8-i]=digit[i];
CCR0 += 7000; // Add Offset to CCR0
for(i=1;i<7;i++)
LCDMEM[i-1]=distab[digit[i]];
digit[0]++;
LCDMEM[7]=0xa;
LCDMEM[8]=0x90;
LCDMEM[9]=0x12;
LCDMEM[10]=0x80;
LCDMEM[11]=0x2;
LCDMEM[12]=0x93;
LCDMEM[13]=0x72;
LCDMEM[14]=0x5b;
LCDMEM[15]=0x94;
//开发板在第一第二DAC通道连接了双色发光二极管,
//本演示程序通过TLV5620循环输出:红色逐渐亮起来、绿色逐渐亮起来、黄色逐渐亮起来
if(digit[0]==15)
{
if(dac5620_ch==0)
{
dacout(0x0,dac);
dacout(0x1,0);
}
else if(dac5620_ch==1)
{
dacout(0x1,dac);
dacout(0x0,0);
}
else if(dac5620_ch==2)
{
dacout(0x0,dac);
dacout(0x1,dac);
}
dac=dac+1;
if(dac<150)
{
dac=150;
dac5620_ch++;
if(dac5620_ch==3)
dac5620_ch=0;
}
digit[0]=0;
digit[1]++;
if(digit[1]==10)
{
digit[1]=0;
digit[2]++;
if(digit[2]==6)
{
digit[2]=0;
digit[3]++;
if(digit[3]==10)
{
digit[3]=0;
digit[4]++;
if(digit[4]==6)
{
digit[4]=0;
}
}
}
}
}
}
//*************************************888888
//
//************************************8888888
uchar key_just(void) //00:down 0xff:no down
{
P1DIR=0xf;
P1OUT=0xf;
if((P1IN&0xf0)==0)
return(0xff);
return(0);
}
uchar key_code(void)
{uchar in;
P1DIR=0XF;
P1OUT=0x8;
in=P1IN&0x0f0;
if(in!=0)
{
if(in==0X10)
return(0); //C-F
if(in==0X20)
return(1);
if(in==0X40)
return(2);
if(in==0X80)
return(3);
}
P1OUT=0X4;
in=P1IN&0x0f0;
if(in!=0)
{
if(in==0X10)
return(4); //8-B
if(in==0X20)
return(5);
if(in==0X40)
return(6);
if(in==0X80)
return(7);
}
P1OUT=0X2;
in=P1IN&0x0f0;
if(in!=0)
{
if(in==0X10)
return(8); //4-7
if(in==0X20)
return(9);
if(in==0X40)
return(10);
if(in==0X80)
return(11);
}
P1OUT=0X1;
in=P1IN&0x0f0;
if(in!=0)
{
if(in==0X10)
return(12); //0-3
if(in==0X20)
return(13);
if(in==0X40)
return(14);
if(in==0X80)
return(15);
}
return(key_buffer);
}
uchar key(void)
{
uchar temp=key_buffer ;//=key_buffer;
uint time=0;
P1IFG=0;
if(key_just()==0)
delay(500);
if(key_just()!=0)
return(temp);
temp=key_code();
key_buffer=temp;
key_loop:
if(key_just()==0)
{
time++;
delay(300);
if(time>200)
key_long=0xf;
goto key_loop;
}
else
{
P1IFG=0;
return(temp);
}
}
//***************************************
interrupt[PORT1_VECTOR] void key_p1(void)
{
uchar key_;
uchar i=0;
P1IFG=0;
key_=key();
LCDMEM[6]=distab[key_];
disbuffer[0]=key_;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -