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

📄 main.c

📁 Clock basic msp430f149
💻 C
字号:
#include <msp430x14x.h>
#include "Clock.h"

unsigned char SettingData[7]={ //bit7 bit6 bit5 bit4 bit3 bit2 bit1 bit0
 0x07,    //--------十位-------|-------个位--------|年份(当前07年)
 0x07,    //                        |-----个位-----|星期(当前周日)
 0x07,    //              |十位|-------个位--------|月份(当前07月)
 0x01,    //         |--十位---|-------个位--------|日期(当前01号)
 0x18,    //-12H|    |--十位---|-------个位--------|小时(当前18点)
 0x24,    //    |-----十位-----|-------个位--------|分钟(当前20分)
 0x35    //    |-----十位-----|-------个位--------|秒钟(当前30秒)
};
unsigned char ReadingData[7];  //读出来的数据,同SettingData定义与格式
int elem[9];

//延时函数
void DS1302_Delay(unsigned int dtime) {
 unsigned int temp;
 for(temp=0;temp<dtime;temp++);
}

//DS1302复位
void DS1302_Reset(void) {
 DS1302_DIR |= (DS1302_RST + DS1302_SCLK);
 DS1302_SCLK_LO;
 DS1302_RST_LO;
 DS1302_Delay(10);
 DS1302_SCLK_HI;
}

//向DS1302写入一个字节
void DS1302_WriteOneByte(unsigned char w_dat) {
 unsigned char temp;
 
 DS1302_RST_HI;
 DS1302_DIR |= DS1302_SDI;
 for(temp=8;temp>0;temp--) {
  DS1302_SDI_LO;
  if(w_dat&BIT0) DS1302_SDI_HI;
  DS1302_SCLK_LO;
  DS1302_Delay(10);
  DS1302_SCLK_HI;
  DS1302_Delay(10);
  w_dat >>=1;
 } 
}

//从DS1302中读取一个字节
unsigned char DS1302_ReadOneByte(void) { 
 unsigned char temp,rdata;
 rdata = 0x00;
 
 DS1302_RST_HI;
 DS1302_DIR &= ~DS1302_SDI;
 
 for(temp=0;temp<7;temp++){
  DS1302_SCLK_HI;
  DS1302_Delay(10);
  DS1302_SCLK_LO;
  DS1302_Delay(10);
  if((DS1302_IN&DS1302_SDI)==DS1302_SDI)
   rdata |= BIT7;
  rdata >>= 1;
 }
 
 return(rdata); 
}

//向DS1302中写入地址后写入数据
void DS1302_WriteData(unsigned char addr,unsigned char w_dat) {
 DS1302_RST_LO;
 DS1302_SCLK_LO;
 DS1302_RST_HI;
 
 DS1302_WriteOneByte(addr);  //写入地址
 
 DS1302_WriteOneByte(w_dat);  //写入数据
 
 DS1302_SCLK_HI;
 DS1302_RST_LO;
} 

//向DS1302写入地址后,从DS1302中读取数据
unsigned char DS1302_ReadData(unsigned char addr) {
 unsigned char r_dat;
 DS1302_RST_LO;
 DS1302_SCLK_LO;
 DS1302_RST_HI;
 
 DS1302_WriteOneByte(addr);  //写入地址
 r_dat = DS1302_ReadOneByte();  //读出数据
 
 DS1302_SCLK_LO;
 DS1302_RST_LO;
 
 return(r_dat);
}

//按照SettingData的设置设置DS1302的时间
void DS1302_SettingData(void) {
 unsigned char temp;
 unsigned char addr = 0x8C;
 DS1302_WriteData(0x8E,0x00);  //写入控制命令,禁用写保护
 DS1302_WriteData(0x80,0x7E);//开始计时
 DS1302_WriteData(0x82,0x25);
 DS1302_WriteData(0x84,0x18); 
 DS1302_WriteData(0x8E,0x80);  //写入控制命令,启用写保护
}

//读取DS1302时间到ReadingData中
void DS1302_GetData(unsigned char *str) {
 unsigned char temp;
 unsigned char addr = 0x85;
  str[0] = DS1302_ReadData(0x84);//时
  str[1] = DS1302_ReadData(0x83);//分
  str[2] = DS1302_ReadData(0x81);//秒
}
void InitSystemClock(void)  // 初始化系统时钟
{
  unsigned char i;
  BCSCTL1=0x00;//Set 430 clk 
  do
  {
    IFG1&=~OFIFG;
    for(i=0xff;i>0;i--);
  }
  while ((IFG1&OFIFG)!=0);
  BCSCTL2=SELM_2;//选择LFXTICLK的时钟源为高速时钟 不分频,均为8M
  return;
}
void main(void)
{
  unsigned char time1[7];
  WDTCTL = WDTPW + WDTHOLD;// Stop WDT
  InitSystemClock();
  DS1302_Reset();
  DS1302_SettingData();
  LEDDIR=0XFF;
  while(1)
  {
    DS1302_GetData(time1);
    elem[1]=(time1[2]&0xf0)>>4;//设置要显示的数据// 秒
    elem[0]=time1[2]&0x0f;  
    elem[3]=(time1[1]&0xf0)>>4;//分
    elem[2]=time1[1]&0x0f;
    elem[5]=(time1[0]&0xf0)>>4;//时
    elem[4]=time1[0]&0x0f;
    switch(elem[0])
    {
      case 0:LEDOUT=BIT0;
      break;
      case 1:LEDOUT=BIT1;
      break;
      case 2:LEDOUT=BIT2;
      break;      
      case 3:LEDOUT=BIT3;
      break;
      case 4:LEDOUT=BIT4;
      break;
      case 5:LEDOUT=BIT5;
      break;
      case 6:LEDOUT=BIT6;
      break;
      case 7:LEDOUT=BIT7;
      break;
      case 8:LEDOUT=BIT7;
      break;
      case 9:LEDOUT=BIT7;
      break;      
     default:;
    }
  }
}

⌨️ 快捷键说明

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