ds1302.c
上传用户:xs588588
上传日期:2021-03-30
资源大小:242k
文件大小:4k
源码类别:

DSP编程

开发平台:

C/C++

  1. #include <MSP430X14X.h>
  2. #define CE BIT0
  3. #define SDA BIT1
  4. #define SCLK    BIT2
  5. void CE_Enable(void);
  6. void CE_Disable(void);
  7. void SCLK_HI(void);
  8. void SCLK_LO(void);
  9. void WriteByte(char nVal);     
  10. char ReadByte(void);      
  11. void WriteTo1302(char nAddr, char nVal);
  12. char ReadFrom1302(char nAddr);
  13. void BurstWriteTime(char *pWClock);
  14. void BurstReadTime(char *pRClock);
  15. void BurstWriteRam(char *pWReg);
  16. void BurstReadRam(char *pRReg);
  17. void SetTime(char *pClock);         
  18. void GetTime(char pTime[]); 
  19. void Port_Init(void)
  20. {
  21.     P1DIR = 0;
  22. //设置CE为输出管脚
  23.     P1DIR |= CE;   
  24. //设置SCLK为输出管脚
  25.     P1DIR |= SCLK;    
  26.     return;
  27. }
  28. void CE_Enable(void)
  29. {
  30.     P1OUT |= CE;
  31.     return;
  32. }
  33. void CE_Disable(void)
  34. {
  35.     P1OUT &= ~(CE);
  36.     return;
  37. }
  38. void SCLK_HI(void)
  39. {
  40. P1OUT |= SCLK;
  41.     return;
  42. }
  43. void SCLK_LO(void)
  44. {
  45. P1OUT &= ~(SCLK);
  46.     return;
  47. }
  48. void WriteByte(char nVal) 
  49.     char i,j;
  50. char nTemp = nVal;
  51. char nSend;
  52. //设置DATA为输出管脚
  53.     P1DIR |= SDA; 
  54. _NOP();
  55.     _NOP();
  56.     _NOP();
  57.     _NOP();
  58.     for(i = 0; i < 8; i++)
  59.     {
  60. nSend = (nTemp & 0x01);
  61. if(nSend == 1)
  62. {
  63. P1OUT |= SDA;
  64. }
  65. else
  66. {
  67. P1OUT &= ~(SDA);
  68. }
  69.         SCLK_HI();
  70. for(j = 10;j > 0;j--) ;
  71. SCLK_LO();
  72. for(j = 10;j > 0;j--) ;
  73. nTemp >>= 1;
  74.     } 
  75. }
  76. char ReadByte(void) 
  77.     char nTemp = 0;
  78.     int i;
  79.     int j;
  80. //设置DATA为输入管脚
  81.     P1DIR |= SDA;
  82. _NOP();
  83.     _NOP();
  84.     _NOP();
  85.     _NOP();
  86.     for(i = 0; i < 8; i++)
  87.     {
  88. SCLK_HI();
  89.         if(P1IN & SDA)
  90.      {
  91.          nTemp |= (0x01 << i);
  92.      }
  93.      for(j = 10;j > 0;j--);
  94. SCLK_LO();
  95.     } 
  96.     return nTemp; 
  97. }
  98. void WriteTo1302(char nAddr, char nVal)
  99. {
  100. CE_Disable();
  101. SCLK_LO();
  102. CE_Enable();
  103. //地址,命令
  104. WriteByte(nAddr);
  105. //写1Byte数据
  106. WriteByte(nVal);
  107. SCLK_HI();
  108. CE_Disable();
  109. return;
  110. char ReadFrom1302(char nAddr)
  111. {
  112.     char nData;
  113. CE_Disable();
  114. SCLK_LO();
  115. CE_Enable();
  116. //地址,命令
  117. WriteByte(nAddr);
  118. //读1Byte数据
  119.     nData = ReadByte();
  120. SCLK_HI();
  121. CE_Disable();
  122.     return(nData);
  123. }
  124. void BurstWriteTime(char *pClock)
  125. {
  126.     char i;
  127. //控制命令,WP=0,写操作
  128.     WriteTo1302(0x8e,0x00);         
  129.     CE_Disable();
  130.     SCLK_LO();
  131.     CE_Enable();
  132. //0xbe:时钟多字节写命令
  133.     WriteByte(0xbe); 
  134. //8Byte = 7Byte 时钟数据 + 1Byte 控制
  135.     for (i = 8; i > 0; i--)     
  136.     {
  137. //写1Byte数据
  138.         WriteByte(*pClock); 
  139.         pClock++;
  140.     }
  141.     SCLK_HI();
  142.     CE_Disable();
  143. return;
  144. void BurstReadTime(char *pClock)
  145. {
  146.     char i;
  147.     CE_Disable();
  148.     SCLK_LO();
  149.     CE_Enable();
  150. //0xbf:时钟多字节读命令
  151.     WriteByte(0xbf);             
  152.     for (i = 8; i > 0; i--) 
  153.     {
  154. //读1Byte数据
  155.         *pClock = ReadByte();   
  156.         pClock++;
  157.     }
  158.     SCLK_HI();
  159.     CE_Disable();
  160. return ;
  161. }
  162. void BurstWriteRam(char *pReg)
  163. {
  164.     char i;
  165. //控制命令,WP=0,写操作
  166.     WriteTo1302(0x8e,0x00);         
  167.     CE_Disable();
  168.     SCLK_LO();
  169.     CE_Enable();
  170. //0xfe:时钟多字节写命令
  171.     WriteByte(0xfe);  
  172. //31Byte 寄存器数据
  173.     for (i = 31; i > 0; i--)       
  174.     {
  175. //写1Byte数据
  176.         WriteByte(*pReg);    
  177.         pReg++;
  178.     }
  179.     SCLK_HI();
  180.     CE_Disable();
  181. return;
  182. void BurstReadRam(char *pReg)
  183. {
  184.     char i;
  185.     CE_Disable();
  186.     SCLK_LO();
  187.     CE_Enable();
  188. //0xff:时钟多字节读命令
  189.     WriteByte(0xff);    
  190. //31Byte 寄存器数据
  191.     for (i = 31; i > 0; i--)          
  192.     {
  193. //读1Byte数据
  194.         *pReg = ReadByte();  
  195.         pReg++;
  196.     }
  197.     SCLK_HI();
  198.     CE_Disable();
  199. return;
  200. }
  201. void SetTime(char *pClock) 
  202. {
  203.     char i;
  204.     char nAddr = 0x80; 
  205. //控制命令,WP=0,写操作
  206.     WriteTo1302(0x8e,0x00);           
  207.     for(i = 7; i > 0; i--)
  208.     { 
  209. //秒 分 时 日 月 星期 年
  210.         WriteTo1302(nAddr,*pClock);  
  211.         pClock++;
  212.         nAddr += 2;
  213.     }
  214. //控制命令,WP=1,写保护?
  215.     WriteTo1302(0x8e,0x80); 
  216. return;
  217. }
  218. void GetTime(char pTime[]) 
  219. {
  220.     char i;
  221.     char nAddr = 0x81;
  222.     for (i = 0; i < 7; i++)
  223.     {
  224. //格式为: 秒 分 时 日 月 星期 年
  225.         pTime[i] = ReadFrom1302(nAddr);
  226.         nAddr += 2;
  227.     }
  228. }