找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机LCD12864数字时钟温度制作 附源程序

[复制链接]
跳转到指定楼层
楼主
ID:1167385 发表于 2026-2-14 12:47 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
制作出来的实物图如下:


单片机源程序如下:
  1. /**********************************************
  2.         电子数字时钟程序
  3.         单 片 机:STC15F2K60S2
  4.         晶    振:12MHz
  5.         液 晶 屏:LCM-12864-ST7920
  6.         时    间:2026年02月25日修改完成
  7.         LCM12864使用并口连接方式,PSB、RST接高电平
  8. **********************************************/
  9. //头文件
  10. #include "stc15f.h"
  11. #include <intrins.h>
  12. #include "LCD12864.h"
  13. #include "DS1302.h"
  14. #include "DS18B20.h"
  15. #include "NongLi.h"
  16. #include "Display_Time.h"
  17. #include "ZiKu.h"
  18. #include <math.h>

  19. #define uint unsigned int
  20. #define uchar unsigned char

  21. //定义按键
  22. sbit K1 =P2^3;        //K1-设置
  23. sbit K2 =P2^4;         //K2-确认、返回
  24. sbit K3 =P2^6;         //K3-加
  25. sbit K4 =P2^7;         //K4-减
  26. sbit BLK=P2^0;        
  27. sbit wei=P3^6;
  28. sbit duan=P3^7;
  29. //函数声明
  30. void Add_Sub();
  31. void Delayms(uint);

  32. //定义全局变量
  33. bit W=0;       
  34. uchar Miao,Fen,Shi,Ri,Yue,Zhou,Nian,Moontemp1,Moontemp2;
  35. signed char Address,Item,Max,Min;

  36. //延时函数1ms/次
  37. void Delayms(uint ms)              
  38. {
  39.         uchar i;
  40.         while(--ms!=0)
  41.                 for(i=0;i<125;i++);                                     
  42. }
  43. //日期、时间设置函数
  44. void Set_Time()
  45. {
  46.         Nian=Read_DS1302(0x8D);       
  47.         Yue=Read_DS1302(0x89);       
  48.         Ri=Read_DS1302(0x87);       
  49.         Week=Read_DS1302(0x8B);       
  50.         Write_LCD(0,0x80);

  51.         Write_String("20");                       
  52.         Write_LCD(1,(Nian/16)+0x30);       
  53.         Write_LCD(1,Nian%16+0x30);       
  54.         Write_String("年");

  55.         Write_LCD(1,(Yue/16)+0x30);
  56.         Write_LCD(1,Yue%16+0x30);       
  57.         Write_String("月");                       
  58. /*
  59.         Write_LCD(0,0x88);
  60.         Write_String("星期");
  61.         Write_LCD(1,Yue%16+0x30);       
  62. */
  63.         Write_LCD(1,(Ri/16)+0x30);
  64.         Write_LCD(1,Ri%16+0x30);       
  65.         Write_String("日");                       

  66.         if(Read_DS1302(0x85)!=Shi)       
  67.                 Shi=Read_DS1302(0x85);       
  68.        
  69.         Write_LCD(0,0x91);
  70.         Write_LCD(1,(Shi/16)+0x30);       
  71.         Write_LCD(1,Shi%16+0x30);       
  72.         Write_String("时");

  73.         if(Read_DS1302(0x83)!=Fen)                       
  74.                 Fen=Read_DS1302(0x83);       
  75.         Write_LCD(1,(Fen/16)+0x30);       
  76.         Write_LCD(1,Fen%16+0x30);       
  77.         Write_String("分");

  78.         if(Read_DS1302(0x81)!=Miao)                       
  79.                 Miao=Read_DS1302(0x81);       
  80.         Write_LCD(1,(Miao/16)+0x30);
  81.         Write_LCD(1,Miao%16+0x30);       
  82.         Write_String("秒");
  83. }
  84. //调整时间子函数
  85. void Set_time(uchar Set)
  86. {  
  87.         Write_Com(0x30);
  88.         Write_Com(0x06);

  89.         Write_LCD(0,0x98);               
  90.         Write_String("★调整");       
  91.   
  92. /*        if(Set==6)
  93.         {
  94.                 Write_String("星期");
  95.                 Address=0x8A;
  96.                 Max=7;
  97.                 Min=1;          
  98.              Set_Time();
  99.              ds_w();
  100.              Set_Time();
  101.           }
  102. */
  103.         if(Set==5)
  104.         {
  105.                 Write_String("秒钟");
  106.                 Address=0x80;
  107.                 Max=59;
  108.                 Min=0;          
  109.                 Set_Time();               
  110.                    Add_Sub();               
  111.                    Set_Time();
  112.           }  

  113.         if(Set==4)
  114.         {
  115.                 Write_String("分钟");
  116.                 Address=0x82;
  117.                 Max=59;
  118.                 Min=0;
  119.                    Set_Time();
  120.                    Add_Sub();
  121.                    Set_Time();
  122.         }

  123.         if(Set==3)
  124.         {
  125.                 Write_String("小时");
  126.                 Address=0x84;
  127.                 Max=23;
  128.                 Min=0;
  129.             Set_Time();
  130.                    Add_Sub();
  131.                    Set_Time();
  132.           }  

  133.         if(Set==2)
  134.         {
  135.                 Write_String("日期");
  136.                 Address=0x86;
  137.                 Yue=Read_DS1302(0x89);               
  138.                 Moontemp1=Yue/16;
  139.                 Moontemp2=Yue%16;
  140.                 Yue=Moontemp1*10+Moontemp2;       

  141.               Nian= Read_DS1302(0x8d);       
  142.               Moontemp1=Nian/16;
  143.                 Moontemp2=Nian%16;
  144.                 Nian=Moontemp1*10+Moontemp2;

  145.               if(Yue==2&&Nian%4!=0)
  146.                 {
  147.                         Max=28;       
  148.                         Min=1;
  149.                 }
  150.                 if(Yue==2&&Nian%4==0)
  151.                 {
  152.                         Max=29;       
  153.                         Min=1;
  154.                 }
  155.                 if(Yue==1||Yue==3||Yue==5||Yue==7||Yue==8||Yue==10||Yue==12)
  156.                 {
  157.                         Max=31;       
  158.                         Min=1;
  159.                 }
  160.                 if(Yue==4||Yue==6||Yue==9||Yue==11)
  161.                 {
  162.                         Max=30;       
  163.                         Min=1;
  164.                 }
  165.                 Set_Time();
  166.                 Add_Sub();
  167.                 Set_Time();
  168.         }

  169.           if(Set==1)
  170.           {
  171.                 Write_String("月份");
  172.                 Address=0x88;
  173.                 Max=12;
  174.                 Min=1;
  175.              Set_Time();
  176.              Add_Sub();
  177.              Set_Time();
  178.            }

  179.         if(Set==0)
  180.           {
  181.                 Write_String("年份");
  182.                 Address=0x8C;
  183.                 Max=99;
  184.                 Min=0;
  185.              Set_Time();
  186.              Add_Sub();       
  187.              Set_Time();       
  188.            }
  189. }

  190. //加减子函数
  191. void Add_Sub()
  192. {
  193.         Item=((Read_DS1302(Address+1))/16)*10+(Read_DS1302(Address+1))%16;
  194.        
  195.         if(K3==0)        //如果按动上调键
  196.                 Item++;        //数加 1  
  197.         if(K4==0)        //如果按动下调键
  198.                   Item--;        //数减 1
  199.         if(Item>Max)
  200.                 Item=Min;          
  201.         if(Item<Min)
  202.                 Item=Max;                   
  203.         Write_DS1302(0x8E,0x00);       
  204.         Write_DS1302(Address,(Item/10)*16+Item%10);       
  205.         Write_DS1302(0x8E,0x80);       
  206. }

  207. //主函数
  208. void main()
  209. {                            
  210.         uchar E=0;
  211.         BLK=0;K1=1;K2=1;K3=1;K4=1;
  212.         wei=0;
  213.         duan=0;
  214.         Init_DS1302();               
  215.         Init_LCD();                       
  216.         Welcome();                   
  217.         Delayms(3000);                
  218.         Delayms(3000);
  219.         Delayms(3000);
  220.         Clear_LCD();               
  221.         Clear12864_GDRAM();       
  222.         while(1)
  223.         {
  224.                 if(W==0)                       
  225.                 {
  226.                         Display_Date();       
  227.                         Display_Nl();       
  228.                         Display_Time();       
  229.                         Read_Temp();       
  230.                         Display_Temp();       
  231.                         Display_Week();       
  232.                 }       
  233.                 else {}                               

  234.                 //设置时间       
  235.                 if(K1==0)         
  236.                 {
  237.                         Delayms(20);               
  238.                         if(K1==0&&W==1)               
  239.                         {
  240.                                 E++;
  241.                                 if(E>=7)
  242.                                         E=0;
  243.                                    while(!K1);               
  244.                                 Set_time(E);        //调整                               
  245.                         }                       
  246.                         if(K1==0&&W==0)               
  247.                         {
  248.                                 Clear_LCD();            
  249.                                 Clear12864_GDRAM();               
  250.                                 W=1;                                       
  251.                                 Set_time(E);
  252.                         }
  253.                                 while(!K1);                         
  254.                 }

  255.                 //退出设置               
  256.                 if(K2==0)                               
  257.                 {
  258.                         Delayms(20);
  259.                         if(K2==0&&W==1)
  260.                         {                               
  261.                                 W=0;                       
  262.                                 E=0;                                                                               
  263.                         }
  264.                         if(K2==0&&W==0)
  265.                         {                               
  266.                                 Clear_LCD();
  267.                                 Clear12864_GDRAM();
  268.                                 Write_Com(0x30);
  269.                                 Write_Com(0x06);
  270.                                 Welcome();                               
  271.                                 while(!K2);                          
  272.                         }
  273.                         Clear_LCD();
  274.                         Clear12864_GDRAM();                               
  275.                         Display_Date();
  276.                         Display_Week();
  277.                         Display_Nl();
  278.                         Display_Time();
  279.                         Read_Temp();
  280.                         Display_Temp();
  281.                         while(!K2);                                  
  282.                 }

  283.                 //加调整               
  284.                 if(K3==0&&W==1)
  285.                 {
  286.                         Delayms(20);
  287.                         if(K3==0&&W==1)
  288.                                 Set_time(E);
  289.                         while(!K3);                               
  290.                 }

  291.                 //减调整       
  292.                 if(K4==0&&W==1)
  293.                 {              
  294.                         Delayms(20);
  295.                         if(K4==0&&W==1)
  296.                                 Set_time(E);
  297.                         while(!K4);                       
  298.                 }
  299.         }
  300. }
复制代码

原理图和程序下载: 12864数显时钟温度.7z (95.76 KB, 下载次数: 0)

评分

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

查看全部评分

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

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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