S35390驱动程序

发布者:独行于世最新更新时间:2016-08-25 来源: eefocus关键字:S35390  驱动程序 手机看文章 扫描二维码
随时随地手机看文章
/*******************************************************************/

 /*                         时钟芯片驱动程序                        */
 /*******************************************************************/
#include "msp430x41x.h"
#include "delay.h"
#include "iodefine.h"
#include "all_variable.h"
 /*****************************************************************/
 /*                       内部函数声明                            */
 /*****************************************************************/
void  S35390A_SDA_HIGH(void);             //SDA脚输出高电平
void  S35390A_SDA_LOW(void);              //SDA脚输出低电平 
void  S35390A_SCL_HIGH(void);             //SCK脚输出高电平
void  S35390A_SCL_LOW(void);              //SDA脚输出低电平
void S35390A_START(void);                 //启动S35390
void S35390A_STOP(void);                  //停止S35390
unsigned char S35390A_GETACK(void);       //获得ACK信号
void S35390A_SETACK(void);                //输出ACK信号
void S35390A_SETNCK(void);                //输出NACK信号
unsigned char S35390A_RECEIVE_BYTE(void); //从S35390接收一个字节数据 
void S35390A_SEND_BYTE(unsigned char senddata);  //向S35390发送一个字节数据
extern void DELAYeightNOP(void);
extern void DELAYthreeNOP(void);
extern void SetS35390ATime(void);
extern void readS35390ATime(void);
unsigned char S35390A_WRITE(unsigned char opt,unsigned char count);//向S35390A写数据
unsigned char S35390A_READ(unsigned char opt,unsigned char count); //从S35390A读数据
unsigned char S35390A_SWAP_BYTE(unsigned char swdata); //字节首尾交换
unsigned char S35390A_CACULATE_WEEK(unsigned char year,unsigned char month,unsigned char date);//通过年月日计算星期
void S35390A_INIT(void);//S35390A初始化
/*********************************************************
Function:  S35390A_SDA_HIGH(void)
Description:  SDA脚输出高电平  
Input:  none
output: none
Return: none
**********************************************************/
void  S35390A_SDA_HIGH(void)
{
  S35390A_SDA_DIR|=S35390A_SDA;      // set SDA as output pin    
  S35390A_SDA_OUT|=S35390A_SDA;      //set SDA pin high
  _NOP();
  return;
}

/**********************************************************
Function:  S35390A_SDA_low(void)
Description:  SDA脚输出低电平  
Input:  none
output: none
Return: none
**********************************************************/
void  S35390A_SDA_LOW(void)
{
  S35390A_SDA_DIR|=S35390A_SDA;       //set SDA as output pin  
  S35390A_SDA_OUT&=~S35390A_SDA;    //set SDA pin low
  _NOP();
  return;
}

/**********************************************************
Function:  S35390A_SCL_HIGH(void)
Description:  SCK脚输出高电平  
Input:  none
output: none
Return: none
**********************************************************/
void  S35390A_SCL_HIGH(void)
{
    S35390A_SCL_DIR|=S35390A_SCL;     // set SCK as output pin 
    S35390A_SCL_OUT|=S35390A_SCL;     //set SCK pin high
    _NOP();
    return;
}

/**********************************************************
Function:  S35390A_SCL_low(void)
Description:  SDA脚输出低电平  
Input:  none
output: none
Return: none
**********************************************************/
void  S35390A_SCL_LOW(void)

  S35390A_SCL_DIR|=S35390A_SCL;       //set SCK as output pin  
  S35390A_SCL_OUT&=~S35390A_SCL;    //set SCK pin low
  _NOP();
  return;
}

/**********************************************************
Function:  S35390A_RECEIVE_BYTE(void)
Description:  从S35390接收一个字节数据  
Input:  none
output: none
Return: none
**********************************************************/
unsigned char S35390A_RECEIVE_BYTE(void)
{
  unsigned char S35390A_buf=0;
  unsigned char w;
  S35390A_SDA_DIR &= ~S35390A_SDA;    //输入方式
  //S35390A_SDA_OUT|=1<   Delay_Nus(10);
  for(w=0; w<8; w++)
  {
    S35390A_SCL_HIGH();
    if((S35390A_SDA_IN & S35390A_SDA))
    {
      S35390A_buf |= (1<     }

    S35390A_SCL_LOW();
    DELAYeightNOP();
  }
  return(S35390A_buf);
}

/**********************************************************
Function:  S35390A_SEND_BYTE(void)
Description:  向S35390发送一个字节数据  
Input:  none
output: none
Return: none
**********************************************************/
void S35390A_SEND_BYTE(unsigned char senddata)
{
   unsigned char w;
   for(w=0;w<8;w++)
   {
     if(senddata&0x80)
     {
       S35390A_SDA_HIGH();
     }
     else
     {
       S35390A_SDA_LOW();
     }
     
     S35390A_SCL_HIGH();
     DELAYthreeNOP();
     
     senddata<<=1;
     
     S35390A_SCL_LOW();
     DELAYeightNOP();
   }
}

/**********************************************************
Function:  S35390A_START(void)
Description:  I2C通讯启动标志  
Input:  none
output: none
Return: none
**********************************************************/
void S35390A_START(void)
{
  S35390A_SDA_HIGH();        //高
  
  S35390A_SCL_HIGH();        //高
  DELAYthreeNOP(); 
  
  S35390A_SDA_LOW();         //低
  DELAYthreeNOP();
  
  S35390A_SCL_LOW();         //低
  DELAYeightNOP();
}

/**********************************************************
Function:  S35390A_STOP(void)
Description:  I2C通讯结束标志  
Input:  none
output: none
Return: none
**********************************************************/
void S35390A_STOP(void)
{
  S35390A_SDA_LOW();        //低
  
  S35390A_SCL_HIGH();       //高
  DELAYthreeNOP();
  
  S35390A_SDA_HIGH();       //高
  DELAYeightNOP();
  
  
  //S35390A_SCL_LOW();        //低
  //DELAYeightNOP();
  
 
}

/**********************************************************
Function:  S35390A_GETACK(void)
Description:  获得ACK信号 
Input:  none
output: none
Return: temp
**********************************************************/
unsigned char S35390A_GETACK(void)
{
  unsigned char w=0;
  unsigned char z=100;
  _NOP();
  _NOP();
  S35390A_SCL_LOW();
  S35390A_SDA_DIR&=~S35390A_SDA;  //SDA input
  S35390A_SCL_OUT|=S35390A_SCL;
  _NOP();
wait:
  w=((S35390A_SDA_IN&S35390A_SDA));
  if((w!=0)&&((z--)!=0))
  {
     goto wait;
  }
  S35390A_SCL_LOW();
  DELAYeightNOP();
  return(w);
}

/**********************************************************
Function: S35390A_SETACK(void)
Description:  输出ACK信号  
Input:  none
output: none
Return: none
**********************************************************/
void S35390A_SETACK(void)
{
  S35390A_SCL_LOW();
  DELAYeightNOP();
  
  S35390A_SDA_LOW(); 
  DELAYthreeNOP();
  
  S35390A_SCL_HIGH();
  DELAYthreeNOP();
  
  S35390A_SCL_LOW();
  DELAYeightNOP();
}

/**********************************************************
Function:  S35390A_SETNCK(void)
Description:  输出NCK信号  
Input:  none
output: none
Return: none
**********************************************************/
void  S35390A_SETNCK(void)
{
  S35390A_SCL_LOW();
  DELAYeightNOP();
  
  S35390A_SDA_HIGH(); 
  DELAYthreeNOP();
  
  S35390A_SCL_HIGH();
  DELAYthreeNOP();
  
  S35390A_SCL_LOW();
  DELAYeightNOP();
}

/**********************************************************
Function:  S35390A_WRITE(unsigned char opt,unsigned char adr,unsigned char count)
Description:  向S35390A写数据  
Input:  opt:装置命今,count:写数据的字节个数
output: none
Return: 0或1
**********************************************************/
unsigned char S35390A_WRITE(unsigned char opt,unsigned char count)
{
  unsigned char s_temp=0;
  unsigned char ws;
  S35390A_START();              //启动总线
  S35390A_SEND_BYTE(opt);       //发送装置命今字节
  s_temp=S35390A_GETACK();      //接收应答信号
  if((s_temp & S35390A_SDA))
  {
    S35390A_STOP();
    return(0);
  }
  
  for(ws=0;ws   {
    s_temp=s35390a[ws];
    S35390A_SEND_BYTE(s_temp);
    s_temp=S35390A_GETACK();    //接收应答信号
    if((s_temp & S35390A_SDA))
    {
      S35390A_STOP();
      return(0);
    }
  }
  
  S35390A_STOP();              //停止总线
  return(1);
}

/**********************************************************
Function:  S35390A_READ(unsigned char opt,unsigned char adr,unsigned char count)
Description:  从S35390A读数据  
Input:  none
output: none
Return: none
**********************************************************/
unsigned char S35390A_READ(unsigned char opt,unsigned char count)
{
  unsigned char s_temp=0;
  unsigned char ws;
  S35390A_START();              //启动总线
  S35390A_SEND_BYTE(opt);       //发送装置命今字节
  s_temp=S35390A_GETACK();      //接收应答信号
  if((s_temp & S35390A_SDA))
  {
    S35390A_STOP();
    return(0);
  }
  
  for(ws=0;ws   {
    s35390a[ws] = S35390A_RECEIVE_BYTE();
    if(ws==(count-1))
    {
      S35390A_SETNCK();        //不发回应
    }
    else
    {
      S35390A_SETACK();        //发回应
    }
  }
  
  S35390A_STOP();              //停止总线
  return(1);
}

/**********************************************************
Function:  S35390A_SWAP_BYTE(unsigned char swdata)
Description:  字节首尾位交换
Input:  none
output: none
Return: none
**********************************************************/
unsigned char S35390A_SWAP_BYTE(unsigned char swdata)
{
  unsigned char swtemp = swdata;
  swtemp = ((swtemp & 0x55) << 1) | ((swtemp & 0xaa) >> 1);    //相邻两位对换
  swtemp = ((swtemp & 0x33) << 2) | ((swtemp & 0xcc) >> 2);    //
  swtemp = ((swtemp & 0x0f) << 4) | ((swtemp & 0xf0) >> 4);   
  return(swtemp);
}

/**********************************************************
Function:  S35390A_CACULATE_WEEK(unsigned char year,unsigned char month,unsigned char data)
Description:  通过年月日计算星期
Input:  year,month,date
output: none
Return: week
**********************************************************/
unsigned char S35390A_CACULATE_WEEK(unsigned char year,unsigned char month,unsigned char date)
{
  unsigned char wtemp;
 
  if(month==1)
  {
    year-=1;
    month=13;
  }
  else
  {
    if(month==2)
    {
      year-=1;
      month=14;
    }
  }
  
  wtemp=year+year/4+13*((month+1)/5)+date-36;
  wtemp%=7;
  return(wtemp);
}

/**********************************************************
Function:  S35390A_INIT(void)
Description:  S35390A初始化
Input:  none
output: none
Return: week
**********************************************************/
void S35390A_INIT(void)
{
  S35390A_SDA_DIR |= S35390A_SDA;         //输出
  S35390A_SCL_DIR |= S35390A_SCL;
  S35390A_INT1_DIR &= ~S35390A_INT1;     //输入
 // S35390A_INT2_DIR &= ~(1<   S35390A_SDA_OUT |= S35390A_SDA;         //输出高电平
  S35390A_SCL_OUT |= S35390A_SCL;
  S35390A_INT1_OUT |=S35390A_INT1;
 // S35390A_INT2_OUT |= 1<   s35390a[0] = 0x00;            
  S35390A_WRITE(0x62, 0x01);   //清除报警1中断使能,使INT1脚输出高电平
  Delay_Nms(5);                //延时
  
  if(S35390A_READ(0x61,0x01))
  {
    if((s35390a[0]&0xc0)!=0)
    {
      s35390a[0]=0xc0;
      S35390A_WRITE(0x60,0x01);
    }
  }
  if(S35390A_READ(0x63,0x01))
  {
    if((s35390a[0]&0x80)!=0)
    {
      s35390a[0]=0x0c;
      S35390A_WRITE(0x60,0x01);
    }
  }
  Delay_Nms(5);
  s35390a[0]=0x40;           //设置为24小时制
  S35390A_WRITE(0x60,0x01);
  Delay_Nms(5);
  
  s35390a[0]=0x20;           //设置报警1中断使能
  S35390A_WRITE(0x62,0x01);   //设置报警1中断使能
  
  s35390a[0] =0;
  s35390a[1] = S35390A_SWAP_BYTE((0x08<<4)|0x00); //时;
  s35390a[2] =0;
  S35390A_WRITE(0x68,0x03);   //中断时间为每天的0时
  
  S35390A_INT1_DIR &= ~S35390A_INT1; //置为输入方式
  S35390A_INT1_OUT |=  S35390A_INT1;    //置为高电平
  P1IE|=S35390A_INT1;                  //中断使能
  P1IES|=S35390A_INT1;                 //下降沿产生中断
}
void SetS35390ATime(void)
{
  s35390a[0] = S35390A_SWAP_BYTE(twdata[7]);      //年
  s35390a[1] = S35390A_SWAP_BYTE(twdata[6]%32);   //月
  s35390a[2] = S35390A_SWAP_BYTE(twdata[4]%64);   //日
  s35390a[3] = 0x00;                               //星期不使用为00
  s35390a[4] = S35390A_SWAP_BYTE(twdata[3]%64);   //时
  s35390a[5] = S35390A_SWAP_BYTE(twdata[2]%128);  //分
  s35390a[6] = 0x00;                               //秒为00
  S35390A_WRITE(0x64,0x07);                        //写时间和日期
}

void readS35390ATime(void)
{
  S35390A_READ(0x65,0x07);                         //读时间
  Delay_Nms(5);  
  trdata[6]=s35390a[0];                           //年
  trdata[5]=s35390a[1]%32;                        //月
  months=trdata[5];
  trdata[3]=s35390a[2]%64;                        //日
  trdata[2]=s35390a[4]%64;                        //时
  trdata[1]=s35390a[5]%128;                       //分
}

关键字:S35390  驱动程序 引用地址:S35390驱动程序

上一篇:中断函数写法的比较
下一篇:430单片机烧录问题和接线方法

推荐阅读最新更新时间:2024-03-16 15:07

液晶显示屏模块1602驱动程序源代码
液晶显示屏模块1602驱动程序源代码 //lcd1602 drive program for 51 mcu //designed by Wangchao //2006-6-14 #i nclude "reg52.h" /********************************************************************/ //lcd part #define LINE1 0 #define LINE2 1 #define LINE1_HEAD 0x80 #define LINE2_HEAD 0xC0 #define LCD_DELAY_TIME 40 #define DAT
[单片机]
【AT91SAM3S】SAM3S-EK Demo工程中,LCD驱动程序的加载
为了调试LCD,在英倍特的板子上烧Atmel的sam3s-ek_demo_1.4_source示例代码.LCD显示正常了,却找不到LCD的驱动究竟在哪。 花了好久,追踪到了这个执行过程。 进入main函数--_SetupHardware()----DISP_Initialize() ----_aDISP_Backends =&sDISP_Backend_ILI9325 ; static __no_init SDISPBackend* _aDISP_Backends ; _aDISP_Backends =&sDISP_Backend_ILI9325 ; 然后就是结构体: SDISPBackend是一个函数指针结构体。其定
[单片机]
基于430单片机的NRF905收发驱动程序
#include msp430x14x.h #include BaseType.h #include string.h #include ctype.h #define WaitKeyDw 100 #define WaitKeyUp 101 #define KeyDwTimes 30 #define WRC 0x00 //W_RF_CONFIG #define RRC 0x10 //R_RF_CONFIG #define WTP 0x20 //W_TX_PAYLOAD #define RTP 0x21 //R_TX_PAYLOAD #d
[单片机]
mini2440的LEDS驱动程序和测试程序详解
一 leds的驱动程序 位置:linux 2.6.29/drivers/char/mini2440_leds.c #include linux/miscdevice.h #include linux/delay.h #include asm/irq.h #include mach/regs-gpio.h //具体头文件位置/opt/FriendlyARM/mini2440/linux-2.6.29/arch/arm/mach-s3c2410/include/mach/*.h #include mach/hardware.h #include linux/kernel.h #include linux/module.h //具体的
[单片机]
基于RTX的舵机控制系统研制
    舵机控制是虚拟飞行实验中的关键技术,为满足测试的实时性要求,文中设计了一套基于Windows RTX环境下的舵机控制系统,通过采集天平、陀螺仪、舵机、光电编码器信号,分析飞机各主要部件的气动特性。该控制系统的主要功能包括:舵机控制软件可以自动完成对舵机的上电及解锁操作;舵机响应可根据实际需要作出相应的模式选择和参数设置;采集到的数据可做到实时界面显示,用于现场实验分析。 1 RTX实时模块     在工业控制、航空航天等领域,对系统实时性有很高的要求。系统的事件响应如果不确定或超时,就可能会导致系统出错,甚至崩溃,Windows系统很难满足实时性的要求。RTX正是应这一要求,利用Windows平台提供的丰富的设备驱动模
[嵌入式]
S35390驱动程序
/*******************************************************************/ /* 时钟芯片驱动程序 */ /*******************************************************************/ #include msp430x41x.h #include delay.h #include iodefine.h #include all_variable.h /****************************************************
[单片机]
AD9850驱动程序--MSP430版本
前段时间忙着画板子搞运放搞滤波了,程序更新的少,发现MSP430不是太好用,尤其Timer,不过也与我使用内部晶振有关,产生正玄波之前用MSP430发出PWM,再进行滤波变为正弦波太麻烦了,这次改用DDS芯片,今天板子回来一会就调了出来很方便。 AD9850为一款DDS芯片,这里不做什么详细介绍了,有两种接口:serial 和 parrel,两种接口驱动均完成 1 /* 2 * AD9850.h 3 * 4 * Created on: 2013-7-12 5 * Author: Allen 6 */ 7 8 #ifndef AD9850_H_ 9 #define AD9850_H_ 10 11 #in
[单片机]
Windows9x/NT及2000下中断驱动程序的统一化处理
摘要: 针对Windows9x/NT及Windows2000操作系统,利用Windriver工具包,实现了在多种操作系统下对硬件中断驱动程序进行统一化处理,保证了程序在不同的操作系统下良好的移植性矣兼容性,并给出了用C语言编写的程序实例。 关键词: Windows9x/NT/2000 虚拟设备驱动程序(VxD) Windriver工具包 中断驱动程序的统一化处理 Windows以其友好的图形用户界面,使得它不仅成为办公管理首选的操作系统,也日益受到工程技术人员的关注,逐渐取代DOS而成为主流的工程应用控制平台。但是,Windows系统为了保证平台的安全与完
[嵌入式]
小广播
添点儿料...
无论热点新闻、行业分析、技术干货……
设计资源 培训 开发板 精华推荐

最新单片机文章
何立民专栏 单片机及嵌入式宝典

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

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