找回密码
 立即注册
查看: 416|回复: 0

STC89C52RC 驱动16x64LED点阵模块驱动记录(五)DS1302时钟

[复制链接]
  • 打卡等级:以坛为家II
  • 打卡总天数:513
  • 最近打卡:2025-05-07 08:04:39

17

主题

65

回帖

1674

积分

金牌会员

积分
1674
发表于 2023-11-24 21:58:38 | 显示全部楼层 |阅读模式
1.main.c

  1. #include <STC89C5xRC.H>
  2. #include <intrins.h>
  3. #include <absacc.h>
  4. #include "ds1302.h"
  5. #include "Timer0.h"
  6. #define FLASH_ADDR_BASE 0x0000
  7. sbit SH_CP = P1^5;
  8. sbit DS = P2^7;
  9. sbit ST_CP = P1^6;
  10. typedef unsigned int Uint16;
  11. typedef unsigned char Uint8;
  12. unsigned char code Table_Number[][16] =
  13. {
  14. {0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,0xFF},/*"0",0*/
  15. {0xFF,0xFF,0xC1,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xF1,0xF7,0xFF,0xFF,0xFF},/*"1",1*/
  16. {0xFF,0xFF,0x81,0xBD,0xFB,0xF7,0xEF,0xDF,0xDF,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,0xFF},/*"2",2*/
  17. {0xFF,0xFF,0xE3,0xDD,0xBD,0xBF,0xBF,0xDF,0xE7,0xDF,0xBD,0xBD,0xC3,0xFF,0xFF,0xFF},/*"3",3*/
  18. {0xFF,0xFF,0x87,0xDF,0xDF,0x81,0xDD,0xDD,0xDB,0xDB,0xD7,0xCF,0xDF,0xFF,0xFF,0xFF},/*"4",4*/
  19. {0xFF,0xFF,0xE3,0xDD,0xBD,0xBF,0xBF,0xD9,0xE5,0xFD,0xFD,0xFD,0x81,0xFF,0xFF,0xFF},/*"5",5*/
  20. {0xFF,0xFF,0xE7,0xDB,0xBD,0xBD,0xBD,0xD9,0xE5,0xFD,0xFD,0xDB,0xC7,0xFF,0xFF,0xFF},/*"6",6*/
  21. {0xFF,0xFF,0xF7,0xF7,0xF7,0xF7,0xF7,0xF7,0xEF,0xEF,0xDD,0xDD,0x81,0xFF,0xFF,0xFF},/*"7",7*/
  22. {0xFF,0xFF,0xC3,0xBD,0xBD,0xBD,0xDB,0xE7,0xDB,0xBD,0xBD,0xBD,0xC3,0xFF,0xFF,0xFF},/*"8",8*/
  23. {0xFF,0xFF,0xE3,0xDB,0xBF,0xBF,0xA7,0x9B,0xBD,0xBD,0xBD,0xDB,0xE7,0xFF,0xFF,0xFF},/*"9",9*/
  24. {0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,0xE7,0xE7,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF},/*":",10*/
  25.        
  26. };
  27. unsigned char xdata Table_BUFF[128];
  28. unsigned char KeyNumber,MODE,TimeSetSelect,TimeSetFlashFlag;
  29. void TimeSet();
  30. unsigned char YEAR(unsigned char year,month);
  31.        
  32. void delayms(unsigned int m)
  33. {
  34.         int i,j;
  35.         for(i=0; i<m; i++)
  36.                 for(j=0; j<120; j++);
  37. }
  38. void HC595(unsigned char dat)
  39. {
  40.         unsigned char j;
  41.         for(j=0;j<8;j++)
  42.         {
  43.                 SH_CP = 0;        //为移位准备
  44.                 DS = dat & 0x01;        //先低位
  45.                 dat=dat>>1;
  46.                 SH_CP =1;          //上升沿,移位
  47.         }
  48. }
  49. void Matrix16x16(unsigned char num)
  50. {
  51.         unsigned char k,i;
  52.         unsigned int m,n;
  53.         unsigned char Char_num=num*32;
  54.        
  55. //        for(m=0;m<Char_num;m++)
  56. //        {
  57.                
  58.                 for(n=0;n<32;n++)
  59.                 {
  60.                         for(k=0;k<16;k++)
  61.                         {
  62.                                
  63.                                 for(i=0;i<num;i++)
  64.                                 {
  65.                                         HC595(Table_BUFF[(16*2*i+k)]);                //下半部分,不动
  66.                                         HC595(Table_BUFF[(16*(2*i+1)+k)]);                //上半部分,不动
  67.                                 }
  68.                                
  69.                                 ST_CP = 0;
  70.                                 ST_CP = 1; //并行输出
  71.                                 P1=k;
  72.                                 //P1=0xFF;
  73.                                 //delayms(1);
  74.                         }
  75.                 }
  76.         //}
  77. }
  78. void makeTimeString(){
  79.         Uint8 i,j;
  80.         Uint8 h,l;
  81.         for(i=3;i<=3;i++)
  82.         {
  83.                 for(j=0;j<16;j++)
  84.                 {
  85.                         h=DS1302_Time[i]/10;
  86.                         l=DS1302_Time[i]%10;
  87.                        
  88.                        
  89.                         Table_BUFF[(i-3)*16+j]=Table_Number[h][j];
  90.                         Table_BUFF[(i-2)*16+j]=Table_Number[l][j];
  91.                 }
  92.         }
  93.         for(j=0;j<16;j++)
  94.         {
  95.                 h=DS1302_Time[i]/10;
  96.                
  97.                 //Table_BUFF[32+j]=Table_Number[h][j];
  98.                 Table_BUFF[48+j]=Table_Number[h][j];
  99.         }
  100.         for(j=0;j<16;j++)
  101.         {
  102.                 //Table_BUFF[48+j]=Table_Number[10][j];
  103.                 Table_BUFF[32+j]=Table_Number[10][j];
  104.         }
  105.                 for(j=0;j<16;j++)
  106.         {
  107.                 //Table_BUFF[64+j]=Table_Number[10][j];
  108.                 Table_BUFF[80+j]=Table_Number[10][j];
  109.         }
  110.        
  111.                 for(j=0;j<16;j++)
  112.                 {
  113.                        
  114.                         l=DS1302_Time[i]%10;
  115.                         //Table_BUFF[80+j]=Table_Number[l][j];
  116.                         Table_BUFF[64+j]=Table_Number[l][j];
  117.                
  118.                 }
  119.        
  120.         for(i=5;i<=5;i++)
  121.         {
  122.                 for(j=0;j<16;j++)
  123.                 {
  124.                         h=DS1302_Time[i]/10;
  125.                         l=DS1302_Time[i]%10;
  126.                         //Table_BUFF[(i+2)*16+j]=Table_Number[h][j];
  127.                         //Table_BUFF[(i+1)*16+j]=Table_Number[l][j];
  128.                         Table_BUFF[(i+1)*16+j]=Table_Number[h][j];
  129.                         Table_BUFF[(i+2)*16+j]=Table_Number[l][j];
  130.                 }
  131.         }
  132.        
  133.        
  134. }
  135. void main(){
  136.        
  137.         DS1302_Init();
  138.         //Timer0_Init();
  139.         DS1302_SetTime();
  140.         while(1){
  141.                 DS1302_ReadTime();
  142.                 makeTimeString();
  143.                 Matrix16x16(4);
  144.                 //delayms(100);
  145.         }
  146. }
  147. //定时器
  148. void Timer0_Routine() interrupt 1
  149. {
  150.         static unsigned int count0 = 0;
  151.         TL0 = 0x18;                //设置定时初值
  152.         TH0 = 0xFC;                //设置定时初值
  153.         count0++;
  154.         //if(count0 == 600){
  155.         if(count0 == 600){
  156.                 count0 = 0;
  157.                 //TimeSetFlashFlag=!TimeSetFlashFlag;
  158.                 DS1302_ReadTime();
  159.                 makeTimeString();
  160.                 Matrix16x16(4);
  161.         }
  162.                
  163. }
  164. //修改
  165. void TimeSet(){
  166.         //选择需要更改的位
  167.         if(KeyNumber == 2)
  168.         {
  169.                 TimeSetSelect++;
  170.                 TimeSetSelect%=6;
  171.         }
  172.         //增加更改位的数,并判断是否越界
  173.         if(KeyNumber == 3)
  174.         {
  175.                 DS1302_Time[TimeSetSelect]++;
  176.                 if(DS1302_Time[0]>99){DS1302_Time[0]=0;}
  177.                 if(DS1302_Time[1]>12){DS1302_Time[1]=1;}
  178.                
  179.                 if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==31)
  180.                 {
  181.                         if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
  182.                 }
  183.                 if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==30)
  184.                 {
  185.                         if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
  186.                 }
  187.                 if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==29)
  188.                 {
  189.                         if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
  190.                 }
  191.                 if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==28)
  192.                 {
  193.                         if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
  194.                 }
  195.                
  196.                 if(DS1302_Time[3]>24){DS1302_Time[3]=0;}
  197.                 if(DS1302_Time[4]>59){DS1302_Time[4]=0;}
  198.                 if(DS1302_Time[5]>59){DS1302_Time[5]=0;}
  199.         }
  200.         //减小更改位的数,并判断是否越界
  201.         if(KeyNumber == 4)
  202.         {
  203.                 DS1302_Time[TimeSetSelect]--;
  204.                 if(DS1302_Time[0]>100){DS1302_Time[0]=99;}
  205.                 if(DS1302_Time[1]<1){DS1302_Time[1]=12;}
  206.                
  207.                 if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==31)
  208.                 {
  209.                         if(DS1302_Time[2]<1){DS1302_Time[2]=31;}
  210.                         if(DS1302_Time[2]>31){DS1302_Time[2]=1;}
  211.                 }
  212.                 if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==30)
  213.                 {
  214.                         if(DS1302_Time[2]<1){DS1302_Time[2]=30;}
  215.                         if(DS1302_Time[2]>30){DS1302_Time[2]=1;}
  216.                 }
  217.                 if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==29)
  218.                 {
  219.                         if(DS1302_Time[2]<1){DS1302_Time[2]=29;}
  220.                         if(DS1302_Time[2]>29){DS1302_Time[2]=1;}
  221.                 }
  222.                 if(YEAR(DS1302_Time[0]+2000,DS1302_Time[1])==28)
  223.                 {
  224.                         if(DS1302_Time[2]<1){DS1302_Time[2]=28;}
  225.                         if(DS1302_Time[2]>28){DS1302_Time[2]=1;}
  226.                 }
  227.                
  228.                 if(DS1302_Time[3]>100){DS1302_Time[3]=24;}
  229.                 if(DS1302_Time[4]>100){DS1302_Time[4]=59;}
  230.                 if(DS1302_Time[5]>100){DS1302_Time[5]=59;}
  231.         }
  232.        
  233. }
  234. //闰年判断,月份天数判断
  235. unsigned char YEAR(unsigned char year,month){
  236.         if(year%400==0||year%4==0&&year%100!=0)
  237.         {
  238.                 if(month==2)
  239.                         return 29;
  240.         }
  241.         else
  242.         {
  243.                 if(month==1||month==3||month==5||month==7||month==8||month==10||month==12)
  244.                         return 31;
  245.                 else if(month==4||month==6||month==9||month==11)
  246.                         return 30;
  247.                 else
  248.                         return 28;
  249.         }
  250.         return 0;
  251. }
复制代码
2、ds1302.c
  1. #include <STC89C5xRC.H>
  2. #define DS1302_SECOND    0x80
  3. #define DS1302_MINUTE         0x82
  4. #define DS1302_HOUR                 0x84
  5. #define DS1302_DATE                  0x86
  6. #define DS1302_MONTH         0x88
  7. #define DS1302_DAY                 0x8A
  8. #define DS1302_YEAR                 0x8C
  9. #define DS1302_WP                 0x8E
  10. sbit DS1302_SCLK=P1^7;
  11. sbit DS1302_IO=P2^7;
  12. sbit DS1302_CE=P3^5;
  13. unsigned char DS1302_Time[]={23,04,22,21,51,00,6};
  14. /**
  15.   * @brief BCD转10进制
  16.   * @param  
  17.   * @retval
  18.   */
  19. unsigned char BCD_10(unsigned char Num){
  20.         unsigned char Temp;
  21.         Temp = Num/10*16+Num%10;
  22.         return Temp;
  23. }
  24. /**
  25.   * @brief 10进制转BCD码
  26.   * @param  
  27.   * @retval
  28.   */
  29. unsigned char Ten_BCD(unsigned char Num){
  30.         unsigned char Temp;
  31.         Temp = Num/16*10+Num%16;
  32.         return Temp;
  33. }
  34. /**
  35.   * @brief  初始化DS1302
  36.   * @param  
  37.   * @retval
  38.   */
  39. void DS1302_Init(){
  40.         DS1302_SCLK=0;
  41.         DS1302_CE=0;
  42. }
  43. /**
  44.   * @brief  写入字节
  45.   * @param  
  46.   * @retval
  47.   */
  48. void DS1302_WriteByte(unsigned char Command,Data){
  49.         unsigned char i;
  50.         DS1302_CE=1;
  51.        
  52.        
  53.         for(i=0;i<8;i++){
  54.                 DS1302_IO=Command&(0x01<<i);
  55.                 DS1302_SCLK=1;
  56.                 DS1302_SCLK=0;
  57.         }
  58.         for(i=0;i<8;i++){
  59.                 DS1302_IO=Data&(0x01<<i);
  60.                 DS1302_SCLK=1;
  61.                 DS1302_SCLK=0;
  62.         }
  63.         DS1302_CE=0;
  64. }
  65. /**
  66.   * @brief  读取字节
  67.   * @param  
  68.   * @retval
  69.   */
  70. unsigned char DS1302_ReadByte(unsigned char Command){
  71.         unsigned char i,Data=0x00;
  72.         Command|=0x01;
  73.         DS1302_CE=1;
  74.         for(i=0;i<8;i++){
  75.                 DS1302_IO=Command&(0x01<<i);
  76.                 DS1302_SCLK=0;
  77.                 DS1302_SCLK=1;
  78.         }   
  79.         for(i=0;i<8;i++){
  80.                 DS1302_SCLK=1;
  81.                 DS1302_SCLK=0;
  82.                 if(DS1302_IO){Data|=(0x01<<i);}
  83.         }
  84.         DS1302_CE=0;
  85.         DS1302_IO=0;
  86.         return Data;
  87. }
  88. /**
  89.   * @brief  将数组内容写入
  90.   * @param  
  91.   * @retval
  92.   */
  93. void DS1302_SetTime(){
  94.         DS1302_WriteByte(DS1302_WP,0x00);
  95.         DS1302_WriteByte(DS1302_YEAR,BCD_10(DS1302_Time[0]));
  96.         DS1302_WriteByte(DS1302_MONTH,BCD_10(DS1302_Time[1]));
  97.         DS1302_WriteByte(DS1302_DATE,BCD_10(DS1302_Time[2]));
  98.         DS1302_WriteByte(DS1302_HOUR,BCD_10(DS1302_Time[3]));
  99.         DS1302_WriteByte(DS1302_MINUTE,BCD_10(DS1302_Time[4]));
  100.         DS1302_WriteByte(DS1302_SECOND,BCD_10(DS1302_Time[5]));
  101.         DS1302_WriteByte(DS1302_DAY,BCD_10(DS1302_Time[6]));
  102.         DS1302_WriteByte(DS1302_WP,0x80);
  103. }
  104. /**
  105.   * @brief  读出数组内容
  106.   * @param  
  107.   * @retval
  108.   */
  109. void DS1302_ReadTime(){
  110.        
  111.         DS1302_Time[0]=Ten_BCD(DS1302_ReadByte(DS1302_YEAR));
  112.         DS1302_Time[1]=Ten_BCD(DS1302_ReadByte(DS1302_MONTH));
  113.         DS1302_Time[2]=Ten_BCD(DS1302_ReadByte(DS1302_DATE));
  114.         DS1302_Time[3]=Ten_BCD(DS1302_ReadByte(DS1302_HOUR));
  115.         DS1302_Time[4]=Ten_BCD(DS1302_ReadByte(DS1302_MINUTE));
  116.         DS1302_Time[5]=Ten_BCD(DS1302_ReadByte(DS1302_SECOND));
  117.         DS1302_Time[6]=Ten_BCD(DS1302_ReadByte(DS1302_DAY));
  118. }
复制代码
3、ds1302.h
  1. #ifndef __SD1302_H__
  2. #define __SD1302_H__
  3. extern unsigned char DS1302_Time[];
  4. void DS1302_Init();
  5. void DS1302_ReadTime();
  6. void DS1302_SetTime();
  7. #endif
复制代码
4、timer0.c
  1. #include <STC89C5xRC.H>
  2. void Timer0_Init(void)                //1毫秒@12.000MHz
  3. {
  4.         TMOD &= 0xF0;                //设置定时器模式
  5.         TMOD |= 0x01;                //设置定时器模式
  6.         TL0 = 0x18;                //设置定时初值
  7.         TH0 = 0xFC;                //设置定时初值
  8.         TF0 = 0;                //清除TF0标志
  9.         TR0 = 1;                //定时器0开始计时
  10.         ET0 = 1;
  11.         EA = 1;
  12.         PT0 = 0;
  13. }
复制代码
5、timer0.h
  1. #ifndef __TIMER0_H__
  2. #define __TIMER0_H__
  3. void Timer0_Init(void);       
  4. #endif
复制代码
9a1d0b7946fd446494a12af71df789dd.jpg

回复

使用道具 举报 送花

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|手机版|小黑屋|深圳国芯人工智能有限公司 ( 粤ICP备2022108929号-2 )

GMT+8, 2025-5-7 14:30 , Processed in 0.126978 second(s), 48 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表