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

📄 led.c

📁 MSP430单片机与LED驱动芯片74HC595多路通讯程序
💻 C
字号:
#include <msp430x13x.h>


unsigned int DispBuf[4];
unsigned char x[2]={1,2},y1=20,y2=00,y3=00,s01;
unsigned int Period,OldCap,Start,end;
unsigned int overflow;
unsigned int Fline;

void HextoBCD(void);
void Init(void);




void delay(unsigned int v)
{
 while(v!=0)v--;}



 void send_wei(unsigned char sect_code)     //sect_code为段码
{
 unsigned char i=0;
 P5OUT&=~0x20;                            //rclk置低电平,允许存储
 for(i=0;i<8;i++)                             //转换的数据为8位
  {
   P5OUT&=~0x40;                          //SRCLK置低电平
   if((sect_code&0x80)==0x80)                 //判断段码数据的第一位是1或者0
   P5OUT|=0x80;                            //如果是1,送数据1给595
   else
   P5OUT&=~0x80;                           //如果是0,送数据0给595
   P5OUT|=0x40;                           //SRCLK置高电平,上升沿转换
   sect_code=sect_code<<1;                    //段码左移一位
   }
 P5OUT|=0x20;                             //RCLK置高电平,存储结束
}

  
void LED_DISP(unsigned char *dispbuffer)
{
 unsigned char seg[]={0x3f,0x06,0x9b,0x8f,   //显示字符的段码表
                      0xa6,0xad,0xbd,0x07,
                      0xbf,0xaf,0xb7,0xbc,
                      0x39,0x9e,0xb9,0xb1,    
                      0x00,0x98,0xb6,0xb4,
                      0x0e,0x38,0x94,0x9c,
                      0xb3,0x90,0x3e,0x1c,
                      0xae,0x80,0x88,0xa3};
 unsigned char i=0;
 unsigned char temp=0x01;
   for(i=0;i<5;i++)
   {
    P5DIR=0xff;
    send_wei(seg[*(dispbuffer+i)]);        //送段码
    P5OUT=temp;                              //选通位
    temp=temp<<1;                            //为下一位作准备
    delay(500);                              //延时一会
    }
}



//

//主程序
void main(void)
{
 
 unsigned char DSP1[]={0x04,0x03,0x02,0x01,0x10};  //要显示字符的段码rEAD
 //unsigned char DSP2[]=DispBuf[]
 
 
 while(1)
   {
    unsigned int i=0,j=0,k=0,m=0;
    for(k=0;k<3;k++)              
      {
       x[k]=50000000;
       Fline=x[k]/Period;
      }
    
    
    for(i=0;i<10;i++)              
      {
       
        LED_DISP(DSP1);
       //LED_DISP(DispBuf[]);
       //LED_DISP(Fline); 
       
      }
    for(j=0;j<5;j++) 
      {
       delay(50000);
      } 
   }                                   
}

void HextoBCD(void)                     //HexToBcd(Word Hexs)
{
    unsigned int va = 1000;
    unsigned int i;
    unsigned int Hexs=0xfff;             //4095
                                   
    for(i = 0;i < 3;i++) 
    {
       
       DispBuf[i] = 0;                    //
       while ((Hexs >= va) && (va > 9)) 
       {        
         Hexs -= va;                      //
         DispBuf[i]++;                    //
       }
       va /= 10;                          //
    }    
    DispBuf[i] = Hexs;                 //
}


void Init(void)
{
   WDTCTL=WDTPW+WDTHOLD;          //关闭看门狗
   BCSCTL1=XTS+DIVA_3;       //XTS工作在高频,DIVA0+DIVA1--作8分频
   P4SEL |= 0x06;
   P4DIR  = 0xF9;
   TACTL=TASSEL1+TACLR;
   TBCTL=TBSSEL0+TBCLR+TBIE;      //TASSEL1选择ACLK,定时器内容清零
   TBCCTL1=BITF+BITC+BITB+BIT8+BIT4;                    //铺捉比较寄存器允许中断
   TBCCR0=500;                     //500kHz,设置1000,正好2毫秒
   P5DIR|=0Xff;
   TACTL|=MC0;
   TBCTL|=MC1;
   P5OUT&=0X00;             //5个数码管全部不选通
   _EINT();
/* ADC12 Settings:     
     P6SEL = 0xFF;         		// 所有P6口线均为ADC模块使用
     ADC12CTL0 &=~ 0x02;   		// 在进行设置时首先复位ADC的转换使能
                            		// 选则参考电压和输入管脚
     ADC12MCTL0  = 0x00;    		// Ref = AVss, AVcc; Input = A0
     ADC12MCTL1  = 0x8a;    		// Ref = AVss, AVcc; Input = A10
                            		// ADC12MCTL1 是最后一个转换通道
     ADC12CTL1 = 0x0202;    		// ADC12SC 位触发采样和保持
                 		        // 采样脉冲由采样定时器产生
                            		// 时钟源:内部振荡器
                          		// 时钟分频: 1
                            		// 转换模式: 多通道、单次转换
     ADC12CTL0 = 0x0010+SHT0_8;    
     ADC12CTL0 |= 0x02;     		// 使能ADC转换
*/ 
}

interrupt[TIMERB1_VECTOR] void Timer_B1 (void)
{
 switch (TBIV)
 {
  case 2:
       if(CCTL1&CM0)
          {
           CCTL1=(CCTL1&(~CM1))|CM0;
           Start=TBR;
           overflow=0;
          }
       else if(CCTL1&CM1)
          {
           CCTL1=(CCTL1&(~CM0))|CM1;
           end=TBR;           
          }
       Period=end-Start;      
       break;
  case 10:
          overflow++;  
          break;
  default:break;
 }
}   
    
                               

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -