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

📄 12887.c

📁 430控制12887源程序
💻 C
字号:
#include  "msp430x44x.h "
#define uchar unsigned char
#define uint unsigned  int
/*
P1.0---P1.7---> AD0--AD7
CS---> P2.0
AS---> P2.1
R/W--> P2.2
DS---> P2.3
*/
#define MIN_ADD 0X02
#define HOUR_ADD 0X04
#define WEEK_ADD 0X06
#define DAY_ADD 0X07
#define MON_ADD 0X08
#define YEAR_ADD 0X09
#define REG_A 0X0A
#define REG_B 0X0B

 uchar redata;
 uchar num=6;
 uchar senddata[6]; 
 uchar flag=1;
 uchar add;
 uchar adata;
 uchar loog=6;
 uchar ledcs=0xfe;
 uchar leddata1;
 uchar leddata2;
#define LED_IN_USE 6
 uchar led_Ctrl;
 uchar led_Buf[LED_IN_USE];
 
 
 
 uint i=500;
 
unsigned char NUM_LED[17]=
                       {0xd7,0x14,0xcd,0x5d,0x1E,  // 0 ~ 4
                       0x5b,0xdb,0x15,0xdf,0x5f,   // 5 ~ 9
                       0x9f,0xda,0xc3,0xcc,0xcf,   // a ~ e
                       0x8b,0x00};                 //f,0x00使LED不显示

void uart_init(void)
{
  //WDTCTL = WDTPW + WDTHOLD;             // Stop WDT
  FLL_CTL0 |= XCAP14PF;                 // Configure load caps
  UTCTL0 = SSEL1;                       // UCLK = SMCLK
  UBR00 = 0x6D;                         // 1MHz 9600
  UBR10 = 0x00;                         // 1MHz 9600
  UMCTL0 = 0x00;                        // no modulation
  UCTL0 = CHAR;                         // 8-bit character *SWRST*
  ME1 |= UTXE0 + URXE0;                 // Enable USART0 TXD/RXD
  IE1 |= URXIE0;                        // Enable USART0 RX interrupt
  P2SEL |= 0x30;                        // P2.4,5 = USART0 TXD/RXD
  P2DIR |= 0x10;                        // P2.4 output direction
}

void init(void)
{
   WDTCTL = WDTPW + WDTHOLD;
   FLL_CTL0 = XCAP14PF;
   IE2 |= BTIE;
   BTCTL = BTDIV + BTIP1+BTIP0;
   P1SEL = 0x00;   //select a common I/O 
   P3SEL=0X00;
   P4SEL&=0XFC;
   P2DIR = BIT0+BIT1+BIT2+BIT3; //selected as output
   P2OUT = BIT0+BIT1+BIT2+BIT3;
   P3DIR = 0xff;
   P4DIR |= 0X03;
   P3OUT  = 0xff;
   P4OUT  &= 0xfc;
   
}



void write_byte(uchar address,uchar data)
{
   P1DIR  =0XFF;
   P2OUT &=~BIT1;//AS=0;  
   P2OUT |=BIT2;//WR=1
   P2OUT |= BIT1;//AS=1
   P2OUT &=~BIT0; //CS=0
   _NOP();
   _NOP();
   P1OUT  =address;
   P2OUT &=~BIT1;//AS=0;锁存ADDRESS
   P2OUT &=~BIT2;//WR=0  
   P1OUT  =data;
   _NOP();
   _NOP();   
   P2OUT |= BIT1;//AS=1
   P2OUT |=BIT2;//WR=1
   P2OUT |= BIT0;//CS=1   
}
void read_byte(uchar address)
{  
  
   P1DIR  =BIT0+BIT1+BIT2+BIT3+BIT4+BIT5+BIT6+BIT7;
   P2OUT &=~BIT0; //CS=0   
   P2OUT &=~BIT1;//AS=0
   P2OUT |= BIT3;//DS=1
   P2OUT |=BIT2;//WR=1
   P2OUT |= BIT1;//AS=1
   _NOP();
   _NOP();
   P1OUT  =address;
   _NOP();
   P2OUT &=~BIT1;//AS=0;锁存ADDRESS   
   P2OUT &=~BIT3;//DS=0
   P1DIR  =0X00;
   _NOP();
   _NOP();
   redata =P1IN;
   _NOP();
   P2OUT |= BIT3;//DS=1 
   P2OUT |= BIT1;//AS=1
   P2OUT |= BIT0;//CS=1   
   
}


void led_Display(){                   
    unsigned tmp ;
      
      tmp    = 0x01;
      P3OUT  = NUM_LED[led_Buf[led_Ctrl]];  // 设置显示值
      P4OUT |= 0x02;                        // 打开数据锁存器 
      P4OUT &= 0XFD;                        // 关闭数据锁存
      P3OUT  = ~(tmp<<led_Ctrl);            // 设置那只LED显示 
      P4OUT  |= 0x01;                       // 打开控制锁存
      P4OUT  &= 0XFE;                       // 关闭控制锁存
      led_Ctrl= (led_Ctrl +1) % LED_IN_USE; // 设置下一个要显示的LED
      
}

void init_12887(void)
{                       
  write_byte(REG_A,0x20);
  write_byte(REG_B,0x72);
      
}

void settime(void)
{
  read_byte(REG_B);
  redata|=0x80;
  write_byte(REG_B,redata);
  write_byte(MIN_ADD,0x12);
  write_byte(HOUR_ADD,0x14);
  write_byte(WEEK_ADD,0x3);
  write_byte(DAY_ADD,0x20);
  write_byte(MON_ADD,0x12);
  write_byte(YEAR_ADD,0x06);
  read_byte(REG_B);
  redata&=0x7f;  
  write_byte(REG_B,redata);
/*  redata=1;
  add=0x20;
  adata=15;
  while(adata--)
  {  
  write_byte(add,redata);
  add++;
  redata++;
  }*/
}

void gettime(void)
{
 /*      read_byte(REG_B);
       i=5000;
       while(i--);
       while ((IFG1 & UTXIFG0) == 0);
       TXBUF0=redata;*/
       read_byte(REG_A);
//       while ((IFG1 & UTXIFG0) == 0);  
//       TXBUF0=redata;       
       if((redata&0x80)==0x00)
     {
     
       flag=0;
       num=6;
       read_byte(YEAR_ADD);
       senddata[0]=redata;
       read_byte(MON_ADD);
       senddata[1]=redata;
       read_byte(DAY_ADD);
       led_Buf[1]=redata%16;
       led_Buf[0]=redata/16;
       senddata[2]=redata;
       read_byte(WEEK_ADD);       
       senddata[3]=redata;
       read_byte(HOUR_ADD); 

       led_Buf[3]=redata%16;
       led_Buf[2]=redata/16;       
       senddata[4]=redata;
       read_byte(MIN_ADD); 
       led_Buf[5]=redata%16;
       led_Buf[4]=redata/16;
       senddata[5]=redata;
 
       
 /*       while(!flag&&num)
    
     {
     num--; 
     while ((IFG1 & UTXIFG0) == 0); 

     TXBUF0=senddata[num];
     }*/
     }
   
}

 main(void)
{
  init();
  uart_init();
  init_12887();
   settime();
  
 
  _EINT();
  
  for(;;)
  {
    
   gettime(); 
  //  display();
  led_Display();  
  

/*   for(i=0;i<num;i++)
    
    {
      
     while ((IFG1 & UTXIFG0) == 0); 
     while(i--);
     TXBUF0=senddata[num];
     }*/
    flag=1;
    num=6;
  } 
    
}
#pragma vector=UART0RX_VECTOR
__interrupt void usart0_rx(void)

{
  while ((IFG1 & UTXIFG0) == 0);        // USART0 TX buffer ready?
  TXBUF0 = RXBUF0;                      // RXBUF0 to TXBUF0
}

⌨️ 快捷键说明

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