|
弄了個簡單的19264液晶時鐘,采用大數(shù)字顯示,用DS1302和ds12cr887時鐘芯片,分別兩個對應(yīng)程序。只有時、分、秒和溫度顯示。
仿真原理圖如下(proteus仿真工程文件可到本帖附件中下載)
單片機源程序如下:
- /*系統(tǒng)頭文件--------------------------------------------------------------------*/
- #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; //調(diào)時標(biāo)志位
- /*定義時間變量——————————————————————————————————————————————————————————————————*/
- uchar sec,min,hour;
- /*定義按鍵----------------------------------------------------------------------*/
- sbit K1 = P1^7; //按鍵K1-設(shè)置
- 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)
- {
- //往液晶屏填寫"小時"數(shù)據(jù)-----------------------------------------------
- hour=ds_read(4); //讀取DS12CR887的小時數(shù)據(jù)
- if((hour/10)==0){Show3264(0,0,11);}
- else {Show3264(0,0,(hour/10));} //小時十位
- Show3264(0,1,(hour%10)); //小時個位
- Show3264(0,2,10); //時鐘分隔符":"
- //往液晶屏填寫"分鐘"數(shù)據(jù)-----------------------------------------------
- min=ds_read(2); //讀取DS12CR887的分數(shù)據(jù)
- Show3264(0,3,(min/10)); //分鐘十位
- Show3264(0,4,(min%10)); //分鐘個位
- //往液晶屏填寫"秒"數(shù)據(jù)-------------------------------------------------
- sec=ds_read(0); //讀取DS12CR887的秒數(shù)據(jù)
- Show1632(2,10,(sec/10)); //秒鐘十位
- Show1632(2,11,(sec%10)); //秒鐘個位
- }
- /*設(shè)置日期、時間函數(shù)------------------------------------------------------------*/
- void Set_time(uchar sel)
- {
- signed char address,item;
- signed char max,mini;
- ds_write(0x0a,0x00); //開始調(diào)時,DS12CR887關(guān)閉時鐘振蕩器
- ShowHZ(0,10,0); //顯示"設(shè)"
- 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某地址上的數(shù)值賦給item
- if(K3 == 0) {item++;} //K3-加數(shù):1
- if(K4 == 0) {item--;} //K4-減數(shù):1
- if(item>max) item=mini; //限制數(shù)值最大有效范圍
- if(item<mini) item=max; //限制數(shù)值最小有效范圍
- ds_write(address,item); //將調(diào)整好的item值寫入DS12CR887
- displaytime(); //顯示時間
- }
- /*主函數(shù)------------------------------------------------------------------------*/
- void main()
- {
- uchar e=0;
- K1=1;K2=1;K3=1;K4=1;K5=1; //按健復(fù)位
- BLA=0; //打開液晶、按鍵背光
- BEEP=0; //蜂鳴器響50毫秒
- DelayM(50);
- BEEP=1;
- ds_int(); //DS12CR887初始化
- InitLCD(); //液晶屏初始化
- while(1)
- {
- if(w==0)
- {
- displaytime();
- read_temp(); //讀取溫度
- ds1820disp(); //顯示溫度
- } //正常走時
- else {} //否則啟動調(diào)時
- //設(shè)置鍵------------------------------------------------------------------------
- if (K1 == 0) // 設(shè)置時間
- {
- DelayM(20); //按鍵消抖
- if(K1 == 0 && w == 1) //當(dāng)是調(diào)時狀態(tài) 本鍵用于調(diào)整下一項
- {
- e++;
- if (e >= 3 ){e = 0;}
- Set_time(e); //調(diào)整
- }
- if(K1 == 0 && w == 0) //當(dāng)是正常狀態(tài)時就進入調(diào)時狀態(tài)
- {
- ClearScreen(0);
- ClearScreen(1);
- ClearScreen(2); //清除左中右屏顯示
- w=1; //進入調(diào)時
- Set_time(e); //調(diào)整
- }
- while(K1 == 0); //等待鍵松開
- }
- //確認,返回鍵-------------------------------------------------------------------
- if (K2 == 0) //在調(diào)時狀態(tài)時就退出調(diào)時
- {
- DelayM(20); //按鍵消抖
- if(K2 == 0 && w == 1)
- {
- w = 0; //退出調(diào)時
- e = 0; //"下一項"計數(shù)器清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); //調(diào)時完成,DS12CR887開啟時鐘振蕩器
- displaytime(); //顯示時間
- read_temp(); //讀取溫度
- ds1820disp(); //顯示溫度
- while(K2 == 0);
- }
- //加調(diào)整------------------------------------------------------------------------
- if (K3 == 0 && w == 1)
- {
- DelayM(20);
- if(K3 == 0 && w == 1) { Set_time(e); }
- while(K3 == 0);
- }
- //減調(diào)整------------------------------------------------------------------------
- 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; //標(biāo)志位取反
- if(q){BLA = BLA | 1;}
- else {BLA = BLA & 0;}
- while(K5 == 0);
- }
- }
- ……………………
- …………限于本文篇幅 余下代碼請從51黑下載附件…………
復(fù)制代碼
所有資料51hei下載:
1302的版本(只能用Proteus7.5 不然屏幕會顯示空白 需要自行安裝幾個庫):
LCM19264_DS1302.rar
(243.19 KB, 下載次數(shù): 202)
2019-6-27 15:38 上傳
點擊文件名下載附件
887版本 同上只能用Proteus7.5打開 其他版本測試是空白顯示:
19264液晶時鐘.rar
(259.69 KB, 下載次數(shù): 208)
2019-6-27 15:38 上傳
點擊文件名下載附件
|
評分
-
查看全部評分
|