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

📄 main.c

📁 MSP430系列 RTC源程序下载 使用430实现闹钟程序
💻 C
📖 第 1 页 / 共 2 页
字号:
/**************************************************
** 版权:     杭州利尔达科技有限公司
** 文件名:   DD
** 工作环境: IAR 3.42A 
** 作者:     谷丰
** 生成日期: 2008.08.25
** 功能: 实现软件万年历功能,并自动识别闰年
         A屏每显示5秒种就自动切换到B屏,
        B屏再显示5秒种就自动切换到C屏,
        C屏再显示5秒种就自动切换到A屏
        通过按键在A屏、B屏和C屏之间切换
        可通过按键手动设定和调整时间,当调整时对应调整位要有闪烁功能
        有闹钟功能,可设置几点几分闹钟,当前时间等于闹钟时间时,
        用点亮LED指示,直到某个键(自定义)被按下时,熄灭LED灯
** 相关文件:
** 修改日志:
***************************************************/
/**************************************************
包含头文件
***************************************************/
#include  <msp430x44x.h>
/**************************************************
定义全局变量
***************************************************/
unsigned char cnt;                                                  // 计数器
unsigned char tian;                                                 // 天寄存器
unsigned char key_code;                                             // 按键值
unsigned char flag;                                                 // 换屏标志位
unsigned char twinkle_num;                                          // 闪烁标志位 
unsigned char function_flag;                                        // 加减功能标志位
unsigned char function_ping1,function_ping2,function_ping3;         // 每屏闪烁位
unsigned char change_num;                                           // 闪屏时间定时
unsigned char change_ping;                                          // 三屏计数位
unsigned char clock_flag;                                           // 闹钟标志位
unsigned char ping_flag;                                            // 按键跟踪闪屏标志位
unsigned char num_flag;                                             // 按键计数闪屏标志位
unsigned char tian_flag;                                            // 天判断标志位
unsigned char run_flag;                                             // 闰年判断标志位
unsigned int key_num = 150;                                         // 按键消逗延时时间
unsigned int year = 2008;                                           // 年
unsigned char month = 2;                                            // 月
unsigned char day = 28;                                             // 日
unsigned char hour = 23;                                            // 小时
unsigned char min = 59;                                             // 分
unsigned char sec = 57;                                             // 秒
unsigned char nao_hour = 0;                                         // 闹钟时
unsigned char nao_min = 0;                                          // 闹钟分
unsigned char nao_sec = 0;                                          // 闹钟秒
const unsigned char tianshu[13] =
{0,31,28,31,30,31,30,31,31,30,31,30,31};                            // 每月天数表
char digit[12] =                                                    // 液晶显示段码表  
{
  0x7b,
  0x12,
  0x4f,
  0x1f,
  0x36,
  0x3d,
  0x7d,
  0x13,
  0x7f,
  0x3F,
  0x00 
};  
/**************************************************
定义子函数
***************************************************/
void init_clk(void);                                                // 初始化时钟
void key_scan(void);                                                // 按键扫描
void key_value(void);                                               // 按键值确定
void rtc(void);                                                     // 时钟扫描函数
void rtc_show(void);                                                // rtc扫描函数                                                  
void leap_year(void);                                               // 闰年判定函数
/**************************************************
** 函数名称:系统主函数
** 工作环境: IAR 3.42A 
** 作者:     谷丰
** 生成日期: 2008.08.25
** 相关文件:
** 修改日志:
***************************************************/
void main(void)                                                    
{
  init_clk();                                                       // 时钟初始化
  while(1)
  {
    key_scan();                                                     // 按键扫描
    key_value();                                                    // 键值确定
    rtc_show();                                                     // RTC显示
    leap_year();                                                    // 闰年判定
    if((sec == nao_sec) && (min == nao_min) && (hour == nao_hour))  // 闹钟判定
    {
      clock_flag = 1;                                               // 闹钟标志位置一
    }
  }
}
/**************************************************
** 函数名称:系统初始化函数
** 工作环境: IAR 3.42A 
** 作者:     谷丰
** 生成日期: 2008.08.20
** 功能:相关寄存器初始化
** 相关文件:
** 修改日志:
***************************************************/
void init_clk(void)
{
  unsigned char i;
  WDTCTL = WDTPW + WDTHOLD;                                         // 关闭看门狗        
  FLL_CTL0 |= XCAP14PF;                                             // 选择14PF电容               
  IE2 |= BTIE;                                                      // 开启基本定时器中断                               
  BTCTL = BT_ADLY_250 + BTFRFQ1;                                    // 250ms  16分频
  LCDCTL = LCDON + LCD4MUX + LCDP2;                                 // STK LCD 4Mux, S0-S14
  P5SEL = 0xFC;                                                     // 选择P5口第二功能 
  P1DIR |= 0x01;                                                    // P1.0选择输出   
  _EINT();                                                          // 开总中断
  for (i=0; i<19; i++)
  {
    LCDMEM[i] = 0;                                                  //清LCD缓冲区
  } 
}
/**************************************************
** 函数名称:按键扫描函数
** 工作环境: IAR 3.42A 
** 作者:     谷丰
** 生成日期: 2008.08.20
** 功能:按键扫描,键值确定
** 相关文件:
** 修改日志:
***************************************************/
void key_scan(void)
{ 
  static unsigned int num;                                          // 按键消抖计数器 
  if((P1IN&0x0e) != 0x0e)                                           // 如果不等于表示有键按下 
  {
    num++;                                                          // 消逗计数器加
    key_code = 0;                                                   // 键值清零
  }       
  else
  {
    num = 0;                                                        // 按键抖动,键值清零
    key_code = 0;                                                   // 键值清零
  }
  if(num == key_num )                                               // 键值确定
  {      
    num = 0;                                                        // 消逗寄存器清零
    twinkle_num = 0;                                                // 闪烁清零
    key_code = ((P1IN&0x0e)>>1)^0x07;                               // 键值转换   
  }
}
/**************************************************
** 函数名称:键值功能函数
** 工作环境: IAR 3.42A 
** 作者:     谷丰
** 生成日期: 2008.08.20
** 功能:按键功能确定
         P1.1 闪烁、清除闹钟
         P1.2 + P1.1 加、清除闹钟
         P1.3 + P1.1 减、清除闹钟
         P1.2 闪屏、清除闹钟
         P1.3 清除闹钟
** 相关文件:
** 修改日志:
***************************************************/
void key_value(void)
{
  if(key_code == 0x01)                                              // 第一个键被按下
  {
    function_flag = 1;                                              // 功能键标志位置一
    clock_flag = 2;                                                 // 关闭闹钟
    if(change_ping == 0)                                            // 第一屏
    {
      function_ping1 ++;                                            // 数值闪烁加
      if(function_ping1 == 4)                                       // 闪烁到第三位         
      { 
        if(tian_flag == 1)
        {
          function_ping1 = 1;                                       // 
        }
        else
        {
          function_ping1 = 0;                                       // 清零
          function_flag = 0;                                        // 功能键清零
        }
      }
      change_num = 0;                                               // 换屏计数器
    }
    if(change_ping == 1)                                            // 第二屏
    {
      function_ping2++;                                             // 数值闪烁加
      if(function_ping2 == 4)
      {
        function_ping2 = 0;
        function_flag = 0;                                          // 清零                                                                   // 功能标志位清零
      }
      change_num = 20;                                              // 换屏时间计数器
    }
    if(change_ping == 2)                                            // 第三屏
    {
      function_ping3++;                                             // 数值闪烁加
      if(function_ping3 == 4)
      {
        function_ping3 = 0;                                         // 清零
        function_flag = 0;                                          // 功能标志位清零
      }
      change_num = 40;                                              // 换屏计数器
    }
  }
  if((key_code == 0x02) && (function_flag == 1))                    // 加法
  { 
    clock_flag = 2;                                                 // 关闭闹钟   
    if(function_ping2 == 1)                                         // 秒闪烁
    {
      sec++;                                                        // 秒加
      if(sec == 60)                                                 // 秒是否等于60
        sec = 0;                                                    // 秒数清零
    }
    if(function_ping2 == 2)                                         // 分闪烁
    {
      min++;                                                        // 分加
      if(min == 60)                                                 // 分是否等于60
        min = 0;                                                    // 分清零 
    }
    if(function_ping2 == 3)                                         // 小时闪烁
    {
      hour++;                                                       // 小时加
      if(hour == 24)                                                // 小时是否等于24
        hour = 0;                                                   // 小时清零
    }
    if(function_ping1 == 1)                                         // 日闪烁
    {
      day++;                                                        // 日加加
      if(day > tian)                                                // 日是否大于天
        day = 1;                                                    // 日等于1
    }
    if(function_ping1 == 2)                                         // 月闪烁
    {
      month++;                                                      // 月加加 
      tian = tianshu[month]; 
      if(day > tian)
      {
        tian_flag = 1;
      }
      else
        tian_flag = 0;
      if(month == 13)                                               // 月是否等于13
        month = 1;                                                  // 月等于1
    }
    if(function_ping1 == 3)                                         // 年闪烁
    {      
      year++;                                                       // 年加加
      if((year%4 != 0)||(year%100 != 0) || (year%400 == 0))
      {
       tian = tianshu[month]; 
       if(day > tian)
       {
        tian_flag = 1;
       }   
      else 
        tian_flag = 0;
      }
      if(year == 2100)                                              // 年是否等于2100
        year = 2000;                                                // 年到2000
    } 
    if(function_ping3 == 1)                                         // 闹钟秒闪烁
    {
      nao_sec++;                                                    // 闹钟秒加加
      if(nao_sec == 60)                                             // 闹钟秒是否等于60
        nao_sec = 0;                                                // 闹钟秒清零
    }
    if(function_ping3 == 2)                                         // 闹钟分闪烁
    {
      nao_min++;                                                    // 闹钟分加加
      if(nao_min == 60)                                             // 闹钟分是否等于60
        nao_min = 0;                                                // 闹钟分清零
    }
    if(function_ping3 == 3)                                         // 闹钟小时闪烁
    {
      nao_hour++;                                                   // 闹钟小时加加
      if(nao_hour == 24)                                            // 闹钟小时是否等于24
        nao_hour = 0;                                               // 闹钟小时清零
    }  
  }
  if((key_code == 0x04) && (function_flag == 1))                    // 减法
  {
    clock_flag = 2;                                                 // 清除闹钟标志位
    if(function_ping2 == 1)                                         
    { 
      sec--;                                                        // 秒减减
      if(sec == 0xff)                                               // 秒是否等于0 
        sec = 59;                                                   // 秒等于60                                                               
    }
    if(function_ping2 == 2)                                         
    {
      min--;                                                        // 分减减
      if(min == 0xff)                                                  // 分是否等于0
        min = 59;                                                   // 分等于60                                                           
    }
    if(function_ping2 == 3)                                         
    {
      hour--;                                                       // 小时减减
      if(hour == 0xff)                                                 // 小时是否等于0
        hour = 23;                                                  // 小时等于24                                                            
    }
    if(function_ping1 == 1)
    {
      day--;                                                        // 天减减
      if(day == 0)                                                  // 天是否等于0 
        day = tian;                                                 // 天等于30/31/28/29                                                             
    }
    if(function_ping1 == 2)                                         
    {
      month--;                                                      // 月减减
      if(month == 0)                                                // 月是否等于0
        month = 12;                                                 // 月等于13
      tian = tianshu[month];  
      if(day > tian)
        tian_flag = 1;
      else 
        tian_flag = 0;
    }
    if(function_ping1 == 3) 
    { 
      year--;                                                       // 年减减
      if(year ==1999)                                               // 年是否等于1999
        year = 2100;                                                // 年等于2100 
      if((year%4 != 0)||(year%100 != 0) || (year%400 == 0))
      {
       tian = tianshu[month]; 
       if(day > tian)
       {
        tian_flag = 1;
       }   
      else 
        tian_flag = 0;
      }
    }  
    if(function_ping3 == 1)                                        
    {  
      nao_sec--;                                                    // 闹钟秒减减
      if(nao_sec == 0xff)                                              // 闹钟秒是否等于0
        nao_sec = 59;                                               // 闹钟秒等于60                                                           
    }
    if(function_ping3 == 2) 
    {
      nao_min--;                                                    // 闹钟分减减
      if(nao_min == 0xff)                                              // 闹钟分是否等于0
        nao_min = 59;                                               // 闹钟分等于60                                                          
    }
    if(function_ping3 == 3) 
    {

⌨️ 快捷键说明

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