- #include <REGX52.H>
- #include "STC12C5A60S2"
- #include "intrins.h"
- #define uchar unsigned char
- #define uint unsigned int
- uchar l_tmpDate[]={0,0,0,1,1,1,13};//秒分時日月周年08-05-15 12:00:00
- uchar l_tmpdisplay[15];
- code uchar Write_rtc_address[7]={0x80,0x82,0x84,0x86,0x88,0x8a,0x8c}; //秒分時日月周年 最低位讀寫位
- code uchar Read_RTC_address[7]={0x81,0x83,0x85,0x87,0x89,0x8b,0x8d};
- sbit SCK = P1^3; //DS1302時鐘;
- sbit SDA = P1^4; //DS1302數據;
- sbit RST = P1^5;// DS1302復位;
- uchar set=0; //按鍵選擇標志位;
- char key_flag=0;//按鍵加減標志位;
- uchar menue=0; //菜單選擇標志位;
- uchar ok=0; //確認標志位;
- char miao,fen,shi,ri,yue,zhou,nian;/*時間日期數值標志位;*/
- /////////////DS1302寫一個字節/////
- void Write_Ds1302_Byte(uchar temp)
- {
- uchar i;
- for (i=0;i<8;i++) //循環8次 寫入數據
- {
- SCK=0;
- SDA=temp&0x01; //每次傳輸低字節
- temp>>=1; //右移一位
- SCK=1;
- }
- }
- /*****************/ /*
- 寫入DS1302
- */ /************************/
- void Write_Ds1302(uchar address,uchar dat )
- {
- RST=0; _nop_();
- SCK=0; _nop_();
- RST=1; _nop_(); //啟動
- Write_Ds1302_Byte(address); //發送地址
- Write_Ds1302_Byte(dat); //發送數據
- RST=0; //恢復
- }
- /***************/ /*
- 讀出DS1302數據
- */ /*********************/
- uchar Read_Ds1302 ( uchar address )
- {
- uchar i,temp=0x00;
- RST=0; _nop_(); _nop_();
- SCK=0; _nop_(); _nop_();
- RST=1; _nop_();
- _nop_();
- Write_Ds1302_Byte(address);
- for (i=0;i<8;i++) //循環8次 讀取數據
- {
- if(SDA)
- {
- temp|=0x80;
- } //每次傳輸低字節
- temp>>=1; //右移一位
- SCK=1; _nop_(); _nop_();
- SCK=0;
- }
- RST=0; _nop_();
- //以下為DS1302復位的穩定時間
- _nop_();
- RST=0;
- SCK=0; _nop_(); _nop_(); _nop_(); _nop_();
- SCK=1; _nop_(); _nop_();
- SDA=0; _nop_(); _nop_();
- SDA=1; _nop_(); _nop_();
- return (temp); //返回
- }
- /**************************/ /*
- 讀時鐘數據
- */ /***********************/
- void Read_RTC(void) //讀取 日歷
- {
- uchar i,*p;
- p=Read_RTC_address; //地址傳遞
- for(i=0;i<7;i++) //分7次讀取 秒分時日月周年
- {
- l_tmpDate[i]=Read_Ds1302(*p);
- p++;
- }
- }
- /***************************/ /*
- 設定時鐘數據
- */ /************************/
- void Set_RTC(void) //設定 日歷
- {
- uchar i,*p,tmp;
- for(i=0;i<7;i++)
- { //BCD處理
- tmp=l_tmpDate[i]/10;
- l_tmpDate[i]=l_tmpDate[i]%10;
- l_tmpDate[i]=l_tmpDate[i]+tmp*16;
- }
- Write_Ds1302(0x8E,0X00); //關閉寫保護;
- p=Write_rtc_address; //傳地址
- for(i=0;i<7;i++) //7次寫入 秒分時日月周年
- {
- Write_Ds1302(*p,l_tmpDate[i]);
- p++;
- }
- Write_Ds1302(0x8E,0x80); //打開寫保護;
- }
- /*********8x16字模 ****************************/
- //取模方式:逐行式 逆向 陰碼 寬x高=8x16
- uchar code table[]={
- /*-- 文字: 0 --*/ /*-- 宋體12;
- 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x42,0x42,0x42,0x42,
- 0x24,0x18,0x00,0x00,
- /*-- 文字: 1 --*/ /*-- 宋體12;
- 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x08,0x0E,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
- 0x08,0x3E,0x00,0x00,
- /*-- 文字: 2 --*/ /*-- 宋體12;
- 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x20,0x20,0x10,0x08,0x04,
- 0x42,0x7E,0x00,0x00,
- /*-- 文字: 3 --*/ /*-- 宋體12;
- 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x3C,0x42,0x42,0x20,0x18,0x20,0x40,0x40,0x42,
- 0x22,0x1C,0x00,0x00,
- /*-- 文字: 4 --*/ /*-- 宋體12;
- 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x20,0x30,0x28,0x24,0x24,0x22,0x22,0x7E,0x20,
- 0x20,0x78,0x00,0x00,
- /*-- 文字: 5 --*/ /*-- 宋體12;
- 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x7E,0x02,0x02,0x02,0x1A,0x26,0x40,0x40,0x42,
- 0x22,0x1C,0x00,0x00,
- /*-- 文字: 6 --*/ /*-- 宋體12;
- 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x38,0x24,0x02,0x02,0x1A,0x26,0x42,0x42,0x42,
- 0x24,0x18,0x00,0x00,
- /*-- 文字: 7 --*/ /*-- 宋體12;
- 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x7E,0x22,0x22,0x10,0x10,0x08,0x08,0x08,0x08,
- 0x08,0x08,0x00,0x00,
- /*-- 文字: 8 --*/ /*-- 宋體12;
- 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x3C,0x42,0x42,0x42,0x24,0x18,0x24,0x42,0x42,
- 0x42,0x3C,0x00,0x00,
- /*-- 文字: 9 --*/ /*-- 宋體12;
- 此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x18,0x24,0x42,0x42,0x42,0x64,0x58,0x40,0x40,
- 0x24,0x1C,0x00,0x00,
- /*-- 文字: - --*///10; /*-- 宋體12;
- //此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,
- /*-- 文字: : --*///11; /*-- 宋體12;
- //此字體下對應的點陣為:寬x高=8x16 --*/
- ////0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,0x00,
- //0x18,0x18,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,0x00,
- 0x18,0x18,0x00,0x00,
- /*-- 文字: _ --*///12 /*-- 宋體12;
- //此字體下對應的點陣為:寬x高=8x16 --*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0xFF,
- /****************空格****13*****************/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,/*" ",0*/
- //////////////C//14//////////////
- //取模方式:逐行式 逆向 陰碼 寬x高=8x16
- 0x00,0x00,0x3C,0x3E,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x02,
- 0x02,0x3E,0x3C,0x00,
- //14 'a'-83;
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C, 0x42,0x78,0x44,
- 0x42,0x42,0xFC,0x00,0x00,/*"a",0*/
- 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x1A,
- 0x26,0x42,0x42,0x42,0x26,0x1A,0x00,0x00,/*"b",1*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x38,
- 0x44,0x02,0x02,0x02,0x44,0x38,0x00,0x00,/*"c",2*/
- 0x00,0x00,0x00,0x60,0x40,0x40,0x40,0x78,
- 0x44,0x42,0x42,0x42,0x64,0xD8,0x00,0x00,/*"d",3*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,
- 0x42,0x7E,0x02,0x02,0x42,0x3C,0x00,0x00,/*"e",4*/
- 0x00,0x00,0x00,0xF0,0x88,0x08,0x08,0x7E,
- 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"f",5*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,
- 0x22,0x22,0x1C,0x02,0x3C,0x42,0x42,0x3C,/*"g",6*/
- 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x3A,
- 0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"h",7*/
- 0x00,0x00,0x00,0x0C,0x0C,0x00,0x00,0x0E,
- 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"i",8*/
- 0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x38,
- 0x20,0x20,0x20,0x20,0x20,0x20,0x22,0x1E,/*"j",9*/
- 0x00,0x00,0x00,0x03,0x02,0x02,0x02,0x72,
- 0x12,0x0A,0x16,0x12,0x22,0x77,0x00,0x00,/*"k",10*/
- 0x00,0x00,0x00,0x0E,0x08,0x08,0x08,0x08,
- 0x08,0x08,0x08,0x08,0x08,0x3E,0x00,0x00,/*"l",11*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,
- 0x92,0x92,0x92,0x92,0x92,0xB7,0x00,0x00,/*"m",12*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3B,
- 0x46,0x42,0x42,0x42,0x42,0xE7,0x00,0x00,/*"n",13*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3C,
- 0x42,0x42,0x42,0x42,0x42,0x3C,0x00,0x00,/*"o",14*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x1B,
- 0x26,0x42,0x42,0x42,0x22,0x1E,0x02,0x07,/*"p",15*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x78,
- 0x44,0x42,0x42,0x42,0x44,0x78,0x40,0xE0,/*"q",16*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x77,
- 0x4C,0x04,0x04,0x04,0x04,0x1F,0x00,0x00,/*"r",17*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7C,
- 0x42,0x02,0x3C,0x40,0x42,0x3E,0x00,0x00,/*"s",18*/
- 0x00,0x00,0x00,0x00,0x00,0x08,0x08,0x3E,
- 0x08,0x08,0x08,0x08,0x08,0x30,0x00,0x00,/*"t",19*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x63,
- 0x42,0x42,0x42,0x42,0x62,0xDC,0x00,0x00,/*"u",20*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,
- 0x42,0x24,0x24,0x14,0x08,0x08,0x00,0x00,/*"v",21*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xEB,
- 0x49,0x49,0x55,0x55,0x22,0x22,0x00,0x00,/*"w",22*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x76,
- 0x24,0x18,0x18,0x18,0x24,0x6E,0x00,0x00,/*"x",23*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE7,
- 0x42,0x24,0x24,0x14,0x18,0x08,0x08,0x07,/*"y",24*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7E,
- 0x22,0x10,0x08,0x08,0x44,0x7E,0x00,0x00,/*"z",25*/
- };
- /************16x16 字模 ***************/
- //取模方式:逐行式 逆向 陰碼 寬x高=16x16
- uchar code table1[]={
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x7F,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"一",0*/
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0xFF,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,/*"二",1*/
-
- 0x00,0x00,0x00,0x00,0xFE,0x3F,0x00,0x00,
- 0x00,0x00,0x00,0x00,0x00,0x00,0xFC,0x1F,
- 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- 0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,/*"三",2*/
-
- 0x00,0x00,0x00,0x00,0xFE,0x3F,0x22,0x22,
- 0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,
- 0x12,0x22,0x12,0x3C,0x0A,0x20,0x06,0x20,
- 0x02,0x20,0xFE,0x3F,0x02,0x20,0x00,0x00,/*"四",3*/
- 0x00,0x00,0xFE,0x3F,0x40,0x00,0x40,0x00,
- 0x40,0x00,0x40,0x00,0xFC,0x0F,0x20,0x08,
- 0x20,0x08,0x20,0x08,0x20,0x08,0x10,0x08,
- 0x10,0x08,0x10,0x08,0xFF,0x7F,0x00,0x00,/*"五",4*/
- 0x40,0x00,0x80,0x00,0x00,0x01,0x00,0x01,
- 0x00,0x00,0xFF,0x7F,0x00,0x00,0x00,0x00,
- 0x20,0x02,0x20,0x04,0x10,0x08,0x10,0x10,
- 0x08,0x10,0x04,0x20,0x02,0x20,0x00,0x00,/*"六",5*/
- 0x00,0x00,0xF8,0x0F,0x08,0x08,0x08,0x08,
- 0x08,0x08,0x08,0x08,0x08,0x08,0xF8,0x0F,
- 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,
- 0x08,0x08,0x08,0x08,0xF8,0x0F,0x08,0x08,/*"日",6*/
- 0x00,0x00,0xF8,0x0F,0x08,0x08,0xF8,0x0F,
- 0x08,0x08,0xF8,0x0F,0x80,0x00,0x88,0x00,
- 0xF8,0x1F,0x84,0x00,0x82,0x00,0xF8,0x0F,
- 0x80,0x00,0x80,0x00,0xFE,0x3F,0x00,0x00,/*"星",7*/
- 0x44,0x00,0x44,0x3E,0xFE,0x22,0x44,0x22,
- 0x44,0x22,0x7C,0x3E,0x44,0x22,0x44,0x22,
- 0x7C,0x22,0x44,0x3E,0x44,0x22,0xFF,0x22,
- 0x20,0x21,0x44,0x21,0x82,0x28,0x41,0x10,/*"期",8*/
- 0x00,0x00,0xE0,0x0F,0x62,0x0C,0xE6,0x0F,0x6C,0x0C,
- 0xEA,0x0F,0x06,0x00,0xF4,0x1F,0x3C,0x18,0xB0,0x1A,
- 0xBC,0x1A,0xB4,0x1A,0xB2,0x1A,0xFB,0x3F,0xF9,0x3F,
- 0x00,0x00, /////////////////////溫////9//
- 0x00,0x00,0xC0,0x00,0x80,0x00,0xFC,0x0F,0x0C,0x00,
- 0x6C,0x03,0xFC,0x0F,0x6C,0x03,0xEC,0x03,0x0C,0x00,
- 0xEC,0x07,0x6C,0x06,0xCC,0x03,0x66,0x06,0x33,0x0C,
- 0x00,0x00,/////////////////度、、、、、、10//
- 0x00,0x00,0x0C,0x00,0xFC,0x1F,0x0C,0x00,0xF6,0x07,
- 0xB0,0x01,0xB0,0x01,0xB0,0x01,0xFC,0x0F,0x80,0x01,
- 0x80,0x01,0x80,0x01,0x80,0x01,0x80,0x01,0x00,0x00,
- 0x00,0x00,///////////年、、、、、、、、、11//
- 0x00,0x00,0xF8,0x0F,0x18,0x0C,0x18,0x0C,0x18,0x0C,
- 0xF8,0x0D,0x18,0x0C,0x18,0x0C,0xF8,0x0D,0x18,0x0C,
- 0x18,0x0C,0x1C,0x0C,0x1C,0x0C,0x0E,0x0F,0x06,0x06,
- 0x00,0x00,///////////月////////////12///
- //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- //9; //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- //0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,
- };
- /***********************************************************
- 功 能:16x64點陣屏加DS1302顯示時間
- 單片機:STC12C5A60S2
- 晶 振:22.1184M
- 作 者:蘇義江改編自網絡
- 時 間:2016-6-18日
- ***********************************************************/
- #include <STC12C5A60S2.h>
- #include "macroandconst.h"
- #include <intrins.h>
- #define uchar unsigned char
- #define uint unsigned int
- sbit R =P2^6; //上半屏數據
- sbit R1=P2^7; //下半屏數據
- sbit CLK=P2^4; //74HC595的移位時鐘 SHCP
- sbit STB=P2^3; //輸出鎖存 STCP 595鎖存信號
- //行掃描
- sbit A1 =P2^0;
- sbit B1 =P2^1;
- sbit C1 =P2^2;
- sbit OE =P2^5; //74HC138的使能
- sbit fmq =P1^7;//蜂鳴器
- //按鍵
- sbit keymenue =P0^2; //功能
- sbit keyup =P0^3; //加
- sbit keydown =P0^4; //減
- sbit keyswitch=P0^5; //調整移位
- sbit keyok =P0^6; //確認
- sbit DQ =P1^6; //DS18B20的數據輸入/輸出腳DQ,根據情況設定
- //sbit wei =P2^7;//數碼管位選573使能
- //sbit duan=P2^6;//數碼管段選573使能
- uchar code smg[11]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,
- 0x82,0xF8,0x80,0x90,0xBF}; //顯示段碼
- extern uchar code table[];
- extern uchar code table1[];
- extern uchar set; //按鍵選擇標志位;
- extern char key_flag;//按鍵加減標志位;
- extern uchar menue; //菜單選擇標志位;
- extern uchar ok; //確認標志位;
- uint sdata;//測量到的溫度的整數部分
- uchar xiaoshu1;//小數第一位
- uchar xiaoshu2;//小數第二位
- uchar xiaoshu;//兩位小數
- bit fg=1; //溫度正負標志
- uint temp; //溫度值
- extern char miao,fen,shi,ri,yue,zhou,nian;/*時間日期數值標志位;*/
- extern uchar l_tmpDate[];//秒分時日月周年08-05-15 12:00:00
- extern uchar l_tmpdisplay[];
- extern void Write_Ds1302(uchar address,uchar dat );
- extern void Read_RTC(void);
- void data_change();
- uint num;
- void Delay10ms() //@11.0592MHz
- {
- uchar i, j;
- i = 108;
- j = 145;
- do
- {
- while (--j);
- }
- while (--i);
- }
- //STC12C5A單片機定時1us DS18B20延時
- void delay_b20(uchar n)
- {
- while(n--)
- {
- _nop_();
- }
- }
- bit Init_DS18B20(void) //發送復位
- {
- bit flag; //儲存DS18B20是否存在的標志,flag=0,表示存在;flag=1,表示不存在
- DQ = 1; //先將數據線拉高
- delay_b20(1); //略微延時約6微秒 ;
- DQ = 0; //再將數據線從高拉低,要求保持480~960us
- delay_b20(500); //略微延時約600微秒 ;
- //以向DS18B20發出一持續480~960us的低電平復位脈沖
- DQ = 1; //釋放數據線(將數據線拉高)
- delay_b20(60); //延時約30us(釋放總線后需等待15~60us讓DS18B20輸出存在脈沖)
- flag=DQ; //讓單片機檢測是否輸出了存在脈沖(DQ=0表示存在)
- delay_b20(500); //延時足夠長時間,等待存在脈沖輸出完畢 ;
- return flag; //返回檢測成功標志
- }
- uchar ReadOneChar(void)
- {
- uchar i=0;
- uchar dat; //儲存讀出的一個字節數據
- for (i=0;i<8;i++)
- {
- DQ =1; // 先將數據線拉高
- delay_b20(1); //等待一個機器周期
- DQ = 0; //單片機從DS18B20讀書據時,將數據線從高拉低即啟動讀時序
- delay_b20(1); //等待一個機器周期
- DQ = 1; //將數據線"人為"拉高,為單片機檢測DS18B20的輸出電平作準備
- delay_b20(1); ; //延時約6us,使主機在15us內采樣
- dat>>=1;
- if(DQ==1)
- dat|=0x80; //如果讀到的數據是1,則將1存入dat
- else
- dat|=0x00;//如果讀到的數據是0,則將0存入dat //將單片機檢測到的電平信號DQ存入r[i]
- delay_b20(60); ; //延時3us,兩個讀時序之間必須有大于1us的恢復期
- }
- return(dat); //返回讀出的十六進制數據
- }
- void WriteOneChar(uchar dat)
- {
- uchar i=0;
- for (i=0; i<8; i++)
- {
- DQ =1; // 先將數據線拉高
- delay_b20(1); //等待一個機器周期
- DQ=0; //將數據線從高拉低時即啟動寫時序
- DQ=dat&0x01; //利用與運算取出要寫的某位二進制數據,
- //并將其送到數據線上等待DS18B20采樣
- delay_b20(60); ;
- //延時約30us,DS18B20在拉低后的約15~60us期間從數據線上采樣
- DQ=1; //釋放數據線
- delay_b20(60);
- dat>>=1; //將dat中的各二進制位數據右移1位
- }
- delay_b20(1);
- }
- void ReadyReadTemp(void)
- {
- Init_DS18B20(); //將DS18B20初始化
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉換
- delay_b20(200); //轉換一次需要延時一段時間
- Init_DS18B20(); //將DS18B20初始化
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器,前兩個分別是溫度的低位和高位
- }
- uchar doe[4];
- uint wendu_duzhuanhuan()
- {
- uint a,b,t;
- Init_DS18B20(); //將DS18B20初始化
- WriteOneChar(0xCC); // 跳過讀序號列號的操作
- WriteOneChar(0x44); // 啟動溫度轉換
- delay_b20(200); //轉換一次需要延時一段時間
- Init_DS18B20(); //將DS18B20初始化
- WriteOneChar(0xCC); //跳過讀序號列號的操作
- WriteOneChar(0xBE); //讀取溫度寄存器,前兩個?
- a=ReadOneChar();
- b=ReadOneChar();
- t=b;
- t<<=8;
- t=t|a;
- t=t*0.6250+0.5;
- return t;
- }
- void wenduzhuan()
- {
- uint tp;
- tp=wendu_duzhuanhuan();
- doe[0]=tp/1000;
- doe[1]=tp%1000/100;
- doe[2]=tp%100/10;
- doe[3]=tp%10;
- }
- void key()
- {
- /*判斷選擇按鍵是否按下;如果按下了當松開的時候讓背光打開;set++;*/
- if(keyswitch==0)
- {
- Delay10ms();
- if(keyswitch==0)
- {
- Delay10ms();
- while(keyswitch==0);
- set++; //功能變量
- if(set>9)
- {set=0;menue=0;}
- }
- }
- /*up和down按鍵的檢測;加減標志位*/
- if(keyup==0)
- {
- Delay10ms();
- if(keyup==0)
- {
- Delay10ms();
- while(keyup==0);
- key_flag++; //加減標志位
- }
- }
- if(keydown==0)
- {
- Delay10ms();
- if(keydown==0)
- {
- Delay10ms();
- while(keydown==0);
- key_flag--; //加減標志位
- }
- }
- if(keymenue==0)
- {
- Delay10ms();
- if(keymenue==0) //菜單選擇標志位;
- {
- Delay10ms();
- while(keymenue==0);
- menue++; //菜單變量
- if(menue>4)menue=0;
- }
- }
- if(keyok==0)
- {
- Delay10ms();
- if(keyok==0) //確認標志位;
- {
- Delay10ms();
- while(keyok==0);
- ok++;
- if(ok>1)
- {
- ok=0;
- menue=0;
- set=0;
- }
- }
- }
- }
- //行掃描
- void hangsao(uchar num)
- {
- switch(num)
- {
- case 0:C1=0;B1=0;A1=0;break;
- case 1:C1=0;B1=0;A1=1;break;
- case 2:C1=0;B1=1;A1=0;break;
- case 3:C1=0;B1=1;A1=1;break;
- case 4:C1=1;B1=0;A1=0;break;
- case 5:C1=1;B1=0;A1=1;break;
- case 6:C1=1;B1=1;A1=0;break;
- case 7:C1=1;B1=1;A1=1;break;
- default:break;
- }
- }
- /*****595寫數據部分****************/
- void WriteByte(uchar DataR1,uchar DataR2)
- {
- uchar i;
- for(i = 0; i < 8; i++)//循環8次,把編碼傳給鎖存器
- {
- R=DataR1& 0x01; //上屏數據 先送低位
- R1=DataR2 & 0x01;//下屏數據 先送低位
- CLK = 0;
- _nop_();
- CLK = 1;
- DataR1>>= 1;
- DataR2>>= 1;
- }
- }
- /*void WriteByte(uchar dat)
- {
- uchar i;
- for (i=0;i<8;i++) //循環8次,把編碼傳給鎖存器
- {
- dat=dat>>1; //右移一位,取出該字節的最低位
- R=CY; //將該字節的最低位傳給R
- CLK=0; //上升沿將數據移入595
- CLK=1;
- }
- }
- */
- void writebyteshuzi(uchar n)//顯示數字函數
- {
- WriteByte(~table[num+n*16],~table[num+n*16+8]);
- }
- void writebytehanzi(uchar n) //顯示漢字函數
- {
- WriteByte(~table1[2*num+n*32+0],~table1[2*num+n*32+16]);
- WriteByte(~table1[2*num+n*32+1],~table1[2*num+n*32+16+1]);
- }
- /******調時部分*************************/
- void set_date_time()
- {
- if(set==2)
- {
- menue=0; //秒調整
- miao=l_tmpdisplay[10]*10+l_tmpdisplay[11];
- miao=miao+key_flag;
- if((key_flag<0)&(miao==0))miao=59;
- if(miao>59)miao=0;
- miao=miao%10+(miao/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x80,miao);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==3)
- {
- menue=0; //分調整
- fen=l_tmpdisplay[8]*10+l_tmpdisplay[9];
- fen=fen+key_flag;
- if(fen>59)
- { fen=0; }
- if((key_flag<0)&&(fen<0))
- { fen=59; }
- fen=fen%10+(fen/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x82,fen);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==4)
- {
- menue=0; //時調整
- shi=l_tmpdisplay[6]*10+l_tmpdisplay[7];
- shi=shi+key_flag;
- if(shi>23)shi=0;
- if((key_flag<0)&&(shi<0))shi=23;
- shi=shi%10+(shi/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x84,shi);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==5)
- {
- menue=1; //日調整
- ri=l_tmpdisplay[4]*10+l_tmpdisplay[5];
- ri=ri+key_flag;
- if(ri>31)ri=1;
- if((key_flag<0)&&(ri<1))ri=31;
- ri=ri%10+(ri/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x86,ri);
- Write_Ds1302(0x8E,0x80);
- zhou=l_tmpdisplay[12]; //周調整
- zhou=zhou+key_flag;
- if(zhou>7)zhou=1;
- if((key_flag<0)&&(zhou<1))zhou=7;
- zhou=zhou%10+(zhou/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x8A,zhou);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==6)
- {
- menue=1; //月調整
- yue=l_tmpdisplay[2]*10+l_tmpdisplay[3];
- yue=yue+key_flag;
- if(yue>12)yue=1;
- if((key_flag<0)&&(yue<1))yue=12;
- yue=yue%10+(yue/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x88,yue);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==7)
- {
- menue=1; //年調整
- nian=l_tmpdisplay[0]*10+l_tmpdisplay[1]+key_flag;;
- if(nian>79)nian=0;
- if((key_flag<0)&&(nian<0))nian=79;
- nian=nian%10+(nian/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x8C,nian);
- Write_Ds1302(0x8E,0x80);
-
- }
-
- if(set==8)
- {
- menue=2; //周調整
- zhou=l_tmpdisplay[12];
- zhou=zhou+key_flag;
- if(zhou>7)zhou=1;
- if((key_flag<0)&&(zhou<1))zhou=7;
- zhou=zhou%10+(zhou/10)*16;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x8A,zhou);
- Write_Ds1302(0x8E,0x80);
- }
- if(set==9)
- {
- menue=3; //溫度調整
-
- sdata=l_tmpdisplay[13]/10;
- sdata=l_tmpdisplay[14]%10;
- sdata=sdata+key_flag;
- sdata=sdata%10+(sdata/10)*16;
- }
- key_flag=0;
- }
- /******日期、時間、星期數據的轉化****************/
- void data_change()
- {
- l_tmpdisplay[0]=l_tmpDate[6]/16;
- l_tmpdisplay[1]=l_tmpDate[6]%16;//年;
- l_tmpdisplay[2]=l_tmpDate[4]/16;
- l_tmpdisplay[3]=l_tmpDate[4]%16;//月;
- l_tmpdisplay[4]=l_tmpDate[3]/16;
- l_tmpdisplay[5]=l_tmpDate[3]%16;//日;
- l_tmpdisplay[6]=l_tmpDate[2]/16;
- l_tmpdisplay[7]=l_tmpDate[2]%16;//小時;
- l_tmpdisplay[8]=l_tmpDate[1]/16;
- l_tmpdisplay[9]=l_tmpDate[1]%16;//分鐘;
- l_tmpdisplay[10]=l_tmpDate[0]/16;
- l_tmpdisplay[11]=l_tmpDate[0]%16;//秒鐘;
- l_tmpdisplay[12]=l_tmpDate[5]%16;//顯示當前星期;
-
- l_tmpdisplay[13]=doe[1]/16;//溫度十位;
- l_tmpdisplay[14]=doe[2]%16;//溫度個位;
- }
- /*******星期顯示處理*******************/
- void week()
- {
- if(l_tmpdisplay[12]==1)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(0);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==2)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(1);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==3)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(2);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==4)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(3);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==5)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(4);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==6)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(5);
- writebyteshuzi(13);
- }
- if(l_tmpdisplay[12]==7)
- {
- writebyteshuzi(13);
- writebytehanzi(7);
- writebytehanzi(8);
- writebytehanzi(6);
- writebyteshuzi(13);
- }
- }
- void shijian()
- {
- writebyteshuzi(l_tmpdisplay[6]); //時;
- writebyteshuzi(l_tmpdisplay[7]);
- writebyteshuzi(11); //顯示分號
- writebyteshuzi(l_tmpdisplay[8]);
- writebyteshuzi(l_tmpdisplay[9]); //分;
- writebyteshuzi(11); //顯示分號
- writebyteshuzi(l_tmpdisplay[10]);
- writebyteshuzi(l_tmpdisplay[11]);//秒;
- }
- void riqi()
- {
- writebyteshuzi(l_tmpdisplay[0]);
- writebyteshuzi(l_tmpdisplay[1]); //年;
- writebyteshuzi(10); //顯示橫杠
-
- writebyteshuzi(l_tmpdisplay[2]);
- writebyteshuzi(l_tmpdisplay[3]); //月;
- writebyteshuzi(10);//顯示橫杠
- writebyteshuzi(l_tmpdisplay[4]);
- writebyteshuzi(l_tmpdisplay[5]); //日;
- }
- void wendu()
- {
- writebyteshuzi(13);
- writebytehanzi(9);
- writebytehanzi(10);
- writebyteshuzi(11);
- writebyteshuzi(l_tmpdisplay[13]); //溫度
- writebyteshuzi(l_tmpdisplay[14]);
- }
- void main()
- {
- // Set_RTC();//對時(有備用電源對時一次就行)
- ReadyReadTemp();//溫度轉換
- wenduzhuan();
- menue=0;
- Write_Ds1302(0x8E,0x00);
- Write_Ds1302(0x90,0x80);
- Write_Ds1302(0x8E,0x80);
- while(1)
- {
- ReadyReadTemp();//溫度轉換
- wenduzhuan();
- key();
- // for(num=0;num<16;num++)
- for(num=0;num<8;num++)
- {
-
- Read_RTC();//讀取時鐘
- data_change();//時鐘數據處理
- set_date_time(); /////調時部分
-
-
- if(menue==0)
- {
- if(set==2)//調整標志位;
- {
- writebyteshuzi(l_tmpdisplay[6]); //時;
- writebyteshuzi(l_tmpdisplay[7]);
- writebyteshuzi(11); //數字數組的第11位置,是":"
- writebyteshuzi(l_tmpdisplay[8]);
- writebyteshuzi(l_tmpdisplay[9]); //分;
- writebyteshuzi(11);
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[10]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[10]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[11]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[11]*16+8]));
- }
- else
- if(set==3)
- {
- // writebyteshuzi(l_tmpdisplay[6]); //時;
- // writebyteshuzi(l_tmpdisplay[7]);
- // writebyteshuzi(11);
- // WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[8]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[8]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[9]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[9]*16+8]));
- writebyteshuzi(11);
- writebyteshuzi(l_tmpdisplay[10]);
- writebyteshuzi(l_tmpdisplay[11]);//秒;
- }
- /* else
- if(set==4)
- {
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[6]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[6]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[7]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[7]*16+8]));
- writebyteshuzi(11);
- writebyteshuzi(l_tmpdisplay[8]);
- writebyteshuzi(l_tmpdisplay[9]);//分;
- writebyteshuzi(11);
- writebyteshuzi(l_tmpdisplay[10]);
- writebyteshuzi(l_tmpdisplay[11]);//秒;
- } */
- else shijian();
- }
- else
- if(menue==1)
- {
- if(set==5) //日期調整標志位;
- {
- writebyteshuzi(l_tmpdisplay[0]); //年;
- writebyteshuzi(l_tmpdisplay[1]);
- writebyteshuzi(10);
- writebyteshuzi(l_tmpdisplay[2]);
- writebyteshuzi(l_tmpdisplay[3]); //月;
- writebyteshuzi(10);
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[4]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[4]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[5]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[5]*16+8])); //日;
- }
- else
- if(set==6)
- {
- // writebyteshuzi(l_tmpdisplay[0]); //年;
- // writebyteshuzi(l_tmpdisplay[1]);
- // writebyteshuzi(10);
- // WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[2]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[2]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[3]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[3]*16+8]));//月;
- writebyteshuzi(10);
- writebyteshuzi(l_tmpdisplay[4]);
- writebyteshuzi(l_tmpdisplay[5]);//日;
- }
- /* else
- if(set==7)
- {
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[0]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[0]*16+8]));
- WriteByte((~table[num+(12*16)])&(~table[num+l_tmpdisplay[1]*16]),(~table[num+(12*16)])&(~table[num+l_tmpdisplay[1]*16+8]));//年;
- writebyteshuzi(10);
- writebyteshuzi(l_tmpdisplay[2]);
- writebyteshuzi(l_tmpdisplay[3]);//月;
- writebyteshuzi(10);
- writebyteshuzi(l_tmpdisplay[4]);
- writebyteshuzi(l_tmpdisplay[5]);//日;
- } */
- else riqi();
- }
- else
- if(menue==2)
- {
- week();
- }
- else
- if(menue==3)
- {
- writebyteshuzi(13);
- writebytehanzi(9);//溫;
- writebytehanzi(10);//度?
- writebyteshuzi(11);
- writebyteshuzi(l_tmpdisplay[13]);
- writebyteshuzi(l_tmpdisplay[14]);
-
- }
-
-
- else menue=0;
- if ((set<2)&&(menue==0))
- {
- if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>11)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<14))riqi();
- else
- if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>26)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<29))week();
- else
- if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>41)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<44))riqi();
- else
- if ((l_tmpdisplay[10]*10+l_tmpdisplay[11]>55)&&(l_tmpdisplay[10]*10+l_tmpdisplay[11]<59))wendu();
- else shijian();
- }
-
- // P0=num;
- OE=0;
- STB=0; //輸出鎖存
- _nop_();
- STB=1;
- OE=1;
- hangsao(num);
- }
- }
- }
復制代碼 |