|
本帖最后由 abc123194 于 2015-7-8 23:05 編輯
main.c
/********************************************************************************
以實時時鐘的分鐘定時功能來實現(xiàn)中斷,
當(dāng)分鐘數(shù)據(jù)變化時,進行數(shù)據(jù)的更新;
MCU 使用外部11.0592MHz時鐘。
實時時鐘中斷接入MCU的INT0,
*********************************************************************************/
#include <STC89C5xRC.H>
#include"config.h"
#include"ds3231.h"
#include"display.h"
#include"time.h"
#include"keymark.h"
#include "nongli.h"
#include"Port.h"
/***************************************************************************/
/**********************函數(shù)聲明*********************************/
/*********************************************************************/
void MCUINIT()
{
/*********************************************************************/
int0=1;
InitDS3231(); //初始化DS3231
DisplayInit(); //74HC595 串口線初始化
delayms(5);
ge_shidisplay_code ();
Display(); //年、月、日、時間、星期、溫度動態(tài)掃描顯示函數(shù)
yeardis=BCD2Hex(read_random(DS3231_YEAR));
monthdis=BCD2Hex(read_random(DS3231_MONTH)&(0x1f)); //上電第一次調(diào)整時間時會歸零,初始化時賦初值解決
datedis=BCD2Hex(read_random(DS3231_DAY)&(0x3f));
hourdis=BCD2Hex(read_random(DS3231_HOUR)&(0x3f));
mindis=BCD2Hex(read_random(DS3231_MINUTE)&(0x7f));
weekdis=BCD2Hex(read_random(DS3231_WEEK)&(0x0f));
nongli_Display(); //農(nóng)歷月、日靜態(tài)顯示函數(shù)
/*********************************************************************/
_nop_();_nop_();
_nop_();_nop_();
}
/****************************主函數(shù)*****************************************/
void main()
{
MCUINIT();
Display ();
while(1)
{
Display ();
if (int0==0) //如果是DS3231每分鐘時間到
{
minutedisplay_code (); //分鐘顯示碼
Display ();
minutedisplay_code (); //分鐘顯示碼
Display ();
write_byte(0x0f,0x00); //32KHZ輸出禁止,鬧鐘標(biāo)志位清零
Display ();
if ((Mintemp==0)||(Mintemp==1)||(Mintemp==2)) //如果是DS3231每小時時間到,前三分鐘每分鐘都讀數(shù)據(jù),防漏讀
{
hourdisplay_code (); //小時顯示碼
Display ();
if (Htemp==0) //如果是DS3231每天時間到
{
datedisplay_code (); //日顯示碼
weekdisplay_code (); //星期顯示碼
Display ();
nonglidisplay_code (); //農(nóng)歷月日顯示碼
Display ();
nongli_Display();
Display ();
Display ();
if (Dtemp==0x01) //如果是DS3231每月時間到
{
monthdisplay_code (); //月顯示碼
Display ();
Display ();
if (Montemp==0x01) //如果是DS3231每年時間到
{
yeardisplay_code (); //年顯示碼
Display ();
Display ();
}
}
}
}
temperdisplay_code (); //溫度顯示碼
Display ();
write_byte(0x0f,0x00); //32KHZ輸出禁止,鬧鐘標(biāo)志位清零
int0=1;
Display ();
}
Display ();
Display ();
keyscan(); //按鍵掃描
Display ();
}
}
/*********************************************************************/
config.h
/***************************************************
**文件名 :config.h
**功能 :MCU有關(guān)的配置
**建立日期:15/05/01
**修改記錄:
**MCU初始化設(shè)置:MCU型號STC89C51RC 使用內(nèi)置RC震蕩器,頻率初步定為11.0592M.其它端口詳見PORT.H
*****************************************************/
/********************************************/
#ifndef _CONFIG_H_
#define _CONFIG_H_
/*type define*/
typedef unsigned char uchar;
typedef unsigned int uint;
/******************************************/
#endif
Port.h
/***************************************************
**文件名 :Port.h
**功能 :引腳有關(guān)的定義
**顯示電路使用串行IC74HC595D,時鐘使用時鐘芯片DS3231SN
*****************************************************/
#include <STC89C5xRC.H>
#ifndef PORT_H_
#define PORT_H_
/**********************************************************
**
**DS3231 管腳定義
**
*********************************************************/
sbit SDA=P3^6; //模擬I2C數(shù)據(jù)傳送位SDA
sbit SCL=P3^7; //模擬I2C時鐘控制位SCL
sbit int0=P3^2;
/**********************************************************
**
**74HC595D 管腳定義
**
*********************************************************/
sbit SI_nian_HC595 = P0^0;
sbit SCK_nian_HC595 = P0^1;
sbit RCK_nian_HC595 = P0^2;
sbit SI_time_HC595 = P0^3;
sbit SCK_time_HC595 = P0^4;
sbit RCK_time_HC595 = P0^5;
sbit SI_temper_HC595 = P0^6;
sbit SCK_temper_HC595 = P0^7;
sbit RCK_temper_HC595 = P1^0;
sbit SI_nongli_HC595 = P1^1;
sbit SCK_nongli_HC595 = P1^2;
sbit RCK_nongli_HC595 = P1^3;
/***按鍵 管腳定義
**
*********************************************************/
sbit sw1=P3^3;
sbit sw2=P3^4;
#endif
time.h#ifndef __TIME_H__
#define __TIME_H__
extern void delayus(unsigned char itemp);
extern void delayms(unsigned int xms);
#endif
time.c
#include"time.h"
void delayms(unsigned int xms)
{
unsigned int i,j;
for(i=xms;i>0;i--) //i=xms即延時約xms毫秒
for(j=60;j>0;j--);
}
void delayus(unsigned char itemp)
{
while(--itemp) ;
}
ds3231.c
#include <STC89C5xRC.H>
#include "display.h"
#include "ds3231.h"
#include "keymark.h"
#include "nongli.h"
#include "time.h"
#include "Port.h"
#include "config.h"
#include <intrins.h>
bit ack; //應(yīng)答標(biāo)志位
uchar Decimal2BCD(uchar val); //二進制(Decimal)數(shù)轉(zhuǎn)換為BCD碼
void Start_I2C(); //I2C起始信號
void Stop_I2C(); //I2C結(jié)束信號
void SendByte(uchar c); //發(fā)送字節(jié)數(shù)據(jù)
uchar RcvByte(); //接收字節(jié)數(shù)據(jù)
void Ack_I2C(bit a); //應(yīng)答信號
uchar write_byte(uchar addr, uchar write_data); //寫入DS3231地址的數(shù)據(jù)
uchar read_random(uchar random_addr); //讀回DS3231地址的數(shù)據(jù)
void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar wee);
void InitDS3231 (); //初始化DS3231
/***********************************************************************************/
uchar Decimal2BCD(uchar val) //二進制(Decimal)數(shù)轉(zhuǎn)換為BCD碼
{
uchar i,j,k;
i=val/10;
i=i<<4;
j=val%10;
k=i|j;
return k;
}
/***********************************************************************************/
/************************START***************************/
void Start_I2C()
{
SDA=1; //發(fā)送起始條件的數(shù)據(jù)信號
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_(); //起始條件建立時間大于4.7us,延時
_nop_();
SDA=0; //發(fā)送起始信號
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); // 起始條件鎖定時間大于4μs
SCL=0; //鉗住I2C總線,準(zhǔn)備發(fā)送或接收數(shù)據(jù)
_nop_();
_nop_();
}
/********************************************************/
/************************STOP****************************/
void Stop_I2C()
{
SDA=0; //發(fā)送結(jié)束條件的數(shù)據(jù)信號
_nop_(); //發(fā)送結(jié)束條件的時鐘信號
SCL=1; //結(jié)束條件建立時間大于4us
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
SDA=1; //發(fā)送I2C總線結(jié)束信號
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
}
/********************************************************/
/*******************************************************************
字節(jié)數(shù)據(jù)發(fā)送函數(shù)
函數(shù)原型: void SendByte(uint8 Dat);
功能: 將數(shù)據(jù)c發(fā)送出去,可以是地址,也可以是數(shù)據(jù),發(fā)完后等待應(yīng)答,并對
此狀態(tài)位進行操作.(不應(yīng)答或非應(yīng)答都使ack=0)
ack=1 發(fā)送數(shù)據(jù)正常,
ack=0 被控器無應(yīng)答或損壞。
********************************************************************/
void SendByte(uchar c)
{
uchar BitCnt;
for(BitCnt=0;BitCnt<8;BitCnt++) //要傳送的數(shù)據(jù)長度為8位
{
if((c<<BitCnt)&0x80)
SDA=1; //判斷發(fā)送位
else
SDA=0;
_nop_();
SCL=1; //置時鐘線為高,通知被控器開始接收數(shù)據(jù)位
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //保證時鐘高電平周期大于4μs
SCL=0;
_nop_();
}
_nop_();
SDA=1; //8位發(fā)送完后釋放數(shù)據(jù)線,準(zhǔn)備接收應(yīng)答位
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
if(SDA==1)
ack=0;
else
ack=1; //判斷是否接收到應(yīng)答信號
SCL=0;
_nop_();
_nop_();
}
/********************************************************/
/*******************************************************************
字節(jié)數(shù)據(jù)接收函數(shù)
函數(shù)原型: uint8 RcvByte();
功能: 用來接收從器件傳來的數(shù)據(jù),并判斷總線錯誤(不發(fā)應(yīng)答信號),
發(fā)完后請用應(yīng)答函數(shù)應(yīng)答從機。
********************************************************************/
uchar RcvByte() //接收字節(jié)數(shù)據(jù)
{
uchar retc;
uchar BitCnt;
retc=0;
SDA=1; //置數(shù)據(jù)線為輸入方式
for(BitCnt=0;BitCnt<8;BitCnt++)
{
_nop_();
SCL=0; //置時鐘線為低,準(zhǔn)備接收數(shù)據(jù)位
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //時鐘低電平周期大于4.7μs
SCL=1; //置時鐘線為高使數(shù)據(jù)線上數(shù)據(jù)有效
_nop_();
_nop_();
_nop_();
retc=retc<<1;
if(SDA==1)
retc=retc+1; //讀數(shù)據(jù)位,接收的數(shù)據(jù)位放入retc中
_nop_();
_nop_();
}
SCL=0;
_nop_();
_nop_();
return(retc);
}
/********************************************************************
應(yīng)答子函數(shù)
函數(shù)原型: void I2CACK(bit a);
功能: 主控器進行應(yīng)答信號(可以是應(yīng)答或非應(yīng)答信號,由位參數(shù)a決定)
********************************************************************/
void Ack_I2C(bit a) //應(yīng)答信號
{
if(a==0)
SDA=0; //在此發(fā)出應(yīng)答或非應(yīng)答信號
else
SDA=1;
_nop_();
_nop_();
_nop_();
SCL=1;
_nop_();
_nop_();
_nop_();
_nop_();
_nop_(); //時鐘低電平周期大于4μs
SCL=0; //清時鐘線,鉗住I2C總線以便繼續(xù)接收
_nop_();
_nop_();
}
/****************************************************/
/***********將一個字節(jié)寫入DS3231指定的地址***********/
uchar write_byte(uchar addr, uchar write_data) //寫入DS3231地址的數(shù)據(jù)
{
Start_I2C();
SendByte(0xd0);
if (ack == 0)
return 0;
SendByte(addr);
if (ack == 0)
return 0;
SendByte(write_data);
if (ack == 0)
return 0;
Stop_I2C();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
_nop_();
return 1;
}
/****************************************************/
/************從DS3231當(dāng)前地址讀一個字節(jié)************
uchar I2CRead()
{
uchar read_data;
Start_I2C();
SendByte(0xd1);
if(ack==0)
return 0;
read_data = RcvByte();
Ack_I2C(1);
Stop_I2C();
return read_data;
}
****************************************************/
/************從DS3231指定地址讀一個字節(jié)************/
uchar read_random(uchar random_addr) //讀回DS3231地址的數(shù)據(jù)
{
uchar read_data; //DS3231讀數(shù)據(jù)必須先寫入要讀的數(shù)據(jù)地址,再重新發(fā)送開始信號再讀取當(dāng)前地址數(shù)據(jù),
Start_I2C(); //這個問題沒注意,搞了好一陣子,連芯片都更換了都沒用,后來仔細研究了網(wǎng)
SendByte(0xd0); //上的程序思路才搞明白這么回事!
if(ack==0)
return 0;
SendByte(random_addr);
if(ack==0)
return 0;
Start_I2C();
SendByte(0xd1);
if(ack==0)
return 0;
read_data = RcvByte();
Ack_I2C(1);
Stop_I2C();
return read_data;
}
/***********************************************************************************/
void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar wee)
{
uchar temp=0;
temp=Decimal2BCD(yea);
write_byte(DS3231_YEAR,temp); //修改年
temp=Decimal2BCD(mon);
write_byte(DS3231_MONTH,temp); //修改月
temp=Decimal2BCD(da);
write_byte(DS3231_DAY,temp); //修改日
temp=Decimal2BCD(hou);
write_byte(DS3231_HOUR,temp); //修改時
temp=Decimal2BCD(min);
write_byte(DS3231_MINUTE,temp); //修改分
temp=Decimal2BCD(sec);
write_byte(DS3231_SECOND,temp); //修改秒
temp=Decimal2BCD(wee);
write_byte(DS3231_WEEK,temp); //修改星期
}
/***********************************************************************************/
void InitDS3231 () //初始化DS3231
{
SCL=1;
delayus(5);
SDA=1;
delayus(5);
write_byte(0x0b, 0x80); //A2M2置位
write_byte(0x0c,0x80); //A2M3置位,
write_byte(0x0d,0x80); //A2M4置位,
write_byte(0x0f,0x00); //32KHZ輸出禁止,鬧鐘標(biāo)志位清零
write_byte(0x0e,0x06); //中斷允許,鬧鐘2打開鬧鐘1關(guān)閉 ,每分鐘#INT口輸出中斷
}
/***********************************************************************************/
ds3231.h
/**************************************
**時鐘使用時鐘芯片DS3231SN
**************************************/
#ifndef _DS3231_H_
#define _DS3231_H_
#include <STC89C5xRC.H>
#include <intrins.h>
#include "config.h"
#define DS3231_WriteAddress 0xd0 //器件寫地址
#define DS3231_ReadAddress 0xd1 //器件讀地址
#define DS3231_SECOND 0x00 //秒
#define DS3231_MINUTE 0x01 //分
#define DS3231_HOUR 0x02 //時
#define DS3231_WEEK 0x03 //星期
#define DS3231_DAY 0x04 //日
#define DS3231_MONTH 0x05 //月
#define DS3231_YEAR 0x06 //年
#define DS3231_SALARM1ECOND 0x07 //秒
#define DS3231_ALARM1MINUTE 0x08 //分
#define DS3231_ALARM1HOUR 0x09 //時
#define DS3231_ALARM1WEEK 0x0a //星期/日
#define DS3231_ALARM2MINUTE 0x0b //分
#define DS3231_ALARM2HOUR 0x0c //時
#define DS3231_ALARM2WEEK 0x0d //星期/日
#define DS3231_CONTROL 0x0e //控制寄存器
#define DS3231_STATUS 0x0f //狀態(tài)寄存器
#define DS3231_XTAL 0x10 //晶體老化寄存器
#define DS3231_TEMPERATUREH 0x11 //溫度寄存器高字節(jié)(8位)
#define DS3231_TEMPERATUREL 0x12 //溫度寄存器低字節(jié)(高2位)
extern uchar Decimal2BCD(uchar val); //二進制(Decimal)數(shù)轉(zhuǎn)換為BCD碼
extern void Start_I2C();
extern void Stop_I2C();
extern void SendByte(uchar c) ;
extern uchar RcvByte();
extern void Ack_I2C(bit a);
extern uchar write_byte(uchar addr, uchar write_data) ;
extern uchar read_random(uchar random_addr);
extern void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar wee);
extern void InitDS3231(); //初始化DS3231
#endif
nongli.c
#include "nongli.h"
#include <intrins.h>
#include "config.h"
#include "time.h"
//輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
idata bit c_moon,c_sun=0;// c_sun=0為20xx, c_sun=1為19xx
//uchar year_sun,month_sun,day_sun;
idata uchar year_moon,month_moon,day_moon; // 轉(zhuǎn)換出的農(nóng)歷年 、月 、 日
///////////
//以下為程序的實現(xiàn)~~~~~,不用看了
//忘了是哪個網(wǎng)友的程序了,,,感謝ing
/*
公歷年對應(yīng)的農(nóng)歷數(shù)據(jù),每年三字節(jié),
格式第一字節(jié)BIT7-4 位表示閏月月份,值為0 為無閏月,BIT3-0 對應(yīng)農(nóng)歷第1-4 月的大小
第二字節(jié)BIT7-0 對應(yīng)農(nóng)歷第5-12 月大小,第三字節(jié)BIT7 表示農(nóng)歷第13 個月大小
月份對應(yīng)的位為1 表示本農(nóng)歷月大(30 天),為0 表示小(29 天)
第三字節(jié)BIT6-5 表示春節(jié)的公歷月份,BIT4-0 表示春節(jié)的公歷日期
*/
code uchar year_code[597]={
0x04,0xAe,0x53, //1901 0
0x0A,0x57,0x48, //1902 3
0x55,0x26,0xBd, //1903 6
0x0d,0x26,0x50, //1904 9
0x0d,0x95,0x44, //1905 12
0x46,0xAA,0xB9, //1906 15
0x05,0x6A,0x4d, //1907 18
0x09,0xAd,0x42, //1908 21
0x24,0xAe,0xB6, //1909
0x04,0xAe,0x4A, //1910
0x6A,0x4d,0xBe, //1911
0x0A,0x4d,0x52, //1912
0x0d,0x25,0x46, //1913
0x5d,0x52,0xBA, //1914
0x0B,0x54,0x4e, //1915
0x0d,0x6A,0x43, //1916
0x29,0x6d,0x37, //1917
0x09,0x5B,0x4B, //1918
0x74,0x9B,0xC1, //1919
0x04,0x97,0x54, //1920
0x0A,0x4B,0x48, //1921
0x5B,0x25,0xBC, //1922
0x06,0xA5,0x50, //1923
0x06,0xd4,0x45, //1924
0x4A,0xdA,0xB8, //1925
0x02,0xB6,0x4d, //1926
0x09,0x57,0x42, //1927
0x24,0x97,0xB7, //1928
0x04,0x97,0x4A, //1929
0x66,0x4B,0x3e, //1930
0x0d,0x4A,0x51, //1931
0x0e,0xA5,0x46, //1932
0x56,0xd4,0xBA, //1933
0x05,0xAd,0x4e, //1934
0x02,0xB6,0x44, //1935
0x39,0x37,0x38, //1936
0x09,0x2e,0x4B, //1937
0x7C,0x96,0xBf, //1938
0x0C,0x95,0x53, //1939
0x0d,0x4A,0x48, //1940
0x6d,0xA5,0x3B, //1941
0x0B,0x55,0x4f, //1942
0x05,0x6A,0x45, //1943
0x4A,0xAd,0xB9, //1944
0x02,0x5d,0x4d, //1945
0x09,0x2d,0x42, //1946
0x2C,0x95,0xB6, //1947
0x0A,0x95,0x4A, //1948
0x7B,0x4A,0xBd, //1949
0x06,0xCA,0x51, //1950
0x0B,0x55,0x46, //1951
0x55,0x5A,0xBB, //1952
0x04,0xdA,0x4e, //1953
0x0A,0x5B,0x43, //1954
0x35,0x2B,0xB8, //1955
0x05,0x2B,0x4C, //1956
0x8A,0x95,0x3f, //1957
0x0e,0x95,0x52, //1958
0x06,0xAA,0x48, //1959
0x7A,0xd5,0x3C, //1960
0x0A,0xB5,0x4f, //1961
0x04,0xB6,0x45, //1962
0x4A,0x57,0x39, //1963
0x0A,0x57,0x4d, //1964
0x05,0x26,0x42, //1965
0x3e,0x93,0x35, //1966
0x0d,0x95,0x49, //1967
0x75,0xAA,0xBe, //1968
0x05,0x6A,0x51, //1969
0x09,0x6d,0x46, //1970
0x54,0xAe,0xBB, //1971
0x04,0xAd,0x4f, //1972
0x0A,0x4d,0x43, //1973
0x4d,0x26,0xB7, //1974
0x0d,0x25,0x4B, //1975
0x8d,0x52,0xBf, //1976
0x0B,0x54,0x52, //1977
0x0B,0x6A,0x47, //1978
0x69,0x6d,0x3C, //1979
0x09,0x5B,0x50, //1980
0x04,0x9B,0x45, //1981
0x4A,0x4B,0xB9, //1982
0x0A,0x4B,0x4d, //1983
0xAB,0x25,0xC2, //1984
0x06,0xA5,0x54, //1985
0x06,0xd4,0x49, //1986
0x6A,0xdA,0x3d, //1987
0x0A,0xB6,0x51, //1988
0x09,0x37,0x46, //1989
0x54,0x97,0xBB, //1990
0x04,0x97,0x4f, //1991
0x06,0x4B,0x44, //1992
0x36,0xA5,0x37, //1993
0x0e,0xA5,0x4A, //1994
0x86,0xB2,0xBf, //1995
0x05,0xAC,0x53, //1996
0x0A,0xB6,0x47, //1997
0x59,0x36,0xBC, //1998
0x09,0x2e,0x50, //1999 294
0x0C,0x96,0x45, //2000 297
0x4d,0x4A,0xB8, //2001
0x0d,0x4A,0x4C, //2002
0x0d,0xA5,0x41, //2003
0x25,0xAA,0xB6, //2004
0x05,0x6A,0x49, //2005
0x7A,0xAd,0xBd, //2006
0x02,0x5d,0x52, //2007
0x09,0x2d,0x47, //2008
0x5C,0x95,0xBA, //2009
0x0A,0x95,0x4e, //2010
0x0B,0x4A,0x43, //2011
0x4B,0x55,0x37, //2012
0x0A,0xd5,0x4A, //2013
0x95,0x5A,0xBf, //2014
0x04,0xBA,0x53, //2015
0x0A,0x5B,0x48, //2016
0x65,0x2B,0xBC, //2017
0x05,0x2B,0x50, //2018
0x0A,0x93,0x45, //2019
0x47,0x4A,0xB9, //2020
0x06,0xAA,0x4C, //2021
0x0A,0xd5,0x41, //2022
0x24,0xdA,0xB6, //2023
0x04,0xB6,0x4A, //2024
0x69,0x57,0x3d, //2025
0x0A,0x4e,0x51, //2026
0x0d,0x26,0x46, //2027
0x5e,0x93,0x3A, //2028
0x0d,0x53,0x4d, //2029
0x05,0xAA,0x43, //2030
0x36,0xB5,0x37, //2031
0x09,0x6d,0x4B, //2032
0xB4,0xAe,0xBf, //2033
0x04,0xAd,0x53, //2034
0x0A,0x4d,0x48, //2035
0x6d,0x25,0xBC, //2036
0x0d,0x25,0x4f, //2037
0x0d,0x52,0x44, //2038
0x5d,0xAA,0x38, //2039
0x0B,0x5A,0x4C, //2040
0x05,0x6d,0x41, //2041
0x24,0xAd,0xB6, //2042
0x04,0x9B,0x4A, //2043
0x7A,0x4B,0xBe, //2044
0x0A,0x4B,0x51, //2045
0x0A,0xA5,0x46, //2046
0x5B,0x52,0xBA, //2047
0x06,0xd2,0x4e, //2048
0x0A,0xdA,0x42, //2049
0x35,0x5B,0x37, //2050
0x09,0x37,0x4B, //2051
0x84,0x97,0xC1, //2052
0x04,0x97,0x53, //2053
0x06,0x4B,0x48, //2054
0x66,0xA5,0x3C, //2055
0x0e,0xA5,0x4f, //2056
0x06,0xB2,0x44, //2057
0x4A,0xB6,0x38, //2058
0x0A,0xAe,0x4C, //2059
0x09,0x2e,0x42, //2060
0x3C,0x97,0x35, //2061
0x0C,0x96,0x49, //2062
0x7d,0x4A,0xBd, //2063
0x0d,0x4A,0x51, //2064
0x0d,0xA5,0x45, //2065
0x55,0xAA,0xBA, //2066
0x05,0x6A,0x4e, //2067
0x0A,0x6d,0x43, //2068
0x45,0x2e,0xB7, //2069
0x05,0x2d,0x4B, //2070
0x8A,0x95,0xBf, //2071
0x0A,0x95,0x53, //2072
0x0B,0x4A,0x47, //2073
0x6B,0x55,0x3B, //2074
0x0A,0xd5,0x4f, //2075
0x05,0x5A,0x45, //2076
0x4A,0x5d,0x38, //2077
0x0A,0x5B,0x4C, //2078
0x05,0x2B,0x42, //2079
0x3A,0x93,0xB6, //2080
0x06,0x93,0x49, //2081
0x77,0x29,0xBd, //2082
0x06,0xAA,0x51, //2083
0x0A,0xd5,0x46, //2084
0x54,0xdA,0xBA, //2085
0x04,0xB6,0x4e, //2086
0x0A,0x57,0x43, //2087
0x45,0x27,0x38, //2088
0x0d,0x26,0x4A, //2089
0x8e,0x93,0x3e, //2090
0x0d,0x52,0x52, //2091
0x0d,0xAA,0x47, //2092
0x66,0xB5,0x3B, //2093
0x05,0x6d,0x4f, //2094
0x04,0xAe,0x45, //2095
0x4A,0x4e,0xB9, //2096
0x0A,0x4d,0x4C, //2097
0x0d,0x15,0x41, //2098
0x2d,0x92,0xB5, //2099
};
///月份數(shù)據(jù)表
code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};
code uint day_code2[3]={0x111,0x130,0x14e};
/*子函數(shù),用于讀取數(shù)據(jù)表中農(nóng)歷月的大月或小月,如果該月為大返回1,為小返回0*/
bit get_moon_day(uchar month_p,uint table_addr)
{
uchar temp;
switch(month_p)
{
case 1 :temp=year_code[table_addr ]&0x08;break;
case 2 :temp=year_code[table_addr ]&0x04;break;
case 3 :temp=year_code[table_addr ]&0x02;break;
case 4 :temp=year_code[table_addr ]&0x01;break;
case 5 :temp=year_code[table_addr+1]&0x80;break;
case 6 :temp=year_code[table_addr+1]&0x40;break;
case 7 :temp=year_code[table_addr+1]&0x20;break;
case 8 :temp=year_code[table_addr+1]&0x10;break;
case 9 :temp=year_code[table_addr+1]&0x08;break;
case 10:temp=year_code[table_addr+1]&0x04;break;
case 11:temp=year_code[table_addr+1]&0x02;break;
case 12:temp=year_code[table_addr+1]&0x01;break;
case 13:temp=year_code[table_addr+2]&0x80;break;
}
if(temp==0)
return 0;
else
return 1;
}
//公歷與農(nóng)歷轉(zhuǎn)換子函數(shù)
//函數(shù)功能:輸入BCD陽歷數(shù)據(jù),輸出BCD陰歷數(shù)據(jù)(只允許1901-2099年)
//調(diào)用函數(shù)后,原有數(shù)據(jù)不變,讀c_moon,year_moon,month_moon,day_moon得出陰歷BCD數(shù)據(jù)
void Conversion(bit sj,uchar year,uchar month,uchar day)
{ //sj=0 為21世紀(jì),sj=1 為20世紀(jì) 輸入輸出數(shù)據(jù)均為BCD數(shù)據(jù)
uchar temp1,temp2,temp3,month_p;
uint temp4,table_addr;
bit flag2,flag_y;
temp1=year/16; //BCD->hex 先把數(shù)據(jù)轉(zhuǎn)換為十六進制
temp2=year%16;
year=temp1*10+temp2;
temp1=month/16;
temp2=month%16;
month=temp1*10+temp2;
temp1=day/16;
temp2=day%16;
day=temp1*10+temp2;
//定位數(shù)據(jù)表地址
if(sj==0)
{
table_addr=(year+0x64-1)*0x3;
}
else
{
table_addr=(year-1)*0x3;
}
//定位數(shù)據(jù)表地址完成
//取當(dāng)年春節(jié)所在的公歷月份
temp1=year_code[table_addr+2]&0x60;
temp1=_cror_(temp1,5);
//取當(dāng)年春節(jié)所在的公歷月份完成
//取當(dāng)年春節(jié)所在的公歷日
temp2=year_code[table_addr+2]&0x1f;
//取當(dāng)年春節(jié)所在的公歷日完成
// 計算當(dāng)年春年離當(dāng)年元旦的天數(shù),春節(jié)只會在公歷1月或2月
if(temp1==0x1){
temp3=temp2-1;
}
else{
temp3=temp2+0x1f-1;
}
//計算當(dāng)年春年離當(dāng)年元旦的天數(shù)完成
//計算公歷日離當(dāng)年元旦的天數(shù),為了減少運算,用了兩個表
//day_code1[9],day_code2[3]
//如果公歷月在九月或前,天數(shù)會少于0xff,用表day_code1[9],
//在九月后,天數(shù)大于0xff,用表day_code2[3]
//如輸入公歷日為8月10日,則公歷日離元旦天數(shù)為day_code1[8-1]+10-1
//如輸入公歷日為11月10日,則公歷日離元旦天數(shù)為day_code2[11-10]+10-1
if (month<10){
temp4=day_code1[month-1]+day-1;
}
else{
temp4=day_code2[month-10]+day-1;
}
if ((month>0x2)&&(year%0x4==0)){ //如果公歷月大于2月并且該年的2月為閏月,天數(shù)加1
temp4+=1;
}
//計算公歷日離當(dāng)年元旦的天數(shù)完成
//判斷公歷日在春節(jié)前還是春節(jié)后
if (temp4>=temp3){ //公歷日在春節(jié)后或就是春節(jié)當(dāng)日使用下面代碼進行運算
temp4-=temp3;
month=0x1;
month_p=0x1; //month_p為月份指向,公歷日在春節(jié)前或就是春節(jié)當(dāng)日month_p指向首月
flag2=get_moon_day(month_p,table_addr); //檢查該農(nóng)歷月為大小還是小月,大月返回1,小月返回0
flag_y=0;
if(flag2==0)temp1=0x1d; //小月29天
else temp1=0x1e; //大小30天
temp2=year_code[table_addr]&0xf0;
temp2=_cror_(temp2,4); //從數(shù)據(jù)表中取該年的閏月月份,如為0則該年無閏月
while(temp4>=temp1){
temp4-=temp1;
month_p+=1;
if(month==temp2){
flag_y=~flag_y;
if(flag_y==0)month+=1;
}
else month+=1;
flag2=get_moon_day(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp4+1;
}
else{ //公歷日在春節(jié)前使用下面代碼進行運算
temp3-=temp4;
if (year==0x0){year=0x63;sj=1;}
else year-=1;
table_addr-=0x3;
month=0xc;
temp2=year_code[table_addr]&0xf0;
temp2=_cror_(temp2,4);
if (temp2==0)month_p=0xc;
else month_p=0xd; //
//month_p為月份指向,如果當(dāng)年有閏月,一年有十三個月,月指向13,無閏月指向12
flag_y=0;
flag2=get_moon_day(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
while(temp3>temp1){
temp3-=temp1;
month_p-=1;
if(flag_y==0)month-=1;
if(month==temp2)flag_y=~flag_y;
flag2=get_moon_day(month_p,table_addr);
if(flag2==0)temp1=0x1d;
else temp1=0x1e;
}
day=temp1-temp3+1;
}
c_moon=sj; //HEX->BCD ,運算結(jié)束后,把數(shù)據(jù)轉(zhuǎn)換為BCD數(shù)據(jù)
temp1=year/10;
temp1=_crol_(temp1,4);
temp2=year%10;
year_moon=temp1|temp2; //得到y(tǒng)ear_moon 的農(nóng)歷年
temp1=month/10;
temp1=_crol_(temp1,4);
temp2=month%10;
month_moon=temp1|temp2; //得到month_moon 的農(nóng)歷月
temp1=day/10;
temp1=_crol_(temp1,4);
temp2=day%10;
day_moon=temp1|temp2; //得到day_moon 的農(nóng)歷日
}
nongli.h
#ifndef _NONGLI_H_
#define _NONGLI_H_
#include "config.h"
//extern uchar year_sun,month_sun,day_sun;//輸入公歷年,月,日數(shù)據(jù)
extern idata uchar year_moon,month_moon,day_moon;//輸出 陰歷 年,月,日數(shù)據(jù)
extern void Conversion(bit sj,uchar year,uchar month,uchar day);
//uchar Conver_week(bit sj,uchar year,uchar month,uchar day);
#endif
display.h
/**************************************
**顯示電路使用串行IC74HC595D
**************************************/
#ifndef __DISPLAY_H__
#define __DISPLAY_H__
#include "config.h"
extern uchar Ytemp; //接收的年
extern uchar Montemp; //接收的月
extern uchar Dtemp; //接收的日
extern uchar Htemp; //接收的時 24小時制
extern uchar Mintemp; //接收的分
extern uchar weektemp; //接收的星期
extern uchar tempertemp; //接收的溫度
extern uchar Ftemper;
extern uchar yearshi;
extern uchar monthshi;
extern uchar dateshi;
extern uchar hourshi;
extern uchar minshi;
extern uchar nonglimonthshi;
extern uchar nonglidateshi;
extern uchar tempershi;
extern uchar yearge;
extern uchar monthge;
extern uchar datege;
extern uchar hourge;
extern uchar minge;
extern uchar nonglimonthge;
extern uchar nonglidatege;
extern uchar temperge;
extern uchar week_code;
extern uchar con_nonglidate;
extern uchar con_nonglimonth;
extern uchar code dis_code[10]; // 0,1,2,3,4,5,6,7,8,9
extern uchar code dis_week[8]; //星期: 日 一 二 三 四 五 六 日
extern uchar code disp_code[10]; // 0,1,2,3,4,5,6,7,8,9
extern void yeardisplay_code (void); //年顯示碼
extern void monthdisplay_code (void); //月顯示碼
extern void datedisplay_code (void); //日顯示碼
extern void hourdisplay_code (void); //小時顯示碼
extern void minutedisplay_code (void); //分鐘顯示碼
extern void weekdisplay_code (void); //星期顯示碼
extern void temperdisplay_code (void); //溫度顯示碼
extern void nonglidisplay_code (void); //農(nóng)歷月日顯示碼
extern void DisplayInit(void);
extern void Display (void);
extern void nongli_Display(void);
extern void ge_shidisplay_code(void);
extern void nianshi_set_dis (uchar cut); //年十位顯示閃爍
extern void niange_set_dis (uchar cut); //年個位顯示閃爍
extern void month_set_dis (uchar cut); //月顯示閃爍
extern void dateshi_set_dis (uchar cut); //日十位顯示閃爍
extern void datege_set_dis (uchar cut); //日個位顯示閃爍
extern void hour_set_dis (uchar cut); //時顯示閃爍
extern void minshi_set_dis (uchar cut); //分十位顯示閃爍
extern void minge_set_dis (uchar cut); //分個位顯示閃爍
extern void week_set_dis (uchar cut); //星期顯示閃爍
#endif
display.c
/**************************************
**顯示電路使用串行IC74HC595D
**************************************/
#include <STC89C5xRC.H>
#include "display.h"
#include "ds3231.h"
#include "keymark.h"
#include "nongli.h"
#include "time.h"
#include "Port.h"
#include "config.h"
uchar Ytemp; //接收的年
uchar Montemp; //接收的月
uchar Dtemp; //接收的日
uchar Htemp; //接收的時 24小時制
uchar Mintemp; //接收的分
uchar weektemp; //接收的星期
uchar tempertemp; //接收的溫度
uchar Ftemper;
uchar yearshi;
uchar monthshi;
uchar dateshi;
uchar hourshi;
uchar minshi;
uchar nonglimonthshi;
uchar nonglidateshi;
uchar tempershi;
uchar yearge;
uchar monthge;
uchar datege;
uchar hourge;
uchar minge;
uchar nonglimonthge;
uchar nonglidatege;
uchar temperge;
uchar week_code;
uchar con_nonglidate;
uchar con_nonglimonth;
uchar code dis_code[10]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; // 0,1,2,3,4,5,6,7,8,9
uchar code dis_week[8]={0xc0,0xf9,0xa4,0xb0,0x99,0x92,0x82,0x80}; //星期: 0 一 二 三 四 五 六 日
uchar code disp_code[10]={0xff,0xf9,0xa4,0xb0,0x99,0x92,0x82,0xf8,0x80,0x90,}; // 0,1,2,3,4,5,6,7,8,9
void DisplayInit(void); //74HC595 串口線初始化
void HC595nianSend (uchar Sendval); //年月日數(shù)據(jù)發(fā)送
void HC595timeSend (uchar Sendval); //時間數(shù)據(jù)發(fā)送
void HC595temperSend (uchar Sendval); // 星期溫度數(shù)據(jù)發(fā)送
void HC595nongliSend (uchar Sendval); // 農(nóng)歷月日數(shù)據(jù)發(fā)送
void HC595nianshow (void); // 年數(shù)據(jù)顯示
void HC595timeshow (void); // 時間顯示
void HC595tempershow (void); // 星期溫度顯示
void HC595nonglishow (void) ; // 農(nóng)歷月日顯示
void Display (void) ; //年、月、日、時間、星期、溫度動態(tài)掃描顯示函數(shù)
void nongli_Display(void); //農(nóng)歷月、日靜態(tài)顯示函數(shù)
void ge_shidisplay_code(void); //個位十位顯示碼
void offnianshi_dis (void); //年十位顯示關(guān)
void offniange_dis (void); //年個位顯示關(guān)
void offmonth_dis (void); //月顯示關(guān)
void offdateshi_dis (void); //日十位顯示關(guān)
void offdatege_dis (void); //日個位顯示關(guān)
void offhour_dis (void) ; //時顯示關(guān)
void offminshi_dis (void); //分鐘十位顯示關(guān)
void offminge_dis (void); //分鐘個位顯示關(guān)
void offweek_dis (void); //星期顯示關(guān)
void nianshi_set_dis (uchar cut); //年十位顯示閃爍
void niange_set_dis (uchar cut); //年個位顯示閃爍
void month_set_dis (uchar cut); //月顯示閃爍
void dateshi_set_dis (uchar cut); //日十位顯示閃爍
void datege_set_dis (uchar cut) ; //日個位顯示閃爍
void hour_set_dis (uchar cut) ; //時顯示閃爍
void minshi_set_dis (uchar cut) ; //分十位顯示閃爍
void minge_set_dis (uchar cut) ; //分個位顯示閃爍
void week_set_dis (uchar cut) ; //星期顯示閃爍
void yeardisplay_code (void); //年顯示碼
void monthdisplay_code (void); //月顯示碼
void datedisplay_code (void); //日顯示碼
void hourdisplay_code (void); //小時顯示碼
void minutedisplay_code (void); //分鐘顯示碼
void weekdisplay_code (void); //星期顯示碼
void temperdisplay_code (void); //溫度顯示碼
void nonglidisplay_code (void); //農(nóng)歷月日顯示碼
/***************************************************************************************************************/
void DisplayInit(void) //74HC595 串口線初始化
{
SCK_nian_HC595 = 0;
RCK_nian_HC595 = 0;
SCK_time_HC595 = 0;
RCK_time_HC595 =0;
SCK_temper_HC595 = 0;
RCK_temper_HC595 = 0;
SCK_nongli_HC595 = 0;
RCK_nongli_HC595 = 0;
}
void HC595nianSend (uchar Sendval) //年月日數(shù)據(jù)發(fā)送
{
uchar i,j=Sendval;
for(i=0;i<8;i++)
{
SCK_nian_HC595=0;
SI_nian_HC595=(j&0x80)?1:0;
SCK_nian_HC595=1;
j<<=1;
}
SCK_nian_HC595=0;
}
void HC595timeSend (uchar Sendval) //時間數(shù)據(jù)發(fā)送
{
uchar i,j=Sendval;
for(i=0;i<8;i++)
{
SCK_time_HC595=0;
SI_time_HC595=(j&0x80)?1:0;
SCK_time_HC595=1;
j<<=1;
}
SCK_time_HC595=0;
}
void HC595temperSend (uchar Sendval) // 星期溫度數(shù)據(jù)發(fā)送
{
uchar i,j=Sendval;
for(i=0;i<8;i++)
{
SCK_temper_HC595=0;
SI_temper_HC595=(j&0x80)?1:0;
SCK_temper_HC595=1;
j<<=1;
}
SCK_temper_HC595=0;
}
void HC595nongliSend (uchar Sendval) // 農(nóng)歷月日數(shù)據(jù)發(fā)送
{
uchar i,j=Sendval;
for(i=0;i<8;i++)
{
SCK_nongli_HC595=0;
SI_nongli_HC595=(j&0x80)?1:0;
SCK_nongli_HC595=1;
j<<=1;
}
SCK_nongli_HC595=0;
}
void HC595nianshow (void) // 年數(shù)據(jù)顯示
{
RCK_nian_HC595=0;
delayus(1);
RCK_nian_HC595=1;
delayus(1);
RCK_nian_HC595=0;
}
void HC595timeshow (void) // 時間顯示
{
RCK_time_HC595=0;
delayus(1);
RCK_time_HC595=1;
delayus(1);
RCK_time_HC595=0;
}
void HC595tempershow (void) // 星期溫度顯示
{
RCK_temper_HC595=0;
delayus(1);
RCK_temper_HC595=1;
delayus(1);
RCK_temper_HC595=0;
}
void HC595nonglishow (void) // 農(nóng)歷月日顯示
{
RCK_nongli_HC595=0;
delayus(1);
RCK_nongli_HC595=1;
delayus(1);
RCK_nongli_HC595=0;
}
/*******************************************************************/
void Display (void) //年、月、日、時間、星期、溫度動態(tài)掃描顯示函數(shù)
{
HC595nianSend (0x88);
HC595nianSend (monthshi);
HC595nianSend (0xa4);
HC595timeSend (0x80);
HC595timeSend (hourshi);
HC595temperSend (0x80);
HC595temperSend (week_code);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x44);
HC595nianSend (monthge);
HC595nianSend (0xc0);
HC595timeSend (0x40);
HC595timeSend (hourge);
HC595temperSend (0x40);
HC595temperSend (Ftemper);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x22);
HC595nianSend (dateshi);
HC595nianSend (yearshi);
HC595timeSend (0x20);
HC595timeSend (minshi);
HC595temperSend (0x20);
HC595temperSend (tempershi);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x11);
HC595nianSend (datege);
HC595nianSend (yearge);
HC595timeSend (0x10);
HC595timeSend (minge);
HC595temperSend (0x10);
HC595temperSend (temperge);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(5);
}
void nongli_Display(void) //農(nóng)歷月、日靜態(tài)顯示函數(shù)
{
// ge_shidisplay_code ();
HC595nongliSend (nonglidatege);
HC595nongliSend (nonglidateshi);
HC595nongliSend (nonglimonthge);
HC595nongliSend (nonglimonthshi);
HC595nonglishow();
_nop_();
_nop_();
}
/***********************************************************************************************************/
void ge_shidisplay_code (void) //個位十位顯示碼
{
yeardisplay_code (); //年顯示碼
monthdisplay_code (); //月顯示碼
datedisplay_code (); //日顯示碼
hourdisplay_code (); //小時顯示碼
minutedisplay_code (); //分鐘顯示碼
weekdisplay_code (); //星期顯示碼
temperdisplay_code (); //溫度顯示碼
nonglidisplay_code (); //農(nóng)歷月日顯示碼
}
/************************************************************************************************************/
void yeardisplay_code (void) //年顯示碼
{
Ytemp=read_random(DS3231_YEAR); //接收的年
yearge=dis_code[Ytemp&(0x0f)]; //年個
yearshi=dis_code[Ytemp>>4]; //年十
}
/************************************************************************************************************/
void monthdisplay_code (void) //月顯示碼
{
Montemp=(read_random(DS3231_MONTH))&(0x1f); //接收的月
monthge=dis_code[Montemp&(0x0f)]; //月個
monthshi=disp_code[Montemp>>4]; //月十
}
/************************************************************************************************************/
void datedisplay_code (void) //日顯示碼
{
Dtemp=(read_random(DS3231_DAY))&(0x3f); //接收的日
datege=dis_code[Dtemp&(0x0f)]; //日個
dateshi=disp_code[Dtemp>>4]; //日十
}
/************************************************************************************************************/
void hourdisplay_code (void) //小時顯示碼
{
Htemp=(read_random(DS3231_HOUR))&(0x3f); //接收的時 24小時制
hourge=dis_code[Htemp&(0x0f)]; //小時個
hourshi=disp_code[Htemp>>4]; //小時十
}
/************************************************************************************************************/
void minutedisplay_code (void) //分鐘顯示碼
{
Mintemp=(read_random(DS3231_MINUTE))&(0x7f); //接收的分
minge=dis_code[Mintemp&(0x0f)]; //分鐘個
minshi=dis_code[Mintemp>>4]; //分鐘十
}
/************************************************************************************************************/
void weekdisplay_code (void) //星期顯示碼
{
weektemp=(read_random(DS3231_WEEK))&(0x0f); //接收的星期
week_code=dis_week[weektemp]; //星期
}
/************************************************************************************************************/
void temperdisplay_code (void) //溫度顯示碼
{
tempertemp = read_random(DS3231_TEMPERATUREH); //接收的溫度 高字節(jié),不顯示小數(shù)部分
if (((tempertemp>>4)&(0x8))==0) temperge=dis_code[(tempertemp&(0x7f))%10]; //溫度個
else temperge=dis_code[((~(tempertemp-1))&(0x7f))%10];
if (((tempertemp>>4)&(0x8))==0) tempershi=disp_code[((tempertemp&(0x7f))/10)]; //溫度十
else tempershi=disp_code[((~(tempertemp-1))&(0x7f))/10];
if (((tempertemp>>4)&(0x8))==1) Ftemper=0xbf; //溫度符號
else Ftemper=0xff;
}
/************************************************************************************************************/
void nonglidisplay_code (void) //農(nóng)歷月日顯示碼
{
Conversion(0,Ytemp,Montemp,Dtemp); //公歷與農(nóng)歷轉(zhuǎn)換子函數(shù)
nonglimonthge=dis_code[month_moon&(0x0f)]; //農(nóng)歷月份個
nonglidatege=dis_code[day_moon&(0x0f)]; //農(nóng)歷日個
nonglimonthshi=disp_code[month_moon>>4]; //農(nóng)歷月十
nonglidateshi=disp_code[day_moon>>4]; //農(nóng)歷日十
}
/************************************************************************************************************/
void offnianshi_dis (void) //年十位顯示關(guān)
{
// ge_shidisplay_code ();
HC595nianSend (0x88);
HC595nianSend (monthshi);
HC595nianSend (0xa4);
HC595timeSend (0x80);
HC595timeSend (hourshi);
HC595temperSend (0x80);
HC595temperSend (week_code);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x44);
HC595nianSend (monthge);
HC595nianSend (0xc0);
HC595timeSend (0x40);
HC595timeSend (hourge);
HC595temperSend (0x40);
HC595temperSend (Ftemper);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x02);
HC595nianSend (dateshi);
HC595nianSend (yearshi);
HC595timeSend (0x20);
HC595timeSend (minshi);
HC595temperSend (0x20);
HC595temperSend (tempershi);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x11);
HC595nianSend (datege);
HC595nianSend (yearge);
HC595timeSend (0x10);
HC595timeSend (minge);
HC595temperSend (0x10);
HC595temperSend (temperge);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(5);
}
/*****************************************************/
void offniange_dis (void) //年個位顯示關(guān)
{
// ge_shidisplay_code ();
HC595nianSend (0x88);
HC595nianSend (monthshi);
HC595nianSend (0xa4);
HC595timeSend (0x80);
HC595timeSend (hourshi);
HC595temperSend (0x80);
HC595temperSend (week_code);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x44);
HC595nianSend (monthge);
HC595nianSend (0xc0);
HC595timeSend (0x40);
HC595timeSend (hourge);
HC595temperSend (0x40);
HC595temperSend (Ftemper);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x22);
HC595nianSend (dateshi);
HC595nianSend (yearshi);
HC595timeSend (0x20);
HC595timeSend (minshi);
HC595temperSend (0x20);
HC595temperSend (tempershi);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x01);
HC595nianSend (datege);
HC595nianSend (yearge);
HC595timeSend (0x10);
HC595timeSend (minge);
HC595temperSend (0x10);
HC595temperSend (temperge);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(5);
}
/*****************************************************/
void offmonth_dis (void) //月顯示關(guān)
{
// ge_shidisplay_code ();
HC595nianSend (0x80);
HC595nianSend (monthshi);
HC595nianSend (0xa4);
HC595timeSend (0x80);
HC595timeSend (hourshi);
HC595temperSend (0x80);
HC595temperSend (week_code);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x40);
HC595nianSend (monthge);
HC595nianSend (0xc0);
HC595timeSend (0x40);
HC595timeSend (hourge);
HC595temperSend (0x40);
HC595temperSend (Ftemper);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x22);
HC595nianSend (dateshi);
HC595nianSend (yearshi);
HC595timeSend (0x20);
HC595timeSend (minshi);
HC595temperSend (0x20);
HC595temperSend (tempershi);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x11);
HC595nianSend (datege);
HC595nianSend (yearge);
HC595timeSend (0x10);
HC595timeSend (minge);
HC595temperSend (0x10);
HC595temperSend (temperge);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(5);
}
/*****************************************************/
void offdateshi_dis (void) //日十位顯示關(guān)
{
// ge_shidisplay_code ();
HC595nianSend (0x88);
HC595nianSend (monthshi);
HC595nianSend (0xa4);
HC595timeSend (0x80);
HC595timeSend (hourshi);
HC595temperSend (0x80);
HC595temperSend (week_code);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x44);
HC595nianSend (monthge);
HC595nianSend (0xc0);
HC595timeSend (0x40);
HC595timeSend (hourge);
HC595temperSend (0x40);
HC595temperSend (Ftemper);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x20);
HC595nianSend (dateshi);
HC595nianSend (yearshi);
HC595timeSend (0x20);
HC595timeSend (minshi);
HC595temperSend (0x20);
HC595temperSend (tempershi);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x11);
HC595nianSend (datege);
HC595nianSend (yearge);
HC595timeSend (0x10);
HC595timeSend (minge);
HC595temperSend (0x10);
HC595temperSend (temperge);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(5);
}
/*****************************************************/
void offdatege_dis (void) //日個位顯示關(guān)
{
// ge_shidisplay_code ();
HC595nianSend (0x88);
HC595nianSend (monthshi);
HC595nianSend (0xa4);
HC595timeSend (0x80);
HC595timeSend (hourshi);
HC595temperSend (0x80);
HC595temperSend (week_code);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x44);
HC595nianSend (monthge);
HC595nianSend (0xc0);
HC595timeSend (0x40);
HC595timeSend (hourge);
HC595temperSend (0x40);
HC595temperSend (Ftemper);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x22);
HC595nianSend (dateshi);
HC595nianSend (yearshi);
HC595timeSend (0x20);
HC595timeSend (minshi);
HC595temperSend (0x20);
HC595temperSend (tempershi);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x10);
HC595nianSend (datege);
HC595nianSend (yearge);
HC595timeSend (0x10);
HC595timeSend (minge);
HC595temperSend (0x10);
HC595temperSend (temperge);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(5);
}
/*****************************************************/
void offhour_dis (void) //時顯示關(guān)
{
// ge_shidisplay_code ();
HC595nianSend (0x88);
HC595nianSend (monthshi);
HC595nianSend (0xa4);
HC595timeSend (0x00);
HC595timeSend (hourshi);
HC595temperSend (0x80);
HC595temperSend (week_code);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x44);
HC595nianSend (monthge);
HC595nianSend (0xc0);
HC595timeSend (0x00);
HC595timeSend (hourge);
HC595temperSend (0x40);
HC595temperSend (Ftemper);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x22);
HC595nianSend (dateshi);
HC595nianSend (yearshi);
HC595timeSend (0x20);
HC595timeSend (minshi);
HC595temperSend (0x20);
HC595temperSend (tempershi);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x11);
HC595nianSend (datege);
HC595nianSend (yearge);
HC595timeSend (0x10);
HC595timeSend (minge);
HC595temperSend (0x10);
HC595temperSend (temperge);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(5);
}
/*****************************************************/
void offminshi_dis (void) //分鐘十位顯示關(guān)
{
// ge_shidisplay_code ();
HC595nianSend (0x88);
HC595nianSend (monthshi);
HC595nianSend (0xa4);
HC595timeSend (0x80);
HC595timeSend (hourshi);
HC595temperSend (0x80);
HC595temperSend (week_code);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x44);
HC595nianSend (monthge);
HC595nianSend (0xc0);
HC595timeSend (0x40);
HC595timeSend (hourge);
HC595temperSend (0x40);
HC595temperSend (Ftemper);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x22);
HC595nianSend (dateshi);
HC595nianSend (yearshi);
HC595timeSend (0x00);
HC595timeSend (minshi);
HC595temperSend (0x20);
HC595temperSend (tempershi);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x11);
HC595nianSend (datege);
HC595nianSend (yearge);
HC595timeSend (0x10);
HC595timeSend (minge);
HC595temperSend (0x10);
HC595temperSend (temperge);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(5);
}
/*****************************************************/
void offminge_dis (void) //分鐘個位顯示關(guān)
{
// ge_shidisplay_code ();
HC595nianSend (0x88);
HC595nianSend (monthshi);
HC595nianSend (0xa4);
HC595timeSend (0x80);
HC595timeSend (hourshi);
HC595temperSend (0x80);
HC595temperSend (week_code);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x44);
HC595nianSend (monthge);
HC595nianSend (0xc0);
HC595timeSend (0x40);
HC595timeSend (hourge);
HC595temperSend (0x40);
HC595temperSend (Ftemper);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x22);
HC595nianSend (dateshi);
HC595nianSend (yearshi);
HC595timeSend (0x20);
HC595timeSend (minshi);
HC595temperSend (0x20);
HC595temperSend (tempershi);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x11);
HC595nianSend (datege);
HC595nianSend (yearge);
HC595timeSend (0x00);
HC595timeSend (minge);
HC595temperSend (0x10);
HC595temperSend (temperge);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(5);
}
/*****************************************************/
void offweek_dis (void) //星期顯示關(guān)
{
// ge_shidisplay_code ();
HC595nianSend (0x88);
HC595nianSend (monthshi);
HC595nianSend (0xa4);
HC595timeSend (0x80);
HC595timeSend (hourshi);
HC595temperSend (0x00);
HC595temperSend (week_code);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x44);
HC595nianSend (monthge);
HC595nianSend (0xc0);
HC595timeSend (0x40);
HC595timeSend (hourge);
HC595temperSend (0x40);
HC595temperSend (Ftemper);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x22);
HC595nianSend (dateshi);
HC595nianSend (yearshi);
HC595timeSend (0x20);
HC595timeSend (minshi);
HC595temperSend (0x20);
HC595temperSend (tempershi);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(6);
HC595nianSend (0x11);
HC595nianSend (datege);
HC595nianSend (yearge);
HC595timeSend (0x10);
HC595timeSend (minge);
HC595temperSend (0x10);
HC595temperSend (temperge);
HC595nianshow();
HC595timeshow();
HC595tempershow();
delayms(5);
}
/*****************************************************/
void nianshi_set_dis (uchar cut) //年十位顯示閃爍
{
uchar i;
for (i=0;i<cut;i++) offnianshi_dis ( ) ;
for (i=0;i<(cut-30);i++) Display ( ) ;
}
/*****************************************************/
void niange_set_dis (uchar cut) //年個位顯示閃爍
{
uchar i;
for (i=0;i<cut;i++) offniange_dis ( ) ;
for (i=0;i<(cut-30);i++) Display ( ) ;
}
/*****************************************************/
void month_set_dis (uchar cut) //月顯示閃爍
{
uchar i;
for (i=0;i<cut;i++) offmonth_dis ( ) ;
for (i=0;i<(cut-30);i++) Display ( ) ;
}
/*****************************************************/
void dateshi_set_dis (uchar cut) //日十位顯示閃爍
{
uchar i;
for (i=0;i<cut;i++) offdateshi_dis ( ) ;
for (i=0;i<(cut-30);i++) Display ( ) ;
}
/*****************************************************/
void datege_set_dis (uchar cut) //日個位顯示閃爍
{
uchar i;
for (i=0;i<cut;i++) offdatege_dis ( ) ;
for (i=0;i<(cut-30);i++) Display ( ) ;
}
/*****************************************************/
void hour_set_dis (uchar cut) //時顯示閃爍
{
uchar i;
for (i=0;i<cut;i++) offhour_dis ( ) ;
for (i=0;i<(cut-30);i++) Display ( ) ;
}
/*****************************************************/
void minshi_set_dis (uchar cut) //分十位顯示閃爍
{
uchar i;
for (i=0;i<cut;i++) offminshi_dis ( ) ;
for (i=0;i<(cut-30);i++) Display ( ) ;
}
/*****************************************************/
void minge_set_dis (uchar cut) //分個位顯示閃爍
{
uchar i;
for (i=0;i<cut;i++) offminge_dis ( ) ;
for (i=0;i<(cut-30);i++) Display ( ) ;
}
/*****************************************************/
void week_set_dis (uchar cut) //星期顯示閃爍
{
uchar i;
for (i=0;i<cut;i++) offweek_dis ( ) ;
for (i=0;i<(cut-30);i++) Display ( ) ;
}
/*****************************************************/
keymark.h
/***按鍵 管腳定義
**
*********************************************************/
#ifndef __KEYMARK_H__
#define __KEYMARK_H__
#include "config.h"
extern uchar yeardis;
extern uchar monthdis;
extern uchar datedis;
extern uchar weekdis;
extern uchar hourdis;
extern uchar mindis;
extern uchar BCD2Hex(uchar val);
extern void keyscan();
#endif
keymark.c
#include <STC89C5xRC.H>
#include "keymark.h"
#include "config.h"
#include "time.h"
#include "display.h"
#include "ds3231.h"
#include "Port.h"
uchar flag_set=0;
uchar yeardis;
uchar monthdis;
uchar datedis;
uchar weekdis;
uchar hourdis;
uchar mindis;
uchar BCD2Hex(uchar val) //BCD碼轉(zhuǎn)換為十六進制(Hex)數(shù)
{
uchar i,j,k;
i=val/16;
j=val%16;
k=i*10+j;
return k;
}
void keyscan()
{
sw1=1;sw2=1;
Display ();
Display ();
Display ();
Display ();
Display ();
Display ();
Display ();
Display ();
if(sw1==0)
{
Display (); //用顯示函數(shù)替代延時函數(shù)
if(sw1==0)
{
flag_set++;
yeardis=BCD2Hex(read_random(DS3231_YEAR)); //有鍵按下時重賦值,以更新數(shù)據(jù)
monthdis=BCD2Hex(read_random(DS3231_MONTH)&(0x1f));
datedis=BCD2Hex(read_random(DS3231_DAY)&(0x3f));
hourdis=BCD2Hex(read_random(DS3231_HOUR)&(0x3f));
mindis=BCD2Hex(read_random(DS3231_MINUTE)&(0x7f));
weekdis=BCD2Hex(read_random(DS3231_WEEK)&(0x0f));
}
}
while (flag_set)
{
switch (flag_set)
{
case 1: //nianshi_set_dis (50);
if(sw2==0)
{
Display ();
if(sw2==0) yeardis+=10;
}
if (yeardis>99) yeardis=0;
write_byte(DS3231_YEAR,Decimal2BCD(yeardis));
Ytemp=read_random(DS3231_YEAR); //接收的年
yearshi=dis_code[Ytemp>>4]; //年十
nianshi_set_dis (50);
break;
case 2:// niange_set_dis (50);
if(sw2==0)
{
Display ();
if(sw2==0) yeardis+=1;
}
if (yeardis>99) yeardis=0;
write_byte(DS3231_YEAR,Decimal2BCD(yeardis));
yeardisplay_code (); //年顯示碼
niange_set_dis (50);
break;
case 3: //month_set_dis (50);
if(sw2==0)
{
Display ();
if(sw2==0) monthdis+=1;
}
if (monthdis>12) monthdis=1;
write_byte(DS3231_MONTH,Decimal2BCD(monthdis));
monthdisplay_code (); //月顯示碼
month_set_dis (50);
break;
case 4: //dateshi_set_dis (50);
if(sw2==0)
{
Display ();
if(sw2==0) datedis+=10;
}
if (datedis>31) datedis=1;
write_byte(DS3231_DAY,Decimal2BCD(datedis));
Dtemp=(read_random(DS3231_DAY))&(0x3f); //接收的日
dateshi=disp_code[Dtemp>>4]; //日十
dateshi_set_dis (50);
break;
case 5:// datege_set_dis (50);
if(sw2==0)
{
Display ();
if(sw2==0) datedis+=1;
}
if (datedis>31) datedis=1;
write_byte(DS3231_DAY,Decimal2BCD(datedis));
datedisplay_code (); //日顯示碼
datege_set_dis (50);
break;
case 6: //hour_set_dis (50);
if(sw2==0)
{
Display ();
if(sw2==0) hourdis+=1;
}
if (hourdis>23) hourdis=0;
write_byte(DS3231_HOUR,Decimal2BCD(hourdis));
hourdisplay_code (); //小時顯示碼
hour_set_dis (50);
break;
case 7:// minshi_set_dis (50);
if(sw2==0)
{
Display ();
if(sw2==0) mindis+=10;
}
if (mindis>59) mindis=0;
write_byte(DS3231_MINUTE,Decimal2BCD(mindis));
Mintemp=(read_random(DS3231_MINUTE))&(0x7f); //接收的分
minshi=dis_code[Mintemp>>4]; //分鐘十
minshi_set_dis (50);
break;
case 8: //minge_set_dis (50);
if(sw2==0)
{
Display ();
if(sw2==0) mindis+=1;
}
if (mindis>59) mindis=0;
write_byte(DS3231_MINUTE,Decimal2BCD(mindis));
write_byte(DS3231_SECOND,0x0);
minutedisplay_code (); //分鐘顯示碼
minge_set_dis (50);
break;
case 9:// week_set_dis (50);
if(sw2==0)
{
Display ();
if(sw2==0) weekdis+=1;
}
if (weekdis>7) weekdis=1;
write_byte(DS3231_WEEK,Decimal2BCD(weekdis));
weekdisplay_code (); //星期顯示碼
week_set_dis (50);
break;
default : break;
}
if(sw1==0)
{
Display (); //用顯示函數(shù)替代延時函數(shù)
if(sw1==0) flag_set++;
}
if(flag_set>9)
{
flag_set=0;
ModifyTime(yeardis,monthdis,datedis,hourdis,mindis,0,weekdis);
ge_shidisplay_code ();
}
Display ();
}
Display ();
Display ();
}
/*************************************************************************************************************/
|
|