用MSP430的32768Hz晶振写的时钟

发布者:科技火箭最新更新时间:2015-04-27 来源: 51hei关键字:MSP430  晶振  时钟 手机看文章 扫描二维码
随时随地手机看文章
#include

typedef unsigned char uchar;
typedef unsigned int  uint;
//typedef也是一种宏定义类型,其书写方式和#define相反

/*******液晶端口初始化*******/
#define out P3DIR|=BIT0+BIT1+BIT2//把P3_012三个口设为输出
#define lcd_enset P3OUT|=BIT2
#define lcd_enclear P3OUT&=~BIT2
#define lcd_rw1 P3OUT|=BIT1
#define lcd_rw0 P3OUT&=~BIT1
#define lcd_rs1 P3OUT|=BIT0
#define lcd_rs0 P3OUT&=~BIT0
#define keyin (P1IN & 0x0f)
 uchar temp,keynum=0;
int shi=23,fen=59,miao=55;//此处用char型会在按键调整减数到0时出错
/**********/
/*延时子程序*/
//调用8个时钟周期,返回6个,循环4个
//总周期个数为: 8+6+4*n=14+4*n 个时钟周期
//默认800k时钟,所以周期为1.25us 公式修正:17.5+5*n=定时时间
void delay(unsigned int x)//延时
{
 unsigned int i;
 i=x;
 for(;i>0;i--) ;
}
/******LCD写指令程序***********/
void write_com(unsigned char com)
{ out;
  P4DIR=0XFF;
  P4OUT=com;
  lcd_rw0;
  lcd_rs0;
  _NOP();
  lcd_enclear;
  delay(10);
  lcd_enset;
  delay(10);
  lcd_enclear;
}
/***********LCD写数据**************/
void write_data(unsigned char dat)
{   out;
   P4DIR=0XFF;
   P4OUT=dat;
   lcd_rw0;
   lcd_rs1;
   _NOP();
   _NOP();
   lcd_enclear;
   delay(10);
   lcd_enset;
   delay(10);
   lcd_enclear;
}
/*****写时分秒********/
void write_sfm(uchar add,uchar dat)
{
  uchar a,b;
  a=dat/10;
  b=dat%10;
  write_com(0x80+0x40+add);
  write_data(a+0x30);
  write_data(b+0x30);
 
}

/*********lcd初始化,写lcd功能与方式控制********/
void lcd_init()
{  out;
   write_com(0x38);
   delay(20);
   write_com(0x0f);
   delay(20);
   write_com(0x06);
   delay(20);
   write_com(0x0c);
   delay(20);
   write_com(0x01);
   delay(20);
  
   
   [page]
   
}

void Clock(void)
{
miao++;
  if(miao==60)
        {
          miao=0;
          fen++;
            if(fen==60)
              {
               fen=0;
               shi++;
                if(shi==24)
                  {
                    shi=0;                                   
                  }
                 write_sfm(2,shi);   
              }
         write_sfm(5,fen);
        }
write_sfm(8,miao);
   
}

void keyscan()
{
 
 if(keyin!=0x0f)
   {
           delay(5);            //延时消抖
            if(keyin != 0x0f)   //再次检测按键状态
            {
             temp=keyin;             
             while(keyin != 0x0f);  //等待按键被放开             
               if(temp==0x0e)
               {
                 keynum++;
                  switch(keynum)
                  {
                    case 1:                  
                         _DINT();
                       // CCTL0 &=~ CCIE; //两种停止时钟的方法效果一样                 
                        write_com(0x80+0x40+9);
                        write_com(0x0f);//光标开始闪
                        break;
                    case 2:
                          write_com(0x80+0x40+6);break;
                    case 3:
                          write_com(0x80+0x40+3);break;
                    case 4:                  
                         keynum=0;
                         write_com(0x0c);//开显示,光标不显示
                       _EINT();
                        //  CCTL0|=CCIE; //使用相应打开时钟的方法
                      break;
                  }
               }          
              if(temp==0x0d)
               {
                 // while(keyin != 0x0d);  //等待按键被放开     
                switch(keynum)
                {
                   case 1:
                     miao++;
                     if(miao==60)miao=0;
                     write_sfm(8,miao);
                     write_com(0x80+0x40+9);
                     break;
                    case 2:
                     fen++;
                     if(fen==60)fen=0;
                     write_sfm(5,fen);
                     write_com(0x80+0x40+6);
                     break;
                    case 3:
                     shi++;
                     if(shi==24)shi=0;
                     write_sfm(2,shi);
                     write_com(0x80+0x40+3);
                     break; 
                }    
              } 
            
            if(temp==0x0b)
               {
                 // while(keyin != 0x0d);  //等待按键被放开     
                switch(keynum)
                {
                   case 1:
                     miao--;
                     if(miao==-1)miao=59;
                     write_sfm(8,miao);
                     write_com(0x80+0x40+9);
                     break;
                    case 2:
                     fen--;
                     if(fen==-1)fen=59;
                     write_sfm(5,fen);
                     write_com(0x80+0x40+6);
                     break;
                    case 3:
                     shi--;
                     if(shi==-1)shi=23;
                     write_sfm(2,shi);
                     write_com(0x80+0x40+3);
                     break; 
                }    
              }   
                                                
            } 
   }
 }

int main( void )
{ P6DIR|=BIT3;
  P6OUT|=BIT3;
  //上两句是打开1602的背光电源
 
  WDTCTL = WDTPW + WDTHOLD;
      
       lcd_init();
       delay(500);
      
    write_com(0x80+0x40+4);
    write_data(':');
    write_com(0x80+0x40+7);
    write_data(':'); 
    write_sfm(2,shi);      
    write_sfm(5,fen);      
    write_sfm(8,miao);
   
   
     CCR0 = 32768 - 1;//设置定时器A的中断时间为1S
    TACTL = TASSEL_1 + MC_1; //计数时钟ACLK, 增计数模式
    CCTL0 |= CCIE; //使能CCR0比较中断
    _EINT();//打开全局中断
   
   
     P1DIR = 0xf0;  //设置P1.0~P.3为输入状态
   // P1DIR = BIT7;  //设置P1.0~P.3为输入状态,P1.7为输出
   // P1OUT = 0;
  //以上两句是在没有独立按键情况下把P1_7拉低成为地线 
   
      while(1)
      {
        keyscan(); 
      //本程序如果加低功耗模式会使按键功能失效        
      }
}

/*******************************************
函数名称:TimerA_ISR
功    能:定时器A的中断服务函数
********************************************/
#pragma vector=TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
    Clock();    
 }
//到此时钟加按键完成

关键字:MSP430  晶振  时钟 引用地址:用MSP430的32768Hz晶振写的时钟

上一篇:基于IIC总线的AD转换模块PCF8591
下一篇:MSP430与DS18B20数码管显示(中断法)

推荐阅读最新更新时间:2024-03-16 13:59

ARM 2440裸奔实现电子时钟
//=================================================================== // File Name : 2440lib.c // Function : S3C2410 PLL,Uart, LED, Port Init // Date : March 20, 2002 // Version : 0.0 // History // 0.0 : Programming start (February 20,2002) - SOP //==================================================================
[单片机]
图像采集压缩SOC系统在FPGA中的实现
图像采集和处理已经成为了现代工业控制中必不可少的环节。传统的方法一般采用的是图像采集卡加工控机来实现整个系统。但随着嵌入式技术的发展,芯片的性能大大增强,嵌入式系统在工业控制系统中普及。作为前端的图像采集系统此时就不适宜再以图像采集卡的形式出现,而应当以更加简捷,方便的接口与主系统相连。 本设计使用Alera的FPGA实现了整个图像采集系统。整个系统完成了图像的采集、压缩和传输。系统采用流行的工业总线CAN做为其传输总线,不仅接口简易,成本低,而且可靠性较高。 系统描述 本设计中图像采集系统预期的目标是每秒采集2~3幅30万像素(640×480)的图像,压缩后通过CAN总线进行传输。按照1:8的压缩比计算,压缩后每帧数据量大
[嵌入式]
MSP430单片机各种寄存器总结(3)——IO
参考资料: 王宏波老师的PPT MSP430F6638用户手册 王宏波老师实验教程 本章最新更新日期:2018.12.22 第三章 IO寄存器 由于这一章的寄存器比较简单,也比较容易记住,在这里就简写了。 关于PxDIR,PxREN和PxOUT在正确I / O配置中的用法 对于P1,P2引脚而言,具有中断能力,利用PxIFG, PxIE,和PxIES 寄存器进行配置。
[单片机]
<font color='red'>MSP430</font>单片机各种寄存器总结(3)——IO
[MSP430] 1.第一个工程
在这一部分中,我们将介绍CCS集成开发环境的一些基本使用方法,并试着编写一个简单的小程序,实现按键打开LED灯的功能。 TI 的 Launchpad 板本身是完整的 MSP430 开发环境,我们所需要做的仅仅是下载安装CCS 集成开发环境(也可以用IAR 等开发环境,这里我们选用CCS),用 Mini-USB 线把MSP430 连接到电脑,你就可以开始编写代码了。 现在我们就试着在 CCS 中新建一个新的工程。我们将写一个简单的小程序,实现按键打开LED 灯的功能。 1. 新建 CCS workspace 打开 CCS,选择 workspace 路径,通常只需要第一次设置为默认。注意,路径中不要使用中文。 2.创
[单片机]
[<font color='red'>MSP430</font>] 1.第一个工程
MSP430F14-直接IO口按键检处理程序
//MSP430F14-直接IO口按键检处理程序 /*************************************************************************/ //分别使用了采个4个按键接到MSP430的通用IO口,按任意一个按键可以使板上的对应LED反转. //例程中,按键采用不断查询方式,以得到键值.并没有使用到低功耗.此程序结构比较适合 //用在非手持设备或非电池供电的设计中.此程序结构比较通用,级用户可参与或套用修改. /*************************************************************************/ #inclu
[单片机]
基于MSP430与CC2420的无线传感器网络的硬件节点设计
传感器节点是组成无线传感器网络的基本单位,是构成无线传感器网络的基础。本文依据传感器节点功耗低、成本低、体积小等硬件限制条件,设计了一种基于射频芯片CC2420和单片机MSP430的无线传感器网络的硬件节点。 硬件节点设计 在进行无线传感节点设计时,应考虑其具有的如下特点:微型化, 应用中的传感器节点要高度集成,保证不会对目标系统的特性造成影响,受外形尺寸限制,模块必须能够集成更多部件;低功耗,网络往往部署在无人值守的地方,节点使用电池供电,不能频繁更换电池,因此,如何节省电能是应用的首要问题;运行速度,网络对节点的实时性要求很高,要求处理器的实时处理能力要强;扩展接口,多功能的传感器产品是发展的趋势,而在前期设计中,不可
[单片机]
MSP430之__intrinsic
最近发现很多地方都看到了__intrinsic,查资料发现是intrinsic.h中的东西,那为什么intrinsic.h中定义的函数都要在前面加__intrinsic啊? 例如: __intrinsic void __no_operation(void); __intrinsic void __enable_interrupt(void); __intrinsic void __disable_interrupt(void); 这个是msp430芯片的编译码,能够被它内核直接识别的,唯一对应msp430内核的东东
[单片机]
如何改善高速ADC时钟信号
您在使用一个高速模数转换器(ADC)时,总是期望性能能够达到产品说明书载明的信噪比(SNR)值,这是很正常的事情。您在测试ADC的SNR时,您可能会连接一个低抖动时钟器件到转换器的时钟输入引脚,并施加一个适度低噪的输入信号。如果您并未从您的转换器获得SNR产品说明书标称性能,则说明存在一些噪声误差源。如果您确信您拥有低噪声输入信号和一种较好的布局,则您的输入信号频率以及来自您时钟器件抖动的组合可能就是问题所在。您会发现“低抖动”时钟器件适合于大多数ADC应用。但是,如果ADC的输入频率信号和转换器的SNR较高,则您可能就需要改善您的时钟电路。 低抖动时钟器件充其量有宣称的1微微秒抖动规范,或者您也可以从一个FPGA生成同样较差的
[电源管理]
如何改善高速ADC<font color='red'>时钟</font>信号
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
  • 最近困扰在心中的一个小疑问终于解惑了~~
    最近在驱动方面一直在概念上不能很好的理解 有时候结合别人写的一点usb的例子能有点感觉,但是因为arm体系里面没有像单片机那样直接讲解引脚 ...
  • 学习ARM开发(1)
    做任何事情之前,一定要想好目标。没有目标的事情是做不好的,也做不成。我的目标就是学习ARM开发,当然是深入的学习。目标如下 :1、学习A ...
  • 学习ARM开发(2)
    天是星期天,刚好在家里休息。又是学习ARM的大好时机了。早上起得很早,因为都想着怎么样搞好这个ARM开发环境,总是心急的。搞得睡觉,也睡 ...
  • 学习ARM开发(4)
    已经把CPU大体架构学会了,当然我之前已经学习过80X86的结构,所以对于像RISC的计算机,也能想像到它是什么样的东西。如果没有学习过《微机 ...
  • 学习ARM开发(6)
    上一次,说到要学习ARM汇编,好,现在就开始。目前我的引导程序是在UBOOT1 1 2上修改过来的,大家可以下载UBOOT的源程序,也许你们会问在那 ...
  • 学习ARM开发(7)
  • 学习ARM开发(8)
  • 学习ARM开发(9)
  • 学习ARM开发(10)
何立民专栏 单片机及嵌入式宝典

北京航空航天大学教授,20余年来致力于单片机与嵌入式系统推广工作。

换一换 更多 相关热搜器件
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2024 EEWORLD.com.cn, Inc. All rights reserved