太复杂了。![]() ![]() ![]() ![]() |
![]() |
楼主很厉害,必须点赞 |
这是个狠人,为啥一个时钟用c语言也这么长代码,我用汇编做个带闹钟的接近两千行代码,太长了太烦,主要是bcd码读取转成十进制,调时间又得转成bcd码,转换过程太烦了。比做数控收音机都烦 |
我说楼主的头发到哪里去了,我去____![]() ![]() |
鹈鹕 发表于 2022-3-20 18:23 肯定是漆包线,他敢这么用裸铜丝,我佩服他50年!这也够乱的…… |
藕地嗝天,都是裸铜丝,这么飞那看得懂啊,你就不怕短路,前两年我也焊了个52的电子钟,用的是洞洞板,横平竖直,一目了然。 |
焊第一次还可忍受的话,再检查一次就该暴跳如雷了![]() |
我见过最乱的飞线![]() |
这是天外飞仙的感觉啊,太强了,有强迫症的不能看。 |
收藏一波 慢慢看 |
很好很好值得学习 |
谢谢分享 |
楼主的线接的让人眼花2333 |
飞线超强精神可佳! |
这飞线超强,换成我,我是不愿、不想这样做,会心情不好。这飞线是否可以申请吉尼斯记录。 |
楼主飞线好厉害啊! |
这线能再乱一点吗? |
感谢分享 |
好厉害的飞仙,晕倒了我 |
好有耐心![]() |
有耐心,够细心![]() |
你这个飞线真够乱的![]() |
楼主有原理图吗 |
admin 发表于 2015-7-7 23:36 拆的旧板、元件,只能飞线了,我也不想的 ![]() |
本帖最后由 abc123194 于 2015-7-8 23:05 编辑 还是初学者,有不足处请指点! main.c /******************************************************************************** 以实时时钟的分钟定时功能来实现中断, 当分钟数据变化时,进行数据的更新; 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" /***************************************************************************/ /**********************函数声明*********************************/ /*********************************************************************/ void MCUINIT() { /*********************************************************************/ int0=1; InitDS3231(); //初始化DS3231 DisplayInit(); //74HC595 串口线初始化 delayms(5); ge_shidisplay_code (); Display(); //年、月、日、时间、星期、温度动态扫描显示函数 yeardis=BCD2Hex(read_random(DS3231_YEAR)); 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)); nongli_Display(); //农历月、日静态显示函数 /*********************************************************************/ _nop_();_nop_(); _nop_();_nop_(); } /****************************主函数*****************************************/ void main() { MCUINIT(); Display (); while(1) { Display (); if (int0==0) //如果是DS3231每分钟时间到 { minutedisplay_code (); //分钟显示码 Display (); minutedisplay_code (); //分钟显示码 Display (); write_byte(0x0f,0x00); //32KHZ输出禁止,闹钟标志位清零 Display (); if ((Mintemp==0)||(Mintemp==1)||(Mintemp==2)) //如果是DS3231每小时时间到,前三分钟每分钟都读数据,防漏读 { hourdisplay_code (); //小时显示码 Display (); if (Htemp==0) //如果是DS3231每天时间到 { datedisplay_code (); //日显示码 weekdisplay_code (); //星期显示码 Display (); nonglidisplay_code (); //农历月日显示码 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输出禁止,闹钟标志位清零 int0=1; Display (); } Display (); Display (); keyscan(); //按键扫描 Display (); } } /*********************************************************************/ config.h /*************************************************** **文件名 :config.h **功能 :MCU有关的配置 **建立日期:15/05/01 **修改记录: **MCU初始化设置:MCU型号STC89C51RC 使用内置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 **功能 :引脚有关的定义 **显示电路使用串行IC74HC595D,时钟使用时钟芯片DS3231SN *****************************************************/ #include <STC89C5xRC.H> #ifndef PORT_H_ #define PORT_H_ /********************************************************** ** **DS3231 管脚定义 ** *********************************************************/ sbit SDA=P3^6; //模拟I2C数据传送位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; //应答标志位 uchar Decimal2BCD(uchar val); //二进制(Decimal)数转换为BCD码 void Start_I2C(); //I2C起始信号 void Stop_I2C(); //I2C结束信号 void SendByte(uchar c); //发送字节数据 uchar RcvByte(); //接收字节数据 void Ack_I2C(bit a); //应答信号 uchar write_byte(uchar addr, uchar write_data); //写入DS3231地址的数据 uchar read_random(uchar random_addr); //读回DS3231地址的数据 void ModifyTime(uchar yea,uchar mon,uchar da,uchar hou,uchar min,uchar sec,uchar wee); void InitDS3231 (); //初始化DS3231 /***********************************************************************************/ uchar Decimal2BCD(uchar val) //二进制(Decimal)数转换为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; //发送起始条件的数据信号 _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); //起始条件建立时间大于4.7us,延时 _nop_(); SDA=0; //发送起始信号 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); // 起始条件锁定时间大于4μs SCL=0; //钳住I2C总线,准备发送或接收数据 _nop_(); _nop_(); } /********************************************************/ /************************STOP****************************/ void Stop_I2C() { SDA=0; //发送结束条件的数据信号 _nop_(); //发送结束条件的时钟信号 SCL=1; //结束条件建立时间大于4us _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); SDA=1; //发送I2C总线结束信号 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); } /********************************************************/ /******************************************************************* 字节数据发送函数 函数原型: void SendByte(uint8 Dat); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) ack=1 发送数据正常, ack=0 被控器无应答或损坏。 ********************************************************************/ void SendByte(uchar c) { uchar BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位 { if((c<<BitCnt)&0x80) SDA=1; //判断发送位 else SDA=0; _nop_(); SCL=1; //置时钟线为高,通知被控器开始接收数据位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //保证时钟高电平周期大于4μs SCL=0; _nop_(); } _nop_(); SDA=1; //8位发送完后释放数据线,准备接收应答位 _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); if(SDA==1) ack=0; else ack=1; //判断是否接收到应答信号 SCL=0; _nop_(); _nop_(); } /********************************************************/ /******************************************************************* 字节数据接收函数 函数原型: uint8 RcvByte(); 功能: 用来接收从器件传来的数据,并判断总线错误(不发应答信号), 发完后请用应答函数应答从机。 ********************************************************************/ uchar RcvByte() //接收字节数据 { uchar retc; uchar BitCnt; retc=0; SDA=1; //置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt++) { _nop_(); SCL=0; //置时钟线为低,准备接收数据位 _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //时钟低电平周期大于4.7μs SCL=1; //置时钟线为高使数据线上数据有效 _nop_(); _nop_(); _nop_(); retc=retc<<1; if(SDA==1) retc=retc+1; //读数据位,接收的数据位放入retc中 _nop_(); _nop_(); } SCL=0; _nop_(); _nop_(); return(retc); } /******************************************************************** 应答子函数 函数原型: void I2CACK(bit a); 功能: 主控器进行应答信号(可以是应答或非应答信号,由位参数a决定) ********************************************************************/ void Ack_I2C(bit a) //应答信号 { if(a==0) SDA=0; //在此发出应答或非应答信号 else SDA=1; _nop_(); _nop_(); _nop_(); SCL=1; _nop_(); _nop_(); _nop_(); _nop_(); _nop_(); //时钟低电平周期大于4μs SCL=0; //清时钟线,钳住I2C总线以便继续接收 _nop_(); _nop_(); } /****************************************************/ /***********将一个字节写入DS3231指定的地址***********/ uchar write_byte(uchar addr, uchar write_data) //写入DS3231地址的数据 { 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当前地址读一个字节************ 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指定地址读一个字节************/ uchar read_random(uchar random_addr) //读回DS3231地址的数据 { uchar read_data; //DS3231读数据必须先写入要读的数据地址,再重新发送开始信号再读取当前地址数据, Start_I2C(); //这个问题没注意,搞了好一阵子,连芯片都更换了都没用,后来仔细研究了网 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输出禁止,闹钟标志位清零 write_byte(0x0e,0x06); //中断允许,闹钟2打开闹钟1关闭 ,每分钟#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 //状态寄存器 #define DS3231_XTAL 0x10 //晶体老化寄存器 #define DS3231_TEMPERATUREH 0x11 //温度寄存器高字节(8位) #define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(高2位) extern uchar Decimal2BCD(uchar val); //二进制(Decimal)数转换为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" //输入输出数据均为BCD数据 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; // 转换出的农历年 、月 、 日 /////////// //以下为程序的实现~~~~~,不用看了 //忘了是哪个网友的程序了,,,感谢ing /* 公历年对应的农历数据,每年三字节, 格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小 第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小 月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天) 第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期 */ 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 }; ///月份数据表 code uchar day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3}; code uint day_code2[3]={0x111,0x130,0x14e}; /*子函数,用于读取数据表中农历月的大月或小月,如果该月为大返回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; } //公历与农历转换子函数 //函数功能:输入BCD阳历数据,输出BCD阴历数据(只允许1901-2099年) //调用函数后,原有数据不变,读c_moon,year_moon,month_moon,day_moon得出阴历BCD数据 void Conversion(bit sj,uchar year,uchar month,uchar day) { //sj=0 为21世纪,sj=1 为20世纪 输入输出数据均为BCD数据 uchar temp1,temp2,temp3,month_p; uint temp4,table_addr; bit flag2,flag_y; temp1=year/16; //BCD->hex 先把数据转换为十六进制 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; //定位数据表地址 if(sj==0) { table_addr=(year+0x64-1)*0x3; } else { table_addr=(year-1)*0x3; } //定位数据表地址完成 //取当年春节所在的公历月份 temp1=year_code[table_addr+2]&0x60; temp1=_cror_(temp1,5); //取当年春节所在的公历月份完成 //取当年春节所在的公历日 temp2=year_code[table_addr+2]&0x1f; //取当年春节所在的公历日完成 // 计算当年春年离当年元旦的天数,春节只会在公历1月或2月 if(temp1==0x1){ temp3=temp2-1; } else{ temp3=temp2+0x1f-1; } //计算当年春年离当年元旦的天数完成 //计算公历日离当年元旦的天数,为了减少运算,用了两个表 //day_code1[9],day_code2[3] //如果公历月在九月或前,天数会少于0xff,用表day_code1[9], //在九月后,天数大于0xff,用表day_code2[3] //如输入公历日为8月10日,则公历日离元旦天数为day_code1[8-1]+10-1 //如输入公历日为11月10日,则公历日离元旦天数为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月为闰月,天数加1 temp4+=1; } //计算公历日离当年元旦的天数完成 //判断公历日在春节前还是春节后 if (temp4>=temp3){ //公历日在春节后或就是春节当日使用下面代码进行运算 temp4-=temp3; month=0x1; month_p=0x1; //month_p为月份指向,公历日在春节前或就是春节当日month_p指向首月 flag2=get_moon_day(month_p,table_addr); //检查该农历月为大小还是小月,大月返回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); //从数据表中取该年的闰月月份,如为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{ //公历日在春节前使用下面代码进行运算 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为月份指向,如果当年有闰月,一年有十三个月,月指向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 ,运算结束后,把数据转换为BCD数据 temp1=year/10; temp1=_crol_(temp1,4); temp2=year%10; year_moon=temp1|temp2; //得到year_moon 的农历年 temp1=month/10; temp1=_crol_(temp1,4); temp2=month%10; month_moon=temp1|temp2; //得到month_moon 的农历月 temp1=day/10; temp1=_crol_(temp1,4); temp2=day%10; day_moon=temp1|temp2; //得到day_moon 的农历日 } nongli.h #ifndef _NONGLI_H_ #define _NONGLI_H_ #include "config.h" //extern uchar year_sun,month_sun,day_sun;//输入公历年,月,日数据 extern idata uchar year_moon,month_moon,day_moon;//输出 阴历 年,月,日数据 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); //农历月日显示码 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); //年月日数据发送 void HC595timeSend (uchar Sendval); //时间数据发送 void HC595temperSend (uchar Sendval); // 星期温度数据发送 void HC595nongliSend (uchar Sendval); // 农历月日数据发送 void HC595nianshow (void); // 年数据显示 void HC595timeshow (void); // 时间显示 void HC595tempershow (void); // 星期温度显示 void HC595nonglishow (void) ; // 农历月日显示 void Display (void) ; //年、月、日、时间、星期、温度动态扫描显示函数 void nongli_Display(void); //农历月、日静态显示函数 void ge_shidisplay_code(void); //个位十位显示码 void offnianshi_dis (void); //年十位显示关 void offniange_dis (void); //年个位显示关 void offmonth_dis (void); //月显示关 void offdateshi_dis (void); //日十位显示关 void offdatege_dis (void); //日个位显示关 void offhour_dis (void) ; //时显示关 void offminshi_dis (void); //分钟十位显示关 void offminge_dis (void); //分钟个位显示关 void offweek_dis (void); //星期显示关 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); //农历月日显示码 /***************************************************************************************************************/ 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) //年月日数据发送 { 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) //时间数据发送 { 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) // 星期温度数据发送 { 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) // 农历月日数据发送 { 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) // 年数据显示 { 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) // 农历月日显示 { RCK_nongli_HC595=0; delayus(1); RCK_nongli_HC595=1; delayus(1); RCK_nongli_HC595=0; } /*******************************************************************/ void Display (void) //年、月、日、时间、星期、温度动态扫描显示函数 { 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) //农历月、日静态显示函数 { // 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 (); //农历月日显示码 } /************************************************************************************************************/ 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); //接收的温度 高字节,不显示小数部分 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) //农历月日显示码 { Conversion(0,Ytemp,Montemp,Dtemp); //公历与农历转换子函数 nonglimonthge=dis_code[month_moon&(0x0f)]; //农历月份个 nonglidatege=dis_code[day_moon&(0x0f)]; //农历日个 nonglimonthshi=disp_code[month_moon>>4]; //农历月十 nonglidateshi=disp_code[day_moon>>4]; //农历日十 } /************************************************************************************************************/ void offnianshi_dis (void) //年十位显示关 { // 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) //年个位显示关 { // 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) //月显示关 { // 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) //日十位显示关 { // 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) //日个位显示关 { // 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) //时显示关 { // 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) //分钟十位显示关 { // 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) //分钟个位显示关 { // 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) //星期显示关 { // 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码转换为十六进制(Hex)数 { 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 (); //用显示函数替代延时函数 if(sw1==0) { flag_set++; yeardis=BCD2Hex(read_random(DS3231_YEAR)); //有键按下时重赋值,以更新数据 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 (); //用显示函数替代延时函数 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 (); } /*************************************************************************************************************/ |
楼主飞线好厉害啊!太牛了,能分享一下源程序吗? |