自己做的12864萬年歷,分享給51黑電子論壇的朋友們
所有資料打包下載:
萬年歷12864資料.zip
(901.26 KB, 下載次數: 82)
2016-10-20 11:06 上傳
點擊文件名下載附件
DS1302用現成模塊,可以自己網上找電路圖焊
DS18B20引腳看清楚不要搞錯
12864為并行方式,PSB跟RST接高電平就行,對比度通過103電位器調背光,可用單片機控制或
用熱釋電模塊控制。
鬧鐘數據掉電會丟失,可以自己改改程序,用24C02或其它芯片
電路圖沒有,因為簡單,接線時看程序接或自己接好后改程序的定義
所需元器件:
1.單片機最小系統,包括上電復位電路跟時鐘電路
2.12864液晶屏1個
3.DS18B20數字溫度芯片(三腳)
4.DS1302模塊
5.蜂鳴器(有源跟無源各一),三極管8050(3個),103電位器用在12864調對比度
6.按鍵4個,熱釋電模塊一個,開關一個,導線若干,烙鐵,焊錫,
7.其他自己發揮擴展
部分源碼預覽:
- #include<reg52.h>
- #include<intrins.h>
- #include"lcd12864.h"
- sbit DSPORT=P3^6; //ds18b20接口
- sbit DSIO=P2^1; //ds1302接口
- sbit RST=P2^3;
- sbit SCLK=P2^2;
- sbit zz=P2^4; //有源蜂鳴器 用三極管8050驅動
- sbit s1=P1^0; //調節時間
- sbit s2=P1^1; //加
- sbit s3=P1^2; //減
- sbit s4=P1^3; //調節鬧鐘
- sbit Beep=P1^7; //揚聲器 用三極管8050驅動
- //---定義全局函數---//
- void Ds1302Write(uchar addr, uchar dat);
- uchar Ds1302Read(uchar addr);
- void Ds1302Init();
- void Ds1302ReadTime();
- //---加入全局變量--//
- uchar timeji=0,n=0,keysun=2;
- char SetPlace=-1,naoshi=0x08,naofen=0x00,linsheng=1; //參數定義
- bit biaozhi=1;
- bit biaozhi1=1;
- bit naobiao=0;
- uchar code READ_RTC_ADDR[7] = {0x81, 0x83, 0x85, 0x87, 0x89, 0x8b, 0x8d};
- uchar code WRITE_RTC_ADDR[7] = {0x80, 0x82, 0x84, 0x86, 0x88, 0x8a, 0x8c};
- //---DS1302時鐘初始化2013年1月1日星期二12點00分00秒。---//
- //---存儲順序是秒分時日月周年,存儲格式是用BCD碼---//
- char TIME[7] = {0x00, 0x57, 0x10, 0x01, 0x01, 0x05, 0x16};
- void Delay1ms(unsigned int );
- unsigned char Ds18b20Init();
- void Ds18b20WriteByte(unsigned char com);
- unsigned char Ds18b20ReadByte();
- void Ds18b20ChangTemp();
- void Ds18b20ReadTempCom();
- int Ds18b20ReadTemp();
- uchar code CharCode[]=" 調整時間 年 月 日周 時間 點 分 秒 ";
- uchar code CharCode1[]="20 - - 周 . ℃";
- uchar code xiqi[]=" 一二三四五六日開關";
- uchar code naozhong[]=" 設置鬧鐘 點 分 鈴聲選擇 ";
- uchar code naozhonglinshen[]="1.天空之城 2.月亮代表我的心3.你是風兒我是沙4.莫斯科郊外的晚5.經典鈴聲 嘀嘀";
- uchar code tab[11][64]={
- {/*-- 調入了一幅圖像:D:\設計\打印\數字取模圖片\0.bmp --*/
- /*-- 寬度x高度=16x32 --*/
- 0x0F,0xF0,0x3F,0xFC,0x7F,0xFE,0x7F,0xFE,0xFC,0x3F,0xF8,0x1F,0xF0,0x0F,0xF0,0x0F,
- 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,
- 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,
- 0xF0,0x0F,0xF0,0x0F,0xF8,0x1F,0xFC,0x3F,0x7F,0xFE,0x7F,0xFE,0x3F,0xFC,0x0F,0xF0,},
- {/*-- 1 --*/
- /*-- 寬度x高度=16x32 --*/
- 0x01,0x80,0x07,0xC0,0x0F,0xC0,0x1F,0xE0,0x3F,0xE0,0x7F,0xE0,0xFF,0xE0,0xE3,0xE0,
- 0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,
- 0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xE0,
- 0x03,0xE0,0x03,0xE0,0x03,0xE0,0x07,0xF0,0x3F,0xFC,0x7F,0xFE,0x7F,0xFE,0x00,0x00,},
- {/*-- 2 --*/
- /*-- 寬度x高度=16x32 --*/
- 0x0F,0xF0,0x3F,0xFC,0x7F,0xFE,0xFF,0xFE,0xFC,0x3F,0xF0,0x1F,0xE0,0x0F,0x00,0x0F,
- 0x00,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x1F,0x00,0x3F,0x00,0x7F,0x00,0xFE,
- 0x03,0xFC,0x07,0xF8,0x0F,0xF0,0x1F,0xC0,0x3F,0x80,0x7F,0x00,0x7E,0x00,0xFC,0x00,
- 0xFC,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,},
- {/*-- 調入了一幅圖像:D:\設計\打印\數字取模圖片\3.bmp --*/
- /*-- 寬度x高度=16x32 --*/
- 0x0F,0xF0,0x3F,0xFC,0x7F,0xFE,0x7F,0xFE,0xFC,0x3F,0xF0,0x1F,0xE0,0x1F,0xE0,0x0F,
- 0xC0,0x0F,0x00,0x0F,0x00,0x1F,0x00,0x1E,0x00,0x3E,0x00,0xFC,0x1F,0xFC,0x1F,0xF8,
- 0x1F,0xFC,0x1F,0xFC,0x00,0x7E,0x00,0x3F,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x1F,
- 0x00,0x1F,0x00,0x1F,0xC0,0x3F,0xF0,0x7F,0xFF,0xFE,0xFF,0xFE,0xFF,0xFC,0x3F,0xF0,},
- {/*-- 調入了一幅圖像:D:\設計\打印\數字取模圖片\4.bmp --*/
- /*-- 寬度x高度=16x32 --*/
- 0x00,0x0E,0x00,0x1E,0x00,0x3E,0x00,0x7E,0x00,0xFE,0x01,0xFE,0x03,0xFE,0x03,0xFE,
- 0x07,0xFE,0x0F,0xFE,0x1F,0xFE,0x1F,0xBE,0x3F,0x3E,0x3E,0x3E,0x7E,0x3E,0x7C,0x3E,
- 0xFC,0x3E,0xF8,0x3E,0xF8,0x3E,0xF0,0x3E,0xF0,0x3E,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,
- 0xFF,0xFF,0xFF,0xFF,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,0x00,0x3E,},
- {/*-- 調入了一幅圖像:D:\設計\打印\數字取模圖片\5.bmp --*/
- /*-- 寬度x高度=16x32 --*/
- 0x1F,0xFF,0x3F,0xFF,0x7F,0xFF,0x7F,0xFF,0xFF,0xFF,0xFC,0x00,0xF8,0x00,0xF8,0x00,
- 0xF8,0x00,0xF8,0x00,0xF8,0x00,0xF8,0x00,0xFC,0x00,0xFF,0xE0,0x7F,0xFC,0x7F,0xFE,
- 0x3F,0xFF,0x07,0xFF,0x00,0x7F,0x00,0x1F,0x00,0x0F,0x00,0x0F,0x00,0x0F,0x00,0x0F,
- 0x00,0x1F,0x00,0x1F,0xF0,0x3F,0xFC,0x7F,0x7F,0xFE,0x7F,0xFE,0x3F,0xFC,0x0F,0xF0,},
- {/*-- 調入了一幅圖像:D:\設計\打印\數字取模圖片\6.bmp --*/
- /*-- 寬度x高度=16x32 --*/
- 0x00,0x00,0x00,0x00,0x00,0x3E,0x00,0xFE,0x03,0xFE,0x07,0xFC,0x0F,0xF0,0x1F,0xC0,
- 0x3F,0x00,0x7E,0x00,0x7C,0x00,0x7C,0x00,0xF8,0x00,0xF8,0x00,0xFF,0xE0,0xFF,0xF8,
- 0xFF,0xFE,0xFF,0xFE,0xF8,0x7E,0xF0,0x3F,0xF0,0x1F,0xF0,0x1F,0xF0,0x1F,0xF0,0x1F,
- 0xF0,0x1F,0xF0,0x1F,0xF8,0x3F,0xFE,0xFF,0x7F,0xFE,0x7F,0xFE,0x3F,0xFC,0x0F,0xF0,},
- {/*-- 調入了一幅圖像:D:\設計\打印\數字取模圖片\7.bmp --*/
- /*-- 寬度x高度=16x32 --*/
- 0xFF,0xFC,0xFF,0xFE,0xFF,0xFF,0xFF,0xFF,0xFF,0xFF,0x00,0x1F,0x00,0x0F,0x00,0x0F,
- 0x00,0x0F,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x1F,0x00,0x3E,0x00,0x3E,0x00,0x3E,
- 0x00,0x3C,0x00,0x7C,0x00,0x78,0x00,0xF8,0x00,0xF8,0x00,0xF0,0x01,0xF0,0x01,0xF0,
- 0x01,0xE0,0x01,0xE0,0x03,0xE0,0x03,0xE0,0x03,0xC0,0x07,0xC0,0x07,0xC0,0x07,0xC0,},
- {/*-- 調入了一幅圖像:D:\設計\打印\數字取模圖片\8.bmp --*/
- /*-- 寬度x高度=16x32 --*/
- 0x0F,0xF0,0x1F,0xF8,0x3F,0xFC,0x7F,0xFE,0xFC,0x3F,0xF8,0x1F,0xF0,0x0F,0xF0,0x0F,
- 0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,0xF8,0x1F,0xFC,0x3F,0x7F,0xFE,0x3F,0xFC,
- 0x1F,0xF8,0x3F,0xFC,0x7F,0xFE,0xFC,0x3F,0xF8,0x1F,0xF0,0x0F,0xF0,0x0F,0xF0,0x0F,
- 0xF0,0x0F,0xF0,0x0F,0xF8,0x1F,0xFC,0x3F,0x7F,0xFE,0x3F,0xFC,0x1F,0xF8,0x0F,0xF0,},
- {/*-- 調入了一幅圖像:D:\設計\打印\數字取模圖片\6.bmp --*/
- /*-- 寬度x高度=16x32 --*/
- 0x0F,0xF0,0x3F,0xFC,0x7F,0xFE,0x7F,0xFE,0xFF,0x7F,0xFC,0x1F,0xF8,0x0F,0xF8,0x0F,
- 0xF8,0x0F,0xF8,0x0F,0xF8,0x0F,0xF8,0x0F,0xF8,0x0F,0x7C,0x1F,0x7F,0xFF,0x7F,0xFF,
- 0x3F,0xFF,0x03,0xFF,0x00,0x3F,0x00,0x1F,0x00,0x3F,0x00,0x3E,0x00,0x7E,0x00,0xFC,
- 0x03,0xF8,0x0F,0xF0,0x3F,0xE0,0x7F,0xC0,0x7F,0x80,0x7E,0x00,0x38,0x00,0x00,0x00,},
- {/*-- 調入了一幅圖像:這是您新建的圖像 --*/
- /*-- 寬度x高度=16x32 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,
- 0x07,0xC0,0x05,0x40,0x07,0xC0,0x06,0xC0,0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x03,0x80,0x07,0xC0,0x05,0x40,0x07,0xC0,0x06,0xC0,
- 0x03,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,}
- };
- unsigned int code music_tab[4][201] ={{ //天空之城
- 0x39,0x20,0x33,0x20,0x30,0x30,0x33,0x10,0x30,0x40,0x26,0x40,0x33,0x80,
- 0x4c,0x40,0x39,0x30,0x40,0x10,0x39,0x40,0x30,0x40,0x40,0x80,0x4c,0x20,
- 0x4c,0x20,0x48,0x30,0x4c,0x10,0x48,0x40,0x30,0x40,0x4c,0x80,0x30,0x20,
- 0x30,0x20,0x33,0x30,0x48,0x10,0x48,0x40,0x33,0x40,0x33,0x80,0x39,0x20,
- 0x33,0x20,0x30,0x30,0x33,0x10,0x30,0x40,0x26,0x40,0x33,0x80,0x4c,0x40,
- 0x39,0x30,0x40,0x10,0x39,0x40,0x30,0x40,0x40,0x80,0x55,0x20,0x4c,0x20,
- 0x48,0x40,0x30,0x20,0x33,0x30,0x30,0x20,0x2b,0x10,0x2b,0x30,0x26,0x10,
- 0x30,0x80,0x30,0x20,0x33,0x20,0x39,0x20,0x39,0x20,0x33,0x20,0x40,0x20,
- 0x39,0x80,0x30,0x20,0x2b,0x20,0x26,0x30,0x2b,0x10,0x26,0x40,0x20,0x40,
- 0x2b,0xc0,0x30,0x40,0x30,0x20,0x33,0x20,0x30,0x40,0x26,0x40,0x26,0xc0,
- 0x33,0x20,0x30,0x40,0x33,0x20,0x30,0x20,0x2b,0x40,0x30,0x60,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00},
- { //月亮代表我的心
- 0x40,0x20,0x30,0x60,0x26,0x20,0x20,0x60,0x30,0x20,0x33,0x60,0x26,0x20,
- 0x20,0x60,0x20,0x20,0x1c,0x60,0x19,0x20,0x20,0xc0,0x26,0x20,0x2b,0x20,
- 0x30,0x60,0x30,0x10,0x30,0x40,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,
- 0x30,0x40,0x2b,0x20,0x26,0x20,0x2b,0x60,0x39,0x10,0x33,0x40,0x30,0xc0,
- 0x26,0x40,0x26,0x60,0x2b,0x10,0x30,0x40,0x20,0x40,0x33,0xc0,0x39,0x20,
- 0x33,0x20,0x39,0x60,0x33,0x10,0x39,0x60,0x40,0x10,0x26,0xc0,0x20,0x40,
- 0x26,0x60,0x2b,0x10,0x30,0x40,0x20,0x40,0x33,0xc0,0x39,0x20,0x33,0x20,
- 0x30,0x60,0x30,0x10,0x30,0x40,0x2b,0x40,0x2b,0xc0,0x40,0x20,0x30,0x60,
- 0x26,0x10,0x20,0x60,0x30,0x10,0x33,0x60,0x26,0x10,0x20,0x60,0x20,0x10,
- 0x1c,0x60,0x19,0x10,0x20,0x80,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,
- 0x30,0x40,0x26,0x20,0x2b,0x20,0x30,0x60,0x30,0x10,0x30,0x40,0x2b,0x20,
- 0x26,0x20,0x2b,0x60,0x39,0x10,0x33,0x40,0x2b,0x40,0x30,0xc0,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00},
- { //你是風兒我是沙
- 0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,0x20,0x10,0x20,0xc0,
- 0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,0x26,0x20,0x26,0xc0,
- 0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,0x20,0x10,0x20,0xc0,
- 0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,0x30,0x20,0x30,0xc0,
- 0x26,0x20,0x2b,0x20,0x26,0x20,0x20,0x20,0x26,0x10,0x2b,0x10,0x30,0x20,
- 0x39,0x20,0x30,0x60,0x2b,0x10,0x26,0x80,0x2b,0x10,0x26,0x10,0x39,0x60,
- 0x2b,0x10,0x24,0x60,0x2b,0x10,0x26,0x20,0x26,0x60,0x30,0x60,0x39,0x10,
- 0x40,0x80,0x30,0x20,0x39,0x20,0x39,0x20,0x30,0x20,0x26,0x20,0x26,0x20,
- 0x26,0x20,0x26,0x20,0x2b,0x40,0x39,0x20,0x2b,0x60,0x30,0x20,0x39,0x20,
- 0x39,0x20,0x39,0x20,0x30,0x20,0x2b,0x20,0x2b,0x20,0x2b,0x20,0x26,0x40,
- 0x2b,0x20,0x30,0x80,0x26,0x20,0x20,0x20,0x18,0x20,0x1c,0x80,0x1c,0x30,
- 0x20,0x10,0x20,0xc0,0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,
- 0x26,0x20,0x26,0x80,0x26,0x30,0x20,0x10,0x18,0x20,0x1c,0x60,0x1c,0x30,
- 0x20,0x10,0x20,0xc0,0x1c,0x20,0x20,0x20,0x26,0x20,0x2b,0x80,0x39,0x20,
- 0x26,0x20,0x26,0xc0,0x00,},
- { // 莫斯科郊外的晚上
- 0x39,0x20,0x30,0x20,0x26,0x20,0x30,0x20,0x2b,0x40,0x30,0x20,0x33,0x20,
- 0x26,0x60,0x2b,0x40,0x39,0x80,0x30,0x20,0x26,0x20,0x20,0x20,0x20,0x20,
- 0x1c,0x40,0x20,0x20,0x24,0x20,0x26,0x80,0x24,0x40,0x20,0x40,0x19,0x20,
- 0x1c,0x20,0x26,0x40,0x33,0x40,0x39,0x20,0x26,0x20,0x2b,0x20,0x24,0x60,
- 0x20,0x20,0x24,0x20,0x26,0x40,0x2b,0x20,0x30,0x20,0x26,0x40,0x2b,0x40,
- 0x39,0x80,0x39,0x20,0x30,0x20,0x26,0x20,0x30,0x20,0x2b,0x40,0x30,0x20,
- 0x33,0x20,0x26,0x60,0x2b,0x40,0x39,0x80,0x30,0x20,0x26,0x20,0x20,0x20,
- 0x20,0x20,0x1c,0x40,0x20,0x20,0x24,0x20,0x26,0x80,0x24,0x40,0x20,0x40,
- 0x19,0x20,0x1c,0x20,0x26,0x40,0x33,0x40,0x39,0x20,0x26,0x20,0x2b,0x20,
- 0x24,0x60,0x20,0x20,0x24,0x20,0x26,0x40,0x2b,0x20,0x30,0x20,0x26,0x40,
- 0x2b,0x40,0x39,0x80,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00} };
- void jiemian();
- void LcdDisplay(int temp);
- void display();
- void zhudisplay();
- void TimerConfiguration();
- void key();
- void naoxian();
- void didi();
- void naoxianguangbiao();
- void linshengbofang();
- void sfmxiangao(uchar add,uchar bata);
- void sfmxiandi(uchar acc,uchar datb);
- void zhujiemian();
- void shua_display();
- void nyrdisplay();
- void delay (unsigned char m); //控制頻率延時
- void delayms(unsigned char a); //豪秒延時子程序
- void main()
- {
- zz=0;
- Beep=0;
- LCD12864_ClearScreen(); //清CGrom
- LCD12864_WriteCmd(0x01); //清屏
- LCD12864_Init();
- zhujiemian();
- TimerConfiguration();
- while(1)
- {
- key();
- if(biaozhi1==1)
- {
- shua_display();
- if(biaozhi==0)
- {
- biaozhi=1;
- LcdDisplay(Ds18b20ReadTemp());
- }
- if((naoshi==TIME[2])&&(naofen==TIME[1])&&(naobiao==1))//鬧鐘
- {
- if(linsheng<5)
- {
- linshengbofang();
- }
- if(linsheng==5)
- {
- didi();
- }
- }
- }
- }
- }
- void nyrdisplay()
- {
- LCD12864_SetWindow(0, 1);
- LCD12864_WriteData(0x30+TIME[6]/16); // 年
- LCD12864_WriteData(0x30+(TIME[6]&0x0f));
- LCD12864_WriteData(0x2d);
- LCD12864_WriteData(0x30+TIME[4]/16); //月
- LCD12864_WriteData(0x30+(TIME[4]&0x0f));
- LCD12864_WriteData(0x2d);
- LCD12864_WriteData(0x30+TIME[3]/16); //日
- LCD12864_WriteData(0x30+(TIME[3]&0x0f));
- LCD12864_SetWindow(0, 7);
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]); //星期
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);
- }
- void zhujiemian()
- {
- unsigned char i=0,j=0,k=0;
- LCD12864_SetWindow(0, 0);
- while(CharCode1[i]!='\0')
- {
- LCD12864_WriteData(CharCode1[i]);
- i++;
- if(i==16) //第一行滿寫第三行
- {
- LCD12864_SetWindow(1,0);
- }
- if(i==32) //第三行滿寫第四行
- {
- LCD12864_SetWindow(2,0);
- }
- if(i==48) //第三行滿寫第四行
- {
- LCD12864_SetWindow(3,0);
- }
- }
- zhudisplay();
- LCD12864_WriteCmd(0x36); //開啟拓展指令集
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x90+i);
- LCD12864_WriteCmd(0x90+2);
- LCD12864_WriteData(tab[10][j++]);
- LCD12864_WriteData(tab[10][j++]); //顯示笑臉
- LCD12864_WriteCmd(0x90+i);
- LCD12864_WriteCmd(0x90+5);
- LCD12864_WriteData(tab[10][k++]);
- LCD12864_WriteData(tab[10][k++]);
- }
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x80+i);
- LCD12864_WriteCmd(0x98+2);
- LCD12864_WriteData(tab[10][j++]); //顯示笑臉
- LCD12864_WriteData(tab[10][j++]);
- LCD12864_WriteCmd(0x80+i);
- LCD12864_WriteCmd(0x98+5);
- LCD12864_WriteData(tab[10][k++]);
- LCD12864_WriteData(tab[10][k++]);
- }
- LCD12864_WriteCmd(0x30); //恢復基本指令集
- }
- void shua_display()
- {
- Ds1302ReadTime();
- if((TIME[2]==0x00)&&(TIME[0]<=5))
- nyrdisplay();
- if((TIME[1]==0x00)&&(TIME[0]<=3))
- {
- if((TIME[2]&0x0f)==0)
- sfmxiangao(0,TIME[2]);
- sfmxiandi(1,TIME[2]); //時
- didi(); //整點報時
- }
- if(TIME[0]<=2)
- {
- if((TIME[1]&0x0f)==0)
- sfmxiangao(3,TIME[1]); //分
- sfmxiandi(4,TIME[1]);
- }
- if((TIME[0]&0x0f)==0)
- sfmxiangao(6,TIME[0]); //秒
- sfmxiandi(7,TIME[0]);
- }
- void zhudisplay()
- {
- Ds1302ReadTime();
- nyrdisplay();
- sfmxiangao(0,TIME[2]);
- sfmxiandi(1,TIME[2]); //時
- sfmxiangao(3,TIME[1]); //分
- sfmxiandi(4,TIME[1]);
- sfmxiangao(6,TIME[0]); //秒
- sfmxiandi(7,TIME[0]);
- }
- void int1() interrupt 3 //采用定時中斷1 控制節拍
- { TH1=0xd8;
- TL1=0xef;
- n--;
- }
- void delay (unsigned char m) //控制頻率延時
- {
- unsigned i=3*m;
- while(--i);
- }
- void delayms(unsigned char a) //豪秒延時子程序
- {
- while(--a); //采用while(--a) 不要采用while(a--); 各位可編譯一下看看匯編結果就知道了!
- }
- void linshengbofang()
- { unsigned char p=0,m; //m為頻率常數變量
- unsigned char i=0,j;
- for(j=0;j<150;j++)
- {
- a:p=music_tab[linsheng][i];
- if(p==0x00) { i=0, delayms(1000); return;} //如果碰到結束符,延時1秒,回到開始再來一遍
- else if(p==0xff) { i=i+1;delayms(100),TR0=0; goto a;} //若碰到休止符,延時100ms,繼續取下一音符
- else {m=music_tab[linsheng-1][i++], n=music_tab[linsheng-1][i++];} //取頻率常數 和 節拍常數
- TR1=1; //開定時器1
- while(n!=0) Beep=~Beep,delay(m); //等待節拍完成, 通過P1口輸出音頻(可多聲道哦!)
- TR1=0; //關定時器1
- }
- }
- void naojie()
- {
- unsigned char i=0;
- LCD12864_SetWindow(0, 0);
- while(naozhong[i]!='\0')
- {
- LCD12864_WriteData(naozhong[i]);
- i++;
- if(i==16) //第一行滿寫第三行
- LCD12864_SetWindow(1,0);
- if(i==32) //第三行滿寫第四行
- LCD12864_SetWindow(2,0);
- if(i==48) //第三行滿寫第四行
- LCD12864_SetWindow(3,0);
- }
- }
- void naoxianguangbiao()
- {
- if(SetPlace==0)
- LCD12864_SetWindow(2, 6);
- if(SetPlace==1)
- LCD12864_SetWindow(2, 4);
- if(SetPlace==2)
- LCD12864_SetWindow(2, 2);
- if(SetPlace==3)
- LCD12864_SetWindow(1, 4);
- if(SetPlace==4)
- LCD12864_SetWindow(1, 2);
- if(SetPlace==5)
- LCD12864_SetWindow(1, 7);
- if(SetPlace==8) //鬧鐘設置
- LCD12864_SetWindow(0, 6);
- if(SetPlace==9)
- LCD12864_SetWindow(1, 2);
- if(SetPlace==10)
- LCD12864_SetWindow(1, 4);
- if(SetPlace==11)
- LCD12864_SetWindow(3, 0);
- }
- void sfmxiangao(uchar add,uchar bata)
- {
- uchar i,j=0;
- LCD12864_WriteCmd(0x36); //開啟拓展指令集
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x90+i);
- LCD12864_WriteCmd(0x90+add);
- LCD12864_WriteData(tab[bata/16][j++]);
- LCD12864_WriteData(tab[bata/16][j++]);
- }
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x80+i);
- LCD12864_WriteCmd(0x98+add);
- LCD12864_WriteData(tab[bata/16][j++]);
- LCD12864_WriteData(tab[bata/16][j++]);
- }
- LCD12864_WriteCmd(0x30); //恢復基本指令集
- }
- void sfmxiandi(uchar acc,uchar datb)
- {
- uchar i,j=0;
- LCD12864_WriteCmd(0x36); //開啟拓展指令集
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x90+i);
- LCD12864_WriteCmd(0x90+acc);
- LCD12864_WriteData(tab[datb&0x0f][j++]);
- LCD12864_WriteData(tab[datb&0x0f][j++]);
- }
- for(i=0;i<16;i++)
- {
- LCD12864_WriteCmd(0x80+i);
- LCD12864_WriteCmd(0x98+acc);
- LCD12864_WriteData(tab[datb&0x0f][j++]);
- LCD12864_WriteData(tab[datb&0x0f][j++]);
- }
- LCD12864_WriteCmd(0x30); //恢復基本指令集
- }
- void shixian() //調節時間顯示
- {
- if(SetPlace==0)
- {
- LCD12864_WriteData(0x30+(TIME[0]/16)); //秒
- LCD12864_WriteData(0x30+(TIME[0]&0x0f));
- LCD12864_SetWindow(2, 6);
- }
- if(SetPlace==1)
- {
- LCD12864_WriteData(0x30+(TIME[1]/16)); //分
- LCD12864_WriteData(0x30+(TIME[1]&0x0f));
- LCD12864_SetWindow(2, 4);
- }
- if(SetPlace==2)
- {
- LCD12864_WriteData(0x30+(TIME[2]/16)); //時
- LCD12864_WriteData(0x30+(TIME[2]&0x0f));
- LCD12864_SetWindow(2, 2);
- }
- if(SetPlace==3)
- {
- LCD12864_WriteData(0x30+(TIME[3]/16)); //日
- LCD12864_WriteData(0x30+(TIME[3]&0x0f));
- LCD12864_SetWindow(1, 4);
- }
- if(SetPlace==4)
- {
- LCD12864_WriteData(0x30+(TIME[4]/16)); //月
- LCD12864_WriteData(0x30+(TIME[4]&0x0f));
- LCD12864_SetWindow(1, 2);
- }
- if(SetPlace==5)
- {
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]); //星期
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);
- LCD12864_SetWindow(1, 7);
- }
- }
- void naoxian()
- {
- uchar zishu=0;
- if(SetPlace==8) //鬧鐘設置
- {
- LCD12864_SetWindow(0, 6);
- }
- if(SetPlace==9)
- {
- LCD12864_WriteData(0x30+(naoshi/16)); //時
- LCD12864_WriteData(0x30+(naoshi&0x0f));
- LCD12864_SetWindow(1, 2);
- }
- if(SetPlace==10)
- {
- LCD12864_WriteData(0x30+(naofen/16)); //分
- LCD12864_WriteData(0x30+(naofen&0x0f));
- LCD12864_SetWindow(1, 4);
- }
- if(SetPlace==11)
- {
- if(linsheng==1) //顯示鈴聲名字
- {
- for(zishu=0;zishu<16;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- }
- if(linsheng==2)
- for(zishu=16;zishu<32;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==3)
- for(zishu=32;zishu<48;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==4)
- for(zishu=48;zishu<64;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==5)
- for(zishu=64;zishu<80;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- LCD12864_SetWindow(3, 0);
- }
- }
- void didi()
- {
- zz=1;
- Delay1ms(80);
- zz=0;
- Delay1ms(80);
- zz=1;
- Delay1ms(80);
- zz=0;
- Delay1ms(80);
- zz=1;
- Delay1ms(80);
- zz=0;
- Delay1ms(80);
- zz=1;
- Delay1ms(200);
- zz=0;
- }
- void key()
- {
- uchar zishu=0;
- if(s1==0) //檢測按鍵K1是否按下
- {
- Delay1ms(10); //消除抖動
- if((s1==0)&&(keysun>=2))
- {
- while(s1==0); //松手檢測
- if(SetPlace==-1)
- {
- LCD12864_WriteCmd(0x01);
- biaozhi1=0;
- keysun=3;
- jiemian();
- display();
- }
- SetPlace++;
- LCD12864_WriteCmd(0x0f); //顯示開,開光標
- if(SetPlace==6)
- {
- LCD12864_WriteCmd(0x0c); //顯示開,關光標
- SetPlace=-1;keysun=2;
- biaozhi1=1;
- Ds1302Init();
- zhujiemian();
- }
- naoxianguangbiao();
- }
- }
- if(s4==0)
- {
- Delay1ms(10);
- if((s4==0)&&(keysun<=2))
- {
- while(s4==0); //松手檢測
- biaozhi1=0;
- keysun=1;
- if(SetPlace==-1)
- {
- LCD12864_WriteCmd(0x01);
- naojie();
- SetPlace=7;
- LCD12864_SetWindow(0, 6);
- if(naobiao==0)
- {
- LCD12864_WriteData(xiqi[18]);
- LCD12864_WriteData(xiqi[19]); //顯示關
- }
- else
- {
- LCD12864_WriteData(xiqi[16]);
- LCD12864_WriteData(xiqi[17]); //顯示開
- }
- LCD12864_SetWindow(1, 2);
- LCD12864_WriteData(0x30+(naoshi/16)); //時
- LCD12864_WriteData(0x30+(naoshi&0x0f));
- LCD12864_SetWindow(1, 4);
- LCD12864_WriteData(0x30+(naofen/16)); //分
- LCD12864_WriteData(0x30+(naofen&0x0f));
- LCD12864_SetWindow(3, 0);
- if(linsheng==1)
- {
- for(zishu=0;zishu<16;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- }
- if(linsheng==2)
- for(zishu=16;zishu<32;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==3)
- for(zishu=32;zishu<48;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==4)
- for(zishu=48;zishu<64;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- if(linsheng==5)
- for(zishu=64;zishu<80;zishu++)
- {
- LCD12864_WriteData(naozhonglinshen[zishu]);
- }
- }
- SetPlace++;
- LCD12864_WriteCmd(0x0f); //顯示開,開光標
- if(SetPlace>=12)
- {
- LCD12864_WriteCmd(0x0c); //顯示開,關光標
- SetPlace=-1;keysun=2;
- biaozhi1=1;
- LCD12864_WriteCmd(0x01);
- zhujiemian();
- }
- naoxianguangbiao();
- naoxian();
- }
- }
- if(biaozhi1==0)
- {
- if(s2==0) //檢測按鍵K2是否按下
- {
- Delay1ms(10); //消除抖動
- if(s2==0)
- {
- while(s2==0); //松手檢測
- if(SetPlace<=6)
- {
- TIME[SetPlace]++;
- if((TIME[SetPlace]&0x0f)>9) //換成BCD碼。
- TIME[SetPlace]=TIME[SetPlace]+6;
- if((TIME[SetPlace]>=0x60)&&(SetPlace<2)) //分秒只能到59
- TIME[SetPlace]=0;
- if((TIME[SetPlace]>=0x24)&&(SetPlace==2)) //小時只能到23
- TIME[SetPlace]=0;
- if((TIME[SetPlace]>=0x32)&&(SetPlace==3)) //日只能到31
- TIME[SetPlace]=1;
- if((TIME[SetPlace]>=0x13)&&(SetPlace==4)) //月只能到12
- TIME[SetPlace]=1;
- if((TIME[SetPlace]>=0x8)&&(SetPlace==5)) //周只能到7
- TIME[SetPlace]=1;
- }
- else
- {
- if(SetPlace==8)
- {
- naobiao=~naobiao;
- if(naobiao==0)
- {
- LCD12864_WriteData(xiqi[18]);
- LCD12864_WriteData(xiqi[19]);
- }
- else
- {
- LCD12864_WriteData(xiqi[16]);
- LCD12864_WriteData(xiqi[17]);
- }
- }
- if(SetPlace==9)
- {
- naoshi++;
- if((naoshi&0x0f)>9) //換成BCD碼。
- naoshi=naoshi+6;
- if(naoshi>=0x24)
- naoshi=0;
- }
- if(SetPlace==10)
- {
- naofen++;
- if((naofen&0x0f)>9) //換成BCD碼。
- naofen=naofen+6;
- if(naofen>=0x60)
- naofen=0;
- }
- if(SetPlace==11)
- {
- linsheng++;
- if(linsheng==6)
- linsheng=1;
- }
- }
- }
- shixian();
- naoxian();
- }
- if(s3==0) //檢測按鍵K3是否按下
- {
- Delay1ms(10); //消除抖動
- if(s3==0)
- {
- while(s3==0); //松手檢測
- if(SetPlace<=6)
- {
- TIME[SetPlace]--;
- if((TIME[SetPlace]&0x0f)>9) //換成BCD碼。
- TIME[SetPlace]=TIME[SetPlace]-6;
- if((TIME[SetPlace]<=-1)&&(SetPlace<2)) //分秒只能到59
- TIME[SetPlace]=0x59;
- if((TIME[SetPlace]<=-1)&&(SetPlace==2)) //小時只能到23
- TIME[SetPlace]=0x23;
- if((TIME[SetPlace]<=0)&&(SetPlace==3)) //日只能到31
- TIME[SetPlace]=0x31;
- if((TIME[SetPlace]<=0)&&(SetPlace==4)) //月只能到12
- TIME[SetPlace]=0x12;
- if((TIME[SetPlace]<=0)&&(SetPlace==5)) //周只能到7
- TIME[SetPlace]=7;
- }
- else
- {
- if(SetPlace==8)
- {
- naobiao=~naobiao;
- if(naobiao==0)
- {
- LCD12864_WriteData(xiqi[18]);
- LCD12864_WriteData(xiqi[19]); //顯示開關
- }
- else
- {
- LCD12864_WriteData(xiqi[16]);
- LCD12864_WriteData(xiqi[17]); //顯示開關
- }
- }
- if(SetPlace==9) //鬧鐘時
- {
- naoshi--;
- if((naoshi&0x0f)>9) //換成BCD碼。
- naoshi=naoshi-6;
- if(naoshi<0)
- naoshi=0x23;
- }
- if(SetPlace==10) //鬧鐘分
- {
- naofen--;
- if((naofen&0x0f)>9) //換成BCD碼。
- naofen=naofen-6;
- if(naofen<0)
- naofen=0x59;
- }
- if(SetPlace==11) //鈴聲選擇
- {
- linsheng--;
- if(linsheng==0)
- linsheng=5;
- }
- }
- }
- naoxian();
- shixian();
- }
- }
- }
- void jiemian()
- {
- unsigned char i=0;
- LCD12864_SetWindow(0, 0);
- while(CharCode[i]!='\0')
- {
- LCD12864_WriteData(CharCode[i]);
- i++;
- if(i==16) //第一行滿寫第二行
- LCD12864_SetWindow(1,0);
- if(i==32) //第二行滿寫第三行
- LCD12864_SetWindow(2,0);
- if(i==48) //第三行滿寫第四行
- LCD12864_SetWindow(3,0);
- }
- }
- void Delay1ms(unsigned int y)
- {
- unsigned int x;
- for(y;y>0;y--)
- for(x=110;x>0;x--);
- }
- /*******************************************************************************
- * 函數名 : Ds18b20Init
- * 函數功能 : 初始化
- * 輸入 : 無
- * 輸出 : 初始化成功返回1,失敗返回0
- *******************************************************************************/
- unsigned char Ds18b20Init()
- {
- unsigned int i;
- DSPORT=0; //將總線拉低480us~960us
- i=70;
- while(i--);//延時642us
- DSPORT=1; //然后拉高總線,如果DS18B20做出反應會將在15us~60us后總線拉低
- i=0;
- while(DSPORT) //等待DS18B20拉低總線
- {
- i++;
- if(i>5000)//等待>5MS
- return 0;//初始化失敗
- }
- return 1;//初始化成功
- }
- /*******************************************************************************
- * 函數名 : Ds18b20WriteByte
- * 函數功能 : 向18B20寫入一個字節
- * 輸入 : com
- * 輸出 : 無
- *******************************************************************************/
- void Ds18b20WriteByte(unsigned char dat)
- {
- unsigned int i,j;
- for(j=0;j<8;j++)
- {
- DSPORT=0; //每寫入一位數據之前先把總線拉低1us
- i++;
- DSPORT=dat&0x01; //然后寫入一個數據,從最低位開始
- i=6;
- while(i--); //延時68us,持續時間最少60us
- DSPORT=1; //然后釋放總線,至少1us給總線恢復時間才能接著寫入第二個數值
- dat>>=1;
- }
- }
- /*******************************************************************************
- * 函數名 : Ds18b20ReadByte
- * 函數功能 : 讀取一個字節
- * 輸入 : com
- * 輸出 : 無
- *******************************************************************************/
- unsigned char Ds18b20ReadByte()
- {
- unsigned char byte,bi;
- unsigned int i,j;
- for(j=8;j>0;j--)
- {
- DSPORT=0;//先將總線拉低1us
- i++;
- DSPORT=1;//然后釋放總線
- i++;
- i++;//延時6us等待數據穩定
- bi=DSPORT; //讀取數據,從最低位開始讀取
- /*將byte左移一位,然后與上右移7位后的bi,注意移動之后移掉那位補0。*/
- byte=(byte>>1)|(bi<<7);
- i=4; //讀取完之后等待48us再接著讀取下一個數
- while(i--);
- }
- return byte;
- }
- /*******************************************************************************
- * 函數名 : Ds18b20ChangTemp
- * 函數功能 : 讓18b20開始轉換溫度
- * 輸入 : com
- * 輸出 : 無
- *******************************************************************************/
- void Ds18b20ChangTemp()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0x44); //溫度轉換命令
- Delay1ms(100); //等待轉換成功,而如果你是一直刷著的話,就不用這個延時了
- }
- /*******************************************************************************
- * 函數名 : Ds18b20ReadTempCom
- * 函數功能 : 發送讀取溫度命令
- * 輸入 : com
- * 輸出 : 無
- *******************************************************************************/
- void Ds18b20ReadTempCom()
- {
- Ds18b20Init();
- Delay1ms(1);
- Ds18b20WriteByte(0xcc); //跳過ROM操作命令
- Ds18b20WriteByte(0xbe); //發送讀取溫度命令
- }
- /*******************************************************************************
- * 函數名 : Ds18b20ReadTemp
- * 函數功能 : 讀取溫度
- * 輸入 : com
- * 輸出 : 無
- *******************************************************************************/
- int Ds18b20ReadTemp()
- {
- int temp=0;
- unsigned char tmh,tml;
- Ds18b20ChangTemp(); //先寫入轉換命令
- Ds18b20ReadTempCom(); //然后等待轉換完后發送讀取溫度命令
- tml=Ds18b20ReadByte(); //讀取溫度值共16位,先讀低字節
- tmh=Ds18b20ReadByte(); //再讀高字節
- temp=tmh;
- temp<<=8;
- temp|=tml;
- return temp;
- }
- void LcdDisplay(int temp) //lcd顯示
- {
-
- unsigned char datas[] = {0, 0, 0, 0, 0}; //定義數組
- float tp;
- if(temp< 0) //當溫度值為負數
- {
- LCD12864_SetWindow(3, 5);
- LCD12864_WriteData(0x2d); //顯示負
- //因為讀取的溫度是實際溫度的補碼,所以減1,再取反求出原碼
- temp=temp-1;
- temp=~temp;
- tp=temp;
- temp=tp*0.0625*100+0.5;
- //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
- //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算由?.5,還是在小數點后面。
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- //寫地址 80表示初始地址
- LCD12864_WriteData(0x30+datas[2]); //個位
- LCD12864_WriteData(0x2e); //顯示 ‘.’
- LCD12864_WriteData(0x30+datas[3]); //顯示小數點
-
- }
- else
- {
- LCD12864_SetWindow(3, 5);
- tp=temp;//因為數據處理有小數點所以將溫度賦給一個浮點型變量
- //如果溫度是正的那么,那么正數的原碼就是補碼它本身
- temp=tp*0.0625*100+0.5;
- //留兩個小數點就*100,+0.5是四舍五入,因為C語言浮點數轉換為整型的時候把小數點
- //后面的數自動去掉,不管是否大于0.5,而+0.5之后大于0.5的就是進1了,小于0.5的就
- //算加上0.5,還是在小數點后面。
-
- datas[1] = temp % 10000 / 1000;
- datas[2] = temp % 1000 / 100;
- datas[3] = temp % 100 / 10;
- //寫地址
- LCD12864_WriteData(0x30+datas[1]); //十位
- LCD12864_WriteData(0x30+datas[2]); //個位
- LCD12864_WriteData(0x2e); //顯示 ‘.’
- LCD12864_WriteData(0x30+datas[3]); //顯示小數點
- }
- }
- void Ds1302Write(uchar addr, uchar dat)
- {
- uchar n;
- RST = 0;
- _nop_();
- SCLK = 0;//先將SCLK置低電平。
- _nop_();
- RST = 1; //然后將RST(CE)置高電平。
- _nop_();
- for (n=0; n<8; n++)//開始傳送八位地址命令
- {
- DSIO = addr & 0x01;//數據從低位開始傳送
- addr >>= 1;
- SCLK = 1;//數據在上升沿時,DS1302讀取數據
- _nop_();
- SCLK = 0;
- _nop_();
- }
- for (n=0; n<8; n++)//寫入8位數據
- {
- DSIO = dat & 0x01;
- dat >>= 1;
- SCLK = 1;//數據在上升沿時,DS1302讀取數據
- _nop_();
- SCLK = 0;
- _nop_();
- }
-
- RST = 0;//傳送數據結束
- _nop_();
- }
- uchar Ds1302Read(uchar addr)
- {
- uchar n,dat,dat1;
- RST = 0;
- _nop_();
- SCLK = 0;//先將SCLK置低電平。
- _nop_();
- RST = 1;//然后將RST(CE)置高電平。
- _nop_();
- for(n=0; n<8; n++)//開始傳送八位地址命令
- {
- DSIO = addr & 0x01;//數據從低位開始傳送
- addr >>= 1;
- SCLK = 1;//數據在上升沿時,DS1302讀取數據
- _nop_();
- SCLK = 0;//DS1302下降沿時,放置數據
- _nop_();
- }
- _nop_();
- for(n=0; n<8; n++)//讀取8位數據
- {
- dat1 = DSIO;//從最低位開始接收
- dat = (dat>>1) | (dat1<<7);
- SCLK = 1;
- _nop_();
- SCLK = 0;//DS1302下降沿時,放置數據
- _nop_();
- }
- RST = 0;
- _nop_(); //以下為DS1302復位的穩定時間,必須的。
- SCLK = 1;
- _nop_();
- DSIO = 0;
- _nop_();
- DSIO = 1;
- _nop_();
- return dat;
- }
- void Ds1302Init()
- {
- uchar n;
- Ds1302Write(0x8E,0X00); //禁止寫保護,就是關閉寫保護功能
- for (n=0; n<7; n++)//寫入7個字節的時鐘信號:分秒時日月周年
- {
- Ds1302Write(WRITE_RTC_ADDR[n],TIME[n]);
- }
- Ds1302Write(0x8E,0x80); //打開寫保護功能
- }
- void Ds1302ReadTime()
- {
- uchar n;
- for (n=0; n<7; n++)//讀取7個字節的時鐘信號:分秒時日月周年
- {
- TIME[n] = Ds1302Read(READ_RTC_ADDR[n]);
- }
- }
- void TimerConfiguration()
- {
- TMOD = 0x11; //選擇工作方式1
- TH0 = 0x3C; //設置初始值,定時50MS
- TL0 = 0xB0;
- EA = 1; //打開總中斷
- ET0 = 1; //打開定時器0中斷
- TR0 = 1; //啟動定時器0
- zz=0;//關蜂鳴器
- TH1=0xd8;TL1=0xef;
- ET1=1;
- }
- void Timer0() interrupt 1
- {
- TH0 = 0x3C; //設置初始值
- TL0 = 0xB0;
- timeji++;
- if(timeji==200)
- {
- timeji=0;
- biaozhi=0;
- }
- }
- void display()
- {
- LCD12864_SetWindow(1, 0);
- LCD12864_WriteData(0x30+TIME[6]/16); // 年
- LCD12864_WriteData(0x30+(TIME[6]&0x0f));
- LCD12864_SetWindow(1, 2);
- LCD12864_WriteData(0x30+TIME[4]/16); //月
- LCD12864_WriteData(0x30+(TIME[4]&0x0f));
- LCD12864_SetWindow(1, 4);
- LCD12864_WriteData(0x30+TIME[3]/16); //日
- LCD12864_WriteData(0x30+(TIME[3]&0x0f));
- LCD12864_SetWindow(1, 7);
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2]); //星期
- LCD12864_WriteData(xiqi[(TIME[5]&0x07)*2+1]);
- LCD12864_SetWindow(2, 2);
- LCD12864_WriteData(0x30+TIME[2]/16); //時
- LCD12864_WriteData(0x30+(TIME[2]&0x0f));
- LCD12864_SetWindow(2, 4);
- LCD12864_WriteData(0x30+TIME[1]/16); //分
- LCD12864_WriteData(0x30+(TIME[1]&0x0f));
- LCD12864_SetWindow(2, 6);
- LCD12864_WriteData(0x30+TIME[0]/16); //秒
- LCD12864_WriteData(0x30+(TIME[0]&0x0f));
- }
復制代碼
|