⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 430_dac.c

📁 430编程:基于169的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 + -