弄了个简单的19264液晶时钟,采用大数字显示,用DS1302和ds12cr887时钟芯片,分别两个对应程序。只有时、分、秒和温度显示。
仿真原理图如下(proteus仿真工程文件可到本帖附件中下载)
单片机源程序如下:
- /*系统头文件--------------------------------------------------------------------*/
- #include <reg52.h>
- #include <absacc.h>
- /*包含的文件--------------------------------------------------------------------*/
- #include "MODEL.h"
- #include "LCD19264.h"
- #include "DS12CR887.h"
- #include "DS18B20.h"
- /*定义变量名--------------------------------------------------------------------*/
- #define uchar unsigned char
- #define uint unsigned int
- /*定义变量----------------------------------------------------------------------*/
- bit q=0,w=0; //调时标志位
- /*定义时间变量——————————————————————————————————————————————————————————————————*/
- uchar sec,min,hour;
- /*定义按键----------------------------------------------------------------------*/
- sbit K1 = P1^7; //按键K1-设置
- sbit K2 = P1^4; //按键K2-确认、返回
- sbit K3 = P1^6; //按键K3-加
- sbit K4 = P1^5; //按键K4-减
- sbit K5 = P1^3; //液晶背光控制按键,按一下亮,再按一下灭
- sbit BEEP= P1^2; //蜂鸣器
- sbit BLA = P1^0; //液晶背光控制输出,低电平有效,PNP三极管控制。
- /*显示时、分、秒————————————————————————————————————————————————————————————————*/
- void displaytime(void)
- {
- //往液晶屏填写"小时"数据-----------------------------------------------
- hour=ds_read(4); //读取DS12CR887的小时数据
- if((hour/10)==0){Show3264(0,0,11);}
- else {Show3264(0,0,(hour/10));} //小时十位
- Show3264(0,1,(hour%10)); //小时个位
- Show3264(0,2,10); //时钟分隔符":"
- //往液晶屏填写"分钟"数据-----------------------------------------------
- min=ds_read(2); //读取DS12CR887的分数据
- Show3264(0,3,(min/10)); //分钟十位
- Show3264(0,4,(min%10)); //分钟个位
- //往液晶屏填写"秒"数据-------------------------------------------------
- sec=ds_read(0); //读取DS12CR887的秒数据
- Show1632(2,10,(sec/10)); //秒钟十位
- Show1632(2,11,(sec%10)); //秒钟个位
- }
- /*设置日期、时间函数------------------------------------------------------------*/
- void Set_time(uchar sel)
- {
- signed char address,item;
- signed char max,mini;
- ds_write(0x0a,0x00); //开始调时,DS12CR887关闭时钟振荡器
- ShowHZ(0,10,0); //显示"设"
- ShowHZ(0,11,1); //显示"置"
- if(sel==2) {ShowHZ(1,10,6);ShowHZ(1,11,3);address=0; max=59;mini=0;}//秒钟
- if(sel==1) {ShowHZ(1,10,2);ShowHZ(1,11,3);address=2; max=59;mini=0;}//分钟
- if(sel==0) {ShowHZ(1,10,4);ShowHZ(1,11,5);address=4; max=23;mini=0;}//小时
- item=ds_read(address); //读取DS12CR887某地址上的数值赋给item
- if(K3 == 0) {item++;} //K3-加数:1
- if(K4 == 0) {item--;} //K4-减数:1
- if(item>max) item=mini; //限制数值最大有效范围
- if(item<mini) item=max; //限制数值最小有效范围
- ds_write(address,item); //将调整好的item值写入DS12CR887
- displaytime(); //显示时间
- }
- /*主函数------------------------------------------------------------------------*/
- void main()
- {
- uchar e=0;
- K1=1;K2=1;K3=1;K4=1;K5=1; //按健复位
- BLA=0; //打开液晶、按键背光
- BEEP=0; //蜂鸣器响50毫秒
- DelayM(50);
- BEEP=1;
- ds_int(); //DS12CR887初始化
- InitLCD(); //液晶屏初始化
- while(1)
- {
- if(w==0)
- {
- displaytime();
- read_temp(); //读取温度
- ds1820disp(); //显示温度
- } //正常走时
- else {} //否则启动调时
- //设置键------------------------------------------------------------------------
- if (K1 == 0) // 设置时间
- {
- DelayM(20); //按键消抖
- if(K1 == 0 && w == 1) //当是调时状态 本键用于调整下一项
- {
- e++;
- if (e >= 3 ){e = 0;}
- Set_time(e); //调整
- }
- if(K1 == 0 && w == 0) //当是正常状态时就进入调时状态
- {
- ClearScreen(0);
- ClearScreen(1);
- ClearScreen(2); //清除左中右屏显示
- w=1; //进入调时
- Set_time(e); //调整
- }
- while(K1 == 0); //等待键松开
- }
- //确认,返回键-------------------------------------------------------------------
- if (K2 == 0) //在调时状态时就退出调时
- {
- DelayM(20); //按键消抖
- if(K2 == 0 && w == 1)
- {
- w = 0; //退出调时
- e = 0; //"下一项"计数器清0
- }
- if(K2 == 0 && w == 0)
- {
- ClearScreen(0);
- ClearScreen(1);
- ClearScreen(2); //清除左中右屏显示
- while(K2 == 0);
- }
- ClearScreen(0);
- ClearScreen(1);
- ClearScreen(2); //清除左中右屏显示
- ds_write(0x0a,0x20); //调时完成,DS12CR887开启时钟振荡器
- displaytime(); //显示时间
- read_temp(); //读取温度
- ds1820disp(); //显示温度
- while(K2 == 0);
- }
- //加调整------------------------------------------------------------------------
- if (K3 == 0 && w == 1)
- {
- DelayM(20);
- if(K3 == 0 && w == 1) { Set_time(e); }
- while(K3 == 0);
- }
- //减调整------------------------------------------------------------------------
- if (K4 == 0 && w == 1)
- {
- DelayM(20);
- if(K4 == 0 && w == 1) { Set_time(e); }
- while(K4 == 0);
- }
- //液晶背光控制,按一下亮,再按一下灭--------------------------------------------
- if(K5 == 0)
- {
- DelayM(20); q = ~q; //标志位取反
- if(q){BLA = BLA | 1;}
- else {BLA = BLA & 0;}
- while(K5 == 0);
- }
- }
- ……………………
- …………限于本文篇幅 余下代码请从51黑下载附件…………
复制代码
所有资料51hei下载:
1302的版本(只能用Proteus7.5 不然屏幕会显示空白 需要自行安装几个库):
LCM19264_DS1302.rar
(243.19 KB, 下载次数: 202)
|