找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 4130|回复: 6
收起左侧

单片机+LCD12864指针数字切换万年历程序

  [复制链接]
ID:489855 发表于 2020-4-26 22:08 | 显示全部楼层 |阅读模式
电路图在附件

制作出来的实物图如下:
O~6{HOP%(2WP_I9OAF%%Y@B.png

单片机源程序如下:
  1. /*
  2. *******************************************************************************
  3. *                     “冬松电子工作室”        倾情奉献
  4. *
  5. *                  配套 LCD12864电子万年历时钟电路板
  6. *
  7. * 文 件 名:calendarMain.c
  8. * 描    述: LCD12864电子万年历时钟工程主文件
  9. * 功    能:初始化定时器0,及中断服务程序(用于闹钟),主函数调用
  10. * 咨询电话:135-91697612
  11. *******************************************************************************
  12. */
  13. #include "clock.h"
  14. #include "calendar.h"
  15. #include "key.h"
  16. #include "lcd.h"
  17. #include "zhen.h"
  18. #include "sensor.h"
  19. uchar alarmStyle;   //定义蜂鸣器报警方式
  20. /****************************************************************************/
  21. sbit bell=P1^0;  //定义蜂鸣器端口
  22. /****************************************************************************
  23. * 名称:void Timer0_Initial(void)
  24. * 功能:初始化timer0
  25. * 入口函数:无
  26. * 出口函数:无
  27. ****************************************************************************/
  28. void Timer0_Initial(void)
  29. {
  30.         TMOD=0x01;  //Timer0工作方式1定时
  31.         TH0 =0x4c;
  32.         TL0 =0x00;  //定时50 ms
  33.         ET0 =1;     //Timer0开中断
  34.         TR0 =1;     //timer0启动
  35. }
  36. /*****************************************************************************
  37. * 名称: Timer0_Overflow() inturrupt 1
  38. * 功能: 中断服务程序 1.整点报时 三声嘟嘟的声音  2.闹钟报时,持续一分钟
  39. * 入口参数:无
  40. * 出口参数:无
  41. *****************************************************************************/
  42. void Timer0_Overflow() interrupt 1
  43. {
  44.         TH0 = 0x4c;
  45.         TL0 = 0x00; //延时 50 ms
  46.         bell=~bell;        //进入中断,蜂鸣器取反,达到蜂鸣器间歇工作目的
  47.         
  48. }
  49. /******************************************************************************
  50. * 函数名称: main()
  51. * 功    能: 主函数
  52. * 入口参数: 无
  53. * 出口参数: 无
  54. ********************************************************************************/
  55. void main()
  56. {        
  57.     uchar clock_time[7] = {0x00,0x11,0x20,0x01,0x02,0x01,0x16};  //定义时间变量 秒 分 时 日 月 周 年
  58.     uchar alarm_time[3]; //闹钟设置 alarm_time[0]:分钟  alarm_time[1]:小时
  59.         uchar temperature[2];//定义温度变量temperature[0]为低8位,temperature[1]为高8位
  60.         uchar i, j;
  61.         uchar CALL[3]; //存储三画面状态(开和闭)数组
  62. //        bell = 1;
  63. //        lcd = 1;
  64. //        psb = 1; //12864采用并口输出方式
  65. //  cs2 = 0;
  66.         Timer0_Initial();        //初始化定时器0
  67.         v_Lcd12864Init_f(); //12864初始化
  68.         port = 0xFF;        //释放P0端口
  69.         Lcd_Write_Command(0x36); //采用扩充指令集,绘图开,清除模拟指针画面字符
  70.         delay_1ms(2);            //延时2ms
  71.         Lcd_Write_Command(0x36); //采用扩充指令集,绘图开,需设定两次,先改DL,再改RE
  72.         delay_1ms(2);                          //延时2ms
  73.         cls();                   //清屏,为显示做准备
  74.         key_init();                             //初始化键盘扫描程序变量
  75. //  Set1302(clock_time);     //时钟初试化
  76.         CALL1[0] = R1302(0xc7);        //读取DS1302的RAM中 画面一 状态值
  77.         CALL1[1] = R1302(0xc9);        //读取DS1302的RAM中 画面二 状态值
  78.         CALL1[2] = R1302(0xcb);        //读取DS1302的RAM中 画面三 状态值
  79.         if(((CALL1[0]==1)||(CALL1[1]==1))&&(CALL1[2]==0)) //第一、二个画面
  80.         {
  81.             frame_and_scale_f(); //绘制出边框,和刻度
  82.         }                    
  83.         alarmStyle=0x00; //初始化报警方式,此时不报警
  84.         EA = 0;                         //关闭总中断
  85.     while( 1 )
  86.         {                  
  87.                 CALL[0] = R1302(0xc1);        //读取DS1302的RAM中 分 闹钟值
  88.                 CALL[1] = R1302(0xc3);        //读取DS1302的RAM中 时 闹钟值
  89.                 CALL[2] = R1302(0xc5);        //读取DS1302的RAM中 开和闭 状态值
  90.                 CALL1[0] = R1302(0xc7);        //重新读取DS1302的RAM中 画面一 状态值
  91.                 CALL1[1] = R1302(0xc9);        //重新读取DS1302的RAM中 画面二 状态值
  92.                 CALL1[2] = R1302(0xcb);        //重新读取DS1302的RAM中 画面三 状态值
  93.                 Get1302(clock_time);    //获取 秒 分 时 日 月 周 年 的时钟数据
  94.                 Lcd_Clock(clock_time);        //时钟显示
  95.                 Sensor_Fresh(temperature);    //温度更新,读取温度
  96.                 Lcd_Temperature(temperature); //显示温度
  97.                 Conversion(0,clock_time[6],clock_time[4],clock_time[3]); //输入BCD阳历数据,输出BCD阴历数据
  98.                 Conver_week(0,clock_time[6],clock_time[4],clock_time[3]);//输入BCD阳历数据,输出BCD星期数据
  99.                    if(KEY_FUNC==Key_Scan()) //如果按键作值KEY_FUNC(0x08)与按键扫描Key_Scan()数对比相等(也是0x08),
  100.                 {
  101.                         while(KEY_FUNC==Key_Scan()); //KEY_FUNC和Key_Scan()的值相等,就在这里等待,按键抬起就执行下面语句,
  102.                         Key_Function(clock_time, alarm_time); //则进入功能选择菜单
  103.                 }
  104.                 if(KEY_UP == Key_Scan()) //如果按键作值KEY_UP(0x01)与按键扫描Key_Scan()数对比相等(也是0x01),
  105.                 {   
  106.                         lcd = 1; //打开液晶背光灯        
  107.                 }
  108.                 if(KEY_DOWN == Key_Scan()) //如果按键作值KEY_DOWN(0x02)与按键扫描Key_Scan()数对比相等(也是0x02),
  109.                 {
  110.                         lcd = 0; //关闭液晶背光灯        
  111.                 }
  112.                 if(((CALL1[0]==1)||(CALL1[1]==1))&&(CALL1[2]==0)) //第一、二个画面
  113.                 {
  114.                     frame_and_scale_f(); //绘制出边框,和刻度
  115.                         zhizhen();
  116.                 }                        
  117.                 if(((CALL1[0]==0)||(CALL1[1]==0))&&(CALL1[2]==1)) //第三个画面
  118.                 {        
  119.                         Lcd_Write_Command(0x34); //采用扩充指令集,绘图关
  120.                         Lcd_Write_Command(0x30); //基本指令集                                
  121.                 }                 
  122.                 if((*clock_time==0x59)&&(*(clock_time+1)==0x59)) //比较秒和分数据到59,整点报时
  123.                 {
  124.                         EA = 1;                //打开总中断
  125.                         bell = 0;        //打开蜂鸣器
  126.                 }
  127.                 else
  128.                 {
  129.                         EA = 0;                //关闭总中断
  130.                         bell = 1;        //关闭蜂鸣器
  131.                 }  
  132.                 //闹钟报警
  133.                 i = clock_time[1]; //分钟数据传递给变量 i
  134.                 j = clock_time[2]; //小时数据传递给变量 j
  135.                 i = bcd_hex(i);    //分钟数据转换成十进制数
  136.                 j =bcd_hex(j);     //小时数据转换成十进制数
  137.                 //不转换闹钟调整数据和DS1302闹铃存储的闹钟数据不同,闹钟不响
  138.                 if(CALL[2] == 0) //如果闹钟状态是 “开”
  139.                 {                                                                                   
  140.                         if(( CALL[0] ==  i)&&( CALL[1]  == j)) //时钟分钟和小时与DS13202存储的闹钟值相吻合,
  141.                         {         
  142.                                 EA = 1;                //打开总中断
  143.                                 bell = 0;        //打开蜂鸣器
  144.                         }                    
  145.                 }
  146.                 else   //否则闹钟状态是 “关”
  147.                 {
  148.                         EA = 0;                //关闭总中断
  149.                         bell = 1;        //关闭蜂鸣器
  150.                 }                  
  151.         }        
  152. }
复制代码

所有资料51hei提供下载:
指针数字切换万年历.rar (114.42 KB, 下载次数: 211)

评分

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

查看全部评分

回复

使用道具 举报

ID:688460 发表于 2020-5-2 11:07 | 显示全部楼层
感谢分享!最近正想学习一下LC方面的知识。谢谢了!
回复

使用道具 举报

ID:722330 发表于 2020-10-26 21:37 | 显示全部楼层
感谢分享!最近正想学习一下LC方面的知识。谢谢了!
回复

使用道具 举报

ID:230742 发表于 2021-3-7 15:49 | 显示全部楼层
收藏一下。有空也学习学习指针钟。
回复

使用道具 举报

ID:28992 发表于 2021-3-8 00:07 | 显示全部楼层
download for study, thank you so much.
回复

使用道具 举报

ID:938030 发表于 2021-6-15 16:29 | 显示全部楼层
附件里是只有电路图吗
回复

使用道具 举报

ID:230742 发表于 2021-6-18 00:53 | 显示全部楼层
1302的电源有一个稳压二极管是什么作用?
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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