找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 10246|回复: 13
打印 上一主题 下一主题
收起左侧

DS1302&IIC接口OLED12864显示及设置时钟制作(STC15单片机源码)

  [复制链接]
跳转到指定楼层
楼主
MCU使用STC15W408AS,DS1302小模块,ssd1306驱动的12864;
两个按键接在p3.0,p3.1用于时间设置;

实物图片:


单片机源程序如下:
  1. /*
  2. 启动时间:2018年5月8日;
  3. 工作频率:11.0592Mhz
  4. 作者:Oachw;
  5. 完成时间:2018年5月12日;
  6. MCU:STC15W408AS
  7. */
  8. #include <ds1302.h>
  9. #include <stc15.h>
  10. #include <12864.h>
  11. #include <delay.h>
  12. #include <character.h>
  13. #define KEYSET1 0x01
  14. #define KEYSET2 0x02
  15. sbit key1=P3^0;
  16. sbit key2=P3^1;
  17. //bit key1_on,key2_on;
  18. u8 cnt_plus;
  19. //u8 a=0;
  20. //按键程序来源百度;
  21. unsigned char timer=0;
  22. unsigned char Trg;
  23. unsigned char Cont;

  24. unsigned char se[2],mi[2],ho[2],da[2],mo[2],ye[2],we,rd;
  25. unsigned char se_rs[2],mi_rs[2],ho_rs[2],da_rs[2],mo_rs[2],ye_rs[2],we_rs,rd_rs;
  26. unsigned char setmode=0;
  27. u8 rd_ye;
  28. u8 rd_mo;
  29. u8 rd_da;
  30. u8 rd_mi;
  31. u8 rd_ho;
  32. u8 rd_se;
  33. u8 rd_we;
  34. u8 timemode;
  35. u8 settime;
  36. u8 rd_xx;
  37. u8 nyrsfm;
  38. u8 mop,dap,hop,mip,sep,wep;
  39. void time_dis();
  40. void Timer0Init(void);
  41. void key_init();
  42. void key_process();
  43. void KeyRead();
  44. void stopcnt();
  45. void key_process1();
  46. void settimedis();

  47. void main()
  48. {        unsigned char i=4;
  49.         Delay_n_50ms(10);
  50.         //ds1302init();    首次刷写程序,建议启用下;后续未做测试是否可直接使用;
  51.         Timer0Init();
  52.         Initial_12864();
  53.         clear_12864();
  54.         key_init();

  55.         
  56.         while(1)
  57.         {
  58.                 if(setmode==0)
  59.                 {
  60.                         time_dis();
  61.                         mop=0;
  62.                         dap=0;
  63.                         hop=0;
  64.                         mip=0;
  65.                         wep=0;
  66.                         sep=0;
  67.                 }
  68.                 if(timer==1)
  69.                 {
  70.                         timer=0;
  71.                         key_process();
  72.                 }
  73.                 if(setmode==1)
  74.                 {
  75.                         settimedis();
  76.                 }
  77.                
  78.                
  79.         }
  80. }
  81. void KeyRead()                           //牛逼的按键程序。      
  82. {                                                                            // RD        Trg         Cont
  83.     unsigned char ReadData = P3^0xff;     //无按键式时/松开时                     0                 0                0
  84.     Trg = ReadData & (ReadData ^ Cont);    //按下一次时                          1    1    1
  85.     Cont = ReadData;                                                                            //不松、下次周期检测仍未松时      1    0                1
  86. }                                                                                                                                                                        //总结,Trg、Cont全局变量; Trg用来判单单次按下;Cont通过计次实现长时间按键按下检测;
  87. void key_init()
  88. {
  89.         key1=1;
  90.         key2=1;
  91. }
  92. void key_process()
  93. {
  94.         u8 i;
  95.          KeyRead();
  96.         if(setmode==0)//mode0,待机模式下的按键处理程序;
  97.         {
  98.                 write1302(Set_protect,0x80);
  99.                 if (Cont & KEYSET1) //k1长按2s以上,进入时间设置模式;
  100.                 {
  101.                                 cnt_plus++;       // 计时
  102.                
  103.                                 if (cnt_plus > 50) // 20ms*100 = 2S 如果时间到,频率or哪里有点问题,实际时间为设置时间的2倍;
  104.                                 {
  105.                                                 cnt_plus=0;
  106.                                                 stopcnt();         
  107.                                                 setmode=1;
  108.                                                 settime++; //区分设置时、分、秒、年...
  109.                                 }
  110.                 }   
  111.                 if(Cont==0)
  112.                 {
  113.                                 cnt_plus=0;
  114.                 }
  115.                
  116.         }                                
  117.         if(setmode==1)
  118.         {
  119.                 if(settime==1)
  120.                 {
  121.                         rd_xx=rd_ye;
  122.                         nyrsfm=159;
  123.                 }
  124.                 if(settime==2)
  125.                 {
  126.                         rd_xx=rd_mo;
  127.                         nyrsfm=18;
  128.                 }
  129.                 if(settime==3)
  130.                 {
  131.                         rd_xx=rd_da;
  132.                         nyrsfm=49;
  133.                 }
  134.                 if(settime==4)
  135.                 {
  136.                         rd_xx=rd_we;
  137.                         nyrsfm=6;
  138.                 }
  139.                 if(settime==5)
  140.                 {
  141.                         rd_xx=rd_ho;
  142.                         nyrsfm=35;
  143.                 }
  144.                 if(settime==6)
  145.                 {
  146.                         rd_xx=rd_mi;
  147.                         nyrsfm=95;
  148.                 }
  149.                 if(settime==7)
  150.                 {
  151.                         rd_xx=rd_se;
  152.                         nyrsfm=95;
  153.                 }
  154.                         write1302(Set_protect,0);
  155.                 if(Trg & KEYSET1) //k1短按;
  156.                 {
  157.                         settime++;
  158.                         if(settime==8)
  159.                         {
  160.                                 settime=0;
  161.                         }
  162.                 }
  163.                 if(Trg & KEYSET2) //k2短按;
  164.                 {
  165.                                 rd_xx++;
  166.                                 if((rd_xx&0x0f)>9)
  167.                                         rd_xx+=6;
  168.                                 if(rd_xx>nyrsfm)
  169.                                         rd_xx=0x00;
  170.                 }
  171.                 if(Cont==0)
  172.                 {
  173.                         cnt_plus=0;
  174.                 }
  175.                 if(Cont & KEYSET2) //k2长按;
  176.                 {                        
  177.                                 
  178.                                 cnt_plus++;  
  179.                                 if (cnt_plus > 12) //
  180.                                 {
  181.                                         rd_xx++;
  182.                                         if((rd_xx&0x0f)>9)
  183.                                         rd_xx+=6;
  184.                                         if(rd_xx>nyrsfm)
  185.                                         rd_xx=0x00;
  186.                                 }               
  187.                                 if(Cont==0)
  188.                                 i=0;
  189.                 }
  190.         
  191.         }
  192. }
  193. void settimedis()
  194. {
  195.         if(settime==1)
  196.         {        
  197.                 rd_ye=rd_xx;
  198.                 hanzi(27,00,6); //设
  199.                 hanzi(28,12,6); //置
  200.                 hanzi(0,24,6);        //年
  201.                 hanzi(13,36,6);        //:
  202.                 dxzm(((rd_ye)>>4)+48,48,6);
  203.                 dxzm((((rd_ye)&0x0f)+48),56,6);        
  204.         }        
  205.         if(settime==2)
  206.         {
  207.                 if(mop==0)
  208.                 {
  209.                         mop=1;
  210.                         write1302(Set_year,rd_ye);
  211.                         rd_xx=rd_mo;
  212.                 }
  213.                 rd_mo=rd_xx;
  214.                 dxzm(((rd_mo)>>4)+48,48,6);
  215.                 dxzm((((rd_mo)&0x0f)+48),56,6);
  216.                 time_dis();        
  217.                 hanzi(27,00,6); //设
  218.                 hanzi(28,12,6); //置
  219.                 hanzi(1,24,6);        //月
  220.                 hanzi(13,36,6);        //:
  221.         }        
  222.         if(settime==3)
  223.         {
  224.                 if(dap==0)
  225.                 {
  226.                         dap=1;
  227.                         write1302(Set_month,rd_mo);
  228.                         rd_xx=rd_da;
  229.                         
  230.                 }
  231.                 rd_da=rd_xx;
  232.                 dxzm(((rd_da)>>4)+48,48,6);
  233.                 dxzm((((rd_da)&0x0f)+48),56,6);        
  234.                 time_dis();        
  235.                 hanzi(27,00,6); //设
  236.                 hanzi(28,12,6); //置
  237.                 hanzi(2,24,6);        //日
  238.                 hanzi(13,36,6);        //:
  239.         
  240.         }        
  241.         if(settime==4)
  242.         {
  243.                 if(wep==0)
  244.                 {
  245.                         wep=1;
  246.                         write1302(Set_day,rd_da);
  247.                         rd_xx=rd_we;
  248.                 }
  249.                 rd_we=rd_xx;
  250.                 dxzm((rd_we+48),60,6);        
  251.                 time_dis();        
  252.                 hanzi(27,00,6); //设
  253.                 hanzi(28,12,6); //置
  254.                 hanzi(3,24,6);        //星期
  255.                 hanzi(4,36,6);        //星期
  256.                 hanzi(13,48,6);        //:

  257.         }
  258.         if(settime==5)
  259.         {
  260.                 if(hop==0)
  261.                 {
  262.                         hop=1;
  263.                         write1302(Set_week,rd_we);
  264.                         rd_xx=rd_ho;
  265.                 }
  266.                 rd_ho=rd_xx;

  267.                 time_dis();        
  268.                 hanzi(27,00,6); //设
  269.                 hanzi(28,12,6); //置
  270.                 hanzi(29,24,6);        //时
  271.                 hanzi(31,36,6);        //24
  272.                 hanzi(32,48,6);        //制
  273.                 hanzi(33,60,6);        //式
  274.                 hanzi(13,72,6);        //:
  275.                 dxzm(((rd_ho)>>4)+48,84,6);
  276.                 dxzm((((rd_ho)&0x0f)+48),92,6);        
  277.         }        
  278.         if(settime==6)
  279.         {
  280.                 if(mip==0)
  281.                 {
  282.                         mip=1;
  283.                         write1302(Set_hour,rd_ho);
  284.                         rd_xx=rd_mi;
  285.                 }
  286.                 rd_mi=rd_xx;
  287.         
  288.                 time_dis();        
  289.                 hanzi(27,00,6); //设
  290.                 hanzi(28,12,6); //置
  291.                 hanzi(30,24,6);        //分
  292.                 hanzi(13,36,6);        //:
  293.                 dxzm(((rd_mi)>>4)+48,48,6);
  294.                 dxzm((((rd_mi)&0x0f)+48),56,6);               
  295.                 writekong(64,64,6);
  296.         }
  297.         if(settime==7)
  298.         {
  299.                 if(sep==0)
  300.                 {
  301.                         sep=1;
  302.                         write1302(Set_minute,rd_mi);
  303.                         rd_xx=rd_se&0x7f;
  304.                 }
  305.                 rd_se=rd_xx;
  306.                 time_dis();                        
  307.                 hanzi(27,00,6); //设
  308.                 hanzi(28,12,6); //置
  309.                 hanzi(25,24,6);        //秒
  310.                 hanzi(13,36,6);        //:
  311.                 dxzm(((rd_se)>>4)+48,48,6);
  312.                 dxzm((((rd_se)&0x0f)+48),56,6);        
  313.         }
  314.         if(settime==0)
  315.         {
  316.                 setmode=0;
  317.                 writekong(0,127,6);
  318.                 write1302(Set_second,rd_se);                //写秒并开始计数;
  319.         }
  320. }
  321. void stopcnt()
  322. {               
  323.         rd_se=read1302(Read_second);
  324.         write1302(Set_protect,0);
  325.         write1302(Set_second,0x80|rd_se);                //写停止计数;
  326.         rd_ye=read1302(Read_year);        //保存当前时间计数;
  327.         rd_mo=read1302(Read_month);
  328.         rd_da=read1302(Read_day);
  329.         rd_ho=read1302(Read_hour);
  330.         rd_mi=read1302(Read_minute);
  331.         rd_we=read1302(Read_week);
  332.                 //write1302(Set_protect,0xff);
  333. }
  334.         void time_dis()
  335. {
  336.                 rd=read1302(Read_second);
  337.                 se[1]=(rd>>4)&0x07;
  338.                 se[0]=rd&0x0f;
  339.                 rd=read1302(Read_minute);
  340.                 mi[1]=rd>>4;
  341.                 mi[0]=rd&0x0f;
  342.                 rd=read1302(Read_hour);
  343.                 ho[1]=rd>>4;
  344.                 ho[0]=rd&0x0f;
  345.                 rd=read1302(Read_day);
  346.                 da[1]=rd>>4;
  347.                 da[0]=rd&0x0f;
  348.                 rd=read1302(Read_month);
  349.                 mo[1]=rd>>4;
  350.                 mo[0]=rd&0x0f;
  351.                 rd=read1302(Read_year);
  352.                 ye[1]=rd>>4;
  353.                 ye[0]=rd&0x0f;        
  354.                 we=read1302(Read_week);
  355.                 //日期
  356.                 dxzm('2',23,0);
  357.                 dxzm('0',31,0);
  358.                 dxzm(ye[1]+48,39,0);
  359.                 dxzm(ye[0]+48,48,0);
  360.                         dxzm(45,56,0);
  361.                 dxzm(mo[1]+48,64,0);
  362.                 dxzm(mo[0]+48,72,0);
  363.                         dxzm(45,80,0);
  364.                 dxzm(da[1]+48,88,0);
  365.                 dxzm(da[0]+48,96,0);
  366.                 //时间
  367.                 dxzm(ho[1]+48,26,2);
  368.                 dxzm(ho[0]+48,35,2);
  369.                                 dxzm(58,44,2);
  370.                 dxzm(mi[1]+48,53,2);
  371.                 dxzm(mi[0]+48,62,2);
  372.                                 dxzm(58,71,2);
  373.                 dxzm(se[1]+48,80,2);
  374.                 dxzm(se[0]+48,89,2);               
  375.                 //星期
  376.                 rd=read1302(Read_week);
  377.                 hanzi(3,45,4);
  378.                 hanzi(4,57,4);
  379.                 switch (rd)
  380.                 {                        
  381. ……………………

  382. …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码

所有资料51hei提供下载:
12864&amp;ds130202.zip (89.67 KB, 下载次数: 432)


评分

参与人数 1黑币 +50 收起 理由
admin + 50 共享资料的黑币奖励!

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏6 分享淘帖 顶 踩
回复

使用道具 举报

沙发
ID:361858 发表于 2018-9-8 22:22 | 只看该作者
学习了
回复

使用道具 举报

板凳
ID:401861 发表于 2018-9-24 17:25 | 只看该作者
学习了
回复

使用道具 举报

地板
ID:310081 发表于 2018-9-25 14:38 | 只看该作者
文件打开是什么方式啊(新人)
回复

使用道具 举报

5#
ID:408539 发表于 2018-11-2 03:04 | 只看该作者
以下在,谢谢分享
回复

使用道具 举报

6#
ID:404868 发表于 2018-11-4 12:11 | 只看该作者
打开不了
回复

使用道具 举报

7#
ID:276416 发表于 2019-3-7 14:43 | 只看该作者
为什么打开是乱码
回复

使用道具 举报

8#
ID:466381 发表于 2019-4-2 23:08 | 只看该作者
为啥用了LZ的程序那个闹钟的显示根本不变化的
回复

使用道具 举报

9#
ID:156302 发表于 2019-11-9 14:17 | 只看该作者
学习一下,谢谢分享
回复

使用道具 举报

10#
ID:648034 发表于 2019-11-23 19:55 | 只看该作者

学习一下,谢谢分享
回复

使用道具 举报

11#
ID:102293 发表于 2019-11-24 14:05 | 只看该作者
楼主辛苦了,谢谢分享.
回复

使用道具 举报

12#
ID:393745 发表于 2019-11-28 09:59 | 只看该作者
学习了 谢谢分享
回复

使用道具 举报

13#
ID:651379 发表于 2019-11-28 10:47 | 只看该作者
很厉害。。。。
回复

使用道具 举报

14#
ID:1000054 发表于 2022-1-5 17:11 | 只看该作者
牛逼,很有用
回复

使用道具 举报

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

本版积分规则

手机版|小黑屋|51黑电子论坛 |51黑电子论坛6群 QQ 管理员QQ:125739409;技术交流QQ群281945664

Powered by 单片机教程网

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