找回密码
 立即注册

QQ登录

只需一步,快速开始

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

单片机驱动19264液晶大数字时钟程序,DS12CR887和DS1302,带Proteus仿真

  [复制链接]
跳转到指定楼层
楼主
弄了个简单的19264液晶时钟,采用大数字显示,用DS1302和ds12cr887时钟芯片,分别两个对应程序。只有时、分、秒和温度显示。

仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)


单片机源程序如下:
  1. /*系统头文件--------------------------------------------------------------------*/
  2. #include <reg52.h>
  3. #include <absacc.h>
  4. /*包含的文件--------------------------------------------------------------------*/
  5. #include "MODEL.h"
  6. #include "LCD19264.h"
  7. #include "DS12CR887.h"
  8. #include "DS18B20.h"
  9. /*定义变量名--------------------------------------------------------------------*/
  10. #define uchar unsigned char
  11. #define uint  unsigned int
  12. /*定义变量----------------------------------------------------------------------*/
  13. bit  q=0,w=0;     //调时标志位
  14. /*定义时间变量——————————————————————————————————————————————————————————————————*/
  15. uchar sec,min,hour;
  16. /*定义按键----------------------------------------------------------------------*/
  17. sbit K1  = P1^7;  //按键K1-设置
  18. sbit K2  = P1^4;  //按键K2-确认、返回
  19. sbit K3  = P1^6;  //按键K3-加
  20. sbit K4  = P1^5;  //按键K4-减
  21. sbit K5  = P1^3;  //液晶背光控制按键,按一下亮,再按一下灭
  22. sbit BEEP= P1^2;  //蜂鸣器
  23. sbit BLA = P1^0;  //液晶背光控制输出,低电平有效,PNP三极管控制。
  24. /*显示时、分、秒————————————————————————————————————————————————————————————————*/
  25. void displaytime(void)
  26. {
  27. //往液晶屏填写"小时"数据-----------------------------------------------
  28.         hour=ds_read(4);         //读取DS12CR887的小时数据
  29.         if((hour/10)==0){Show3264(0,0,11);}
  30.                 else        {Show3264(0,0,(hour/10));} //小时十位
  31.         Show3264(0,1,(hour%10)); //小时个位
  32.         Show3264(0,2,10);        //时钟分隔符":"
  33. //往液晶屏填写"分钟"数据-----------------------------------------------
  34.         min=ds_read(2);          //读取DS12CR887的分数据
  35.         Show3264(0,3,(min/10));         //分钟十位
  36.         Show3264(0,4,(min%10));         //分钟个位                                       
  37. //往液晶屏填写"秒"数据-------------------------------------------------
  38.         sec=ds_read(0);          //读取DS12CR887的秒数据
  39.         Show1632(2,10,(sec/10)); //秒钟十位
  40.         Show1632(2,11,(sec%10)); //秒钟个位                                       
  41. }
  42. /*设置日期、时间函数------------------------------------------------------------*/
  43. void Set_time(uchar sel)  
  44. {
  45.         signed char address,item;
  46.         signed char max,mini;
  47.         ds_write(0x0a,0x00);     //开始调时,DS12CR887关闭时钟振荡器         
  48.         ShowHZ(0,10,0);          //显示"设"
  49.         ShowHZ(0,11,1);          //显示"置"
  50.         if(sel==2) {ShowHZ(1,10,6);ShowHZ(1,11,3);address=0; max=59;mini=0;}//秒钟         
  51.         if(sel==1) {ShowHZ(1,10,2);ShowHZ(1,11,3);address=2; max=59;mini=0;}//分钟
  52.         if(sel==0) {ShowHZ(1,10,4);ShowHZ(1,11,5);address=4; max=23;mini=0;}//小时                  
  53.         item=ds_read(address);         //读取DS12CR887某地址上的数值赋给item
  54.         if(K3 == 0) {item++;}    //K3-加数:1
  55.         if(K4 == 0) {item--;}    //K4-减数:1
  56.         if(item>max) item=mini;  //限制数值最大有效范围   
  57.         if(item<mini) item=max;         //限制数值最小有效范围           
  58.         ds_write(address,item);         //将调整好的item值写入DS12CR887
  59.         displaytime();                         //显示时间
  60. }
  61. /*主函数------------------------------------------------------------------------*/
  62. void main()
  63. {
  64.         uchar e=0;
  65.         K1=1;K2=1;K3=1;K4=1;K5=1;           //按健复位
  66.         BLA=0;                                           //打开液晶、按键背光
  67.         BEEP=0;                                                   //蜂鸣器响50毫秒
  68.         DelayM(50);
  69.         BEEP=1;
  70.         ds_int();                                           //DS12CR887初始化
  71.         InitLCD();                                           //液晶屏初始化
  72.         while(1)
  73.         {
  74.                 if(w==0)
  75.                 {
  76.                         displaytime();        
  77.                         read_temp();                  //读取温度
  78.                     ds1820disp();                 //显示温度
  79.                 }   //正常走时
  80.                 else {}                    //否则启动调时
  81. //设置键------------------------------------------------------------------------               
  82.                 if (K1 == 0)               // 设置时间
  83.                 {
  84.                         DelayM(20);                   //按键消抖
  85.                         if(K1 == 0 && w == 1)  //当是调时状态 本键用于调整下一项
  86.                         {
  87.                                 e++;
  88.                                 if (e >= 3 ){e = 0;}
  89.                                 Set_time(e);       //调整                                
  90.                         }                        
  91.                         if(K1 == 0 && w == 0)  //当是正常状态时就进入调时状态
  92.                         {
  93.                                 ClearScreen(0);
  94.                                 ClearScreen(1);
  95.                                 ClearScreen(2);    //清除左中右屏显示
  96.                                 w=1;                   //进入调时                                
  97.                                 Set_time(e);       //调整
  98.                         }
  99.                            while(K1 == 0);        //等待键松开
  100.                 }
  101. //确认,返回键-------------------------------------------------------------------               
  102.                 if (K2 == 0)               //在调时状态时就退出调时
  103.                 {
  104.                         DelayM(20);            //按键消抖
  105.                         if(K2 == 0 && w == 1)
  106.                         {                                
  107.                                 w = 0;                   //退出调时
  108.                                 e = 0;                       //"下一项"计数器清0                                                               
  109.                         }
  110.                         if(K2 == 0 && w == 0)
  111.                         {                                
  112.                                 ClearScreen(0);
  113.                                 ClearScreen(1);
  114.                                 ClearScreen(2);           //清除左中右屏显示                                
  115.                                 while(K2 == 0);   
  116.                         }
  117.                         ClearScreen(0);
  118.                         ClearScreen(1);
  119.                         ClearScreen(2);        //清除左中右屏显示      
  120.                         ds_write(0x0a,0x20);   //调时完成,DS12CR887开启时钟振荡器
  121.                         displaytime();                   //显示时间
  122.                         read_temp();                  //读取温度
  123.                     ds1820disp();                 //显示温度
  124.                         while(K2 == 0);  
  125.                 }
  126. //加调整------------------------------------------------------------------------               
  127.                 if (K3 == 0 && w == 1)
  128.                 {
  129.                         DelayM(20);
  130.                         if(K3 == 0 && w == 1) {        Set_time(e); }
  131.                         while(K3 == 0);
  132.                 }
  133. //减调整------------------------------------------------------------------------               
  134.                 if (K4 == 0 && w == 1)
  135.                 {               
  136.                         DelayM(20);
  137.                         if(K4 == 0 && w == 1) { Set_time(e); }
  138.                         while(K4 == 0);
  139.                 }
  140. //液晶背光控制,按一下亮,再按一下灭--------------------------------------------
  141.                 if(K5 == 0)        
  142.                 {
  143.                         DelayM(20); q = ~q;      //标志位取反
  144.                          if(q){BLA = BLA | 1;}   
  145.                                  else {BLA = BLA & 0;}   
  146.                         while(K5 == 0);           
  147.                 }
  148.         }
  149. ……………………

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

所有资料51hei提供下载:
19264液晶时钟.rar (259.69 KB, 下载次数: 109)
LCM19264_DS1302.rar (243.19 KB, 下载次数: 100)


评分

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

查看全部评分

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

使用道具 举报

沙发
WANGCHONG 发表于 2019-8-4 14:28 | 只看该作者
老哥,你这个咋仿真出来显示器上什么也不显示?
回复

使用道具 举报

板凳
by64214 发表于 2019-9-23 17:12 | 只看该作者
我用的Proteus8.8   仿真不显示   把显示模块从左上角移动到原点   显示!!!
回复

使用道具 举报

地板
toddchen 发表于 2020-1-24 00:27 | 只看该作者
很不错的程序,下来侃侃。
回复

使用道具 举报

5#
51debug 发表于 2020-1-31 12:32 | 只看该作者
在找19264资料学习下,谢谢分享!
回复

使用道具 举报

6#
xzhqwzx 发表于 2020-2-13 10:43 | 只看该作者

在找19264资料学习下,谢谢分享![
回复

使用道具 举报

7#
yezhixin 发表于 2020-2-15 14:34 | 只看该作者
在找19264资料学习下,谢谢分享!
回复

使用道具 举报

8#
mark2046 发表于 2020-5-14 11:56 | 只看该作者
不错,感谢!借鉴借鉴!
回复

使用道具 举报

9#
腾飞的龙 发表于 2020-6-10 09:43 | 只看该作者
楼主在吗?程序怎么显示不出来,乱码。
回复

使用道具 举报

10#
leezll 发表于 2021-2-20 23:37 | 只看该作者
仿真到是可以运行,可是做好的实物却是什么都不显示,难道数据口D0-D7只能P2.0口?读写选片只能P0.1口???我就改了下端口,这就不显示了,是不是液晶屏驱动程序的问题???我的是JXL19264-1液晶屏,听说要什么 NT7107C 控制器 、、、、求解啊@@@@
回复

使用道具 举报

11#
electmo 发表于 2021-3-19 16:56 | 只看该作者
那位兄弟用个这个屏MS19264C-3,能分享下,谢谢!
回复

使用道具 举报

12#
usaboy 发表于 2021-3-20 04:33 | 只看该作者
您的无私奉献,让人感动不已,太感谢了。
回复

使用道具 举报

13#
electmo 发表于 2021-4-7 23:46 | 只看该作者
也没显示,是CSA & CSB 两个片选,二拾淘回来的

1617810137135.jpg (4.59 MB, 下载次数: 0)

1617810137135.jpg
回复

使用道具 举报

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

本版积分规则

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

Powered by 单片机教程网

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