ds1302.c
资源名称:msp430.rar [点击查看]
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:4k
源码类别:
DSP编程
开发平台:
C/C++
- #include <MSP430X14X.h>
- #define CE BIT0
- #define SDA BIT1
- #define SCLK BIT2
- void CE_Enable(void);
- void CE_Disable(void);
- void SCLK_HI(void);
- void SCLK_LO(void);
- void WriteByte(char nVal);
- char ReadByte(void);
- void WriteTo1302(char nAddr, char nVal);
- char ReadFrom1302(char nAddr);
- void BurstWriteTime(char *pWClock);
- void BurstReadTime(char *pRClock);
- void BurstWriteRam(char *pWReg);
- void BurstReadRam(char *pRReg);
- void SetTime(char *pClock);
- void GetTime(char pTime[]);
- void Port_Init(void)
- {
- P1DIR = 0;
- //设置CE为输出管脚
- P1DIR |= CE;
- //设置SCLK为输出管脚
- P1DIR |= SCLK;
- return;
- }
- void CE_Enable(void)
- {
- P1OUT |= CE;
- return;
- }
- void CE_Disable(void)
- {
- P1OUT &= ~(CE);
- return;
- }
- void SCLK_HI(void)
- {
- P1OUT |= SCLK;
- return;
- }
- void SCLK_LO(void)
- {
- P1OUT &= ~(SCLK);
- return;
- }
- void WriteByte(char nVal)
- {
- char i,j;
- char nTemp = nVal;
- char nSend;
- //设置DATA为输出管脚
- P1DIR |= SDA;
- _NOP();
- _NOP();
- _NOP();
- _NOP();
- for(i = 0; i < 8; i++)
- {
- nSend = (nTemp & 0x01);
- if(nSend == 1)
- {
- P1OUT |= SDA;
- }
- else
- {
- P1OUT &= ~(SDA);
- }
- SCLK_HI();
- for(j = 10;j > 0;j--) ;
- SCLK_LO();
- for(j = 10;j > 0;j--) ;
- nTemp >>= 1;
- }
- }
- char ReadByte(void)
- {
- char nTemp = 0;
- int i;
- int j;
- //设置DATA为输入管脚
- P1DIR |= SDA;
- _NOP();
- _NOP();
- _NOP();
- _NOP();
- for(i = 0; i < 8; i++)
- {
- SCLK_HI();
- if(P1IN & SDA)
- {
- nTemp |= (0x01 << i);
- }
- for(j = 10;j > 0;j--);
- SCLK_LO();
- }
- return nTemp;
- }
- void WriteTo1302(char nAddr, char nVal)
- {
- CE_Disable();
- SCLK_LO();
- CE_Enable();
- //地址,命令
- WriteByte(nAddr);
- //写1Byte数据
- WriteByte(nVal);
- SCLK_HI();
- CE_Disable();
- return;
- }
- char ReadFrom1302(char nAddr)
- {
- char nData;
- CE_Disable();
- SCLK_LO();
- CE_Enable();
- //地址,命令
- WriteByte(nAddr);
- //读1Byte数据
- nData = ReadByte();
- SCLK_HI();
- CE_Disable();
- return(nData);
- }
- void BurstWriteTime(char *pClock)
- {
- char i;
- //控制命令,WP=0,写操作
- WriteTo1302(0x8e,0x00);
- CE_Disable();
- SCLK_LO();
- CE_Enable();
- //0xbe:时钟多字节写命令
- WriteByte(0xbe);
- //8Byte = 7Byte 时钟数据 + 1Byte 控制
- for (i = 8; i > 0; i--)
- {
- //写1Byte数据
- WriteByte(*pClock);
- pClock++;
- }
- SCLK_HI();
- CE_Disable();
- return;
- }
- void BurstReadTime(char *pClock)
- {
- char i;
- CE_Disable();
- SCLK_LO();
- CE_Enable();
- //0xbf:时钟多字节读命令
- WriteByte(0xbf);
- for (i = 8; i > 0; i--)
- {
- //读1Byte数据
- *pClock = ReadByte();
- pClock++;
- }
- SCLK_HI();
- CE_Disable();
- return ;
- }
- void BurstWriteRam(char *pReg)
- {
- char i;
- //控制命令,WP=0,写操作
- WriteTo1302(0x8e,0x00);
- CE_Disable();
- SCLK_LO();
- CE_Enable();
- //0xfe:时钟多字节写命令
- WriteByte(0xfe);
- //31Byte 寄存器数据
- for (i = 31; i > 0; i--)
- {
- //写1Byte数据
- WriteByte(*pReg);
- pReg++;
- }
- SCLK_HI();
- CE_Disable();
- return;
- }
- void BurstReadRam(char *pReg)
- {
- char i;
- CE_Disable();
- SCLK_LO();
- CE_Enable();
- //0xff:时钟多字节读命令
- WriteByte(0xff);
- //31Byte 寄存器数据
- for (i = 31; i > 0; i--)
- {
- //读1Byte数据
- *pReg = ReadByte();
- pReg++;
- }
- SCLK_HI();
- CE_Disable();
- return;
- }
- void SetTime(char *pClock)
- {
- char i;
- char nAddr = 0x80;
- //控制命令,WP=0,写操作
- WriteTo1302(0x8e,0x00);
- for(i = 7; i > 0; i--)
- {
- //秒 分 时 日 月 星期 年
- WriteTo1302(nAddr,*pClock);
- pClock++;
- nAddr += 2;
- }
- //控制命令,WP=1,写保护?
- WriteTo1302(0x8e,0x80);
- return;
- }
- void GetTime(char pTime[])
- {
- char i;
- char nAddr = 0x81;
- for (i = 0; i < 7; i++)
- {
- //格式为: 秒 分 时 日 月 星期 年
- pTime[i] = ReadFrom1302(nAddr);
- nAddr += 2;
- }
- }