量子工业 发表于 2023-6-15 08:10 用DS3231时间更准确 |
niehaitao 发表于 2023-6-2 16:09 会不会用个外置更好的晶振,能让时间更准确一些呢? |
怎我用Kill5编译不过去呀? |
很棒我觉得非常的好 |
niehaitao 发表于 2023-6-2 16:09 非常感谢大佬,太感谢了,既然您的运行正常,那肯定是我连错线了,我用您的程序再试试,再次感谢您 |
有一些注释是我按自己的理解加进去的,不一定正确,看看就好,还有我这里用的是3231时钟模块,也有用1302的,区别就在包含的头文件不一样,我看你还打了版,我就是直接连线,字库也改了一些,能力有限,估计还有一些不合理的地方自己都没发现 |
按我的引脚连接后就是这样正常显示的,所有功能都正常 |
51hei图片_20230602153623.jpg (107.71 KB, 下载次数: 124)
#ifndef __18B20_H #define __18B20_H #include<reg51.h> //51系列单片机头文件 #include<intrins.h> sbit DQ=P2^1; //温度探测口 unsigned char a,b,t_b,t_s,t_g,t_x,f_b,f_s,f_g,f_x; //DS18B20用变量 unsigned char temp_flag=1; //温度正负标志 const unsigned char tabl3[]={0x00,0x01,0x01,0x02,0x03,0x03,0x04,0x04,0x05,0x06,0x06,0x07,0x08,0x08,0x09,0x09}; //******************DS18B20温度测试部分***************** //50微秒延时基准程序 void delay_50us(unsigned int t) { unsigned char j; for(;t>0;t--) { for(j=19;j>0;j--); } } //8微秒延时基准程序 void delay_8us(unsigned int t) { while(--t); } //3微秒延时程序 void delay_3us() { ; ; } void DS18B20_Init(void) // 函数功能:DS18B20初始化 { rest:delay_3us(); //稍做延时 delay_3us(); DQ=1; delay_3us(); DQ=0;// DQ_L; //单片机将dq_ds18b20总线拉低 delay_8us(75);//480us<T<960us//此延时必须精确,600US大于480US(12MHZ)过小不能仿真,过大实物不显示 DQ=1;//拉高总线 释放总线 delay_8us(8); //此延时不需要精确 if(DQ==1) { return; } delay_8us(11); //延时90us if(DQ==1) { return; } else { goto rest; } } //***函数名称:void Ds18b20WriteOneByte(unsigned char dat) //***函数功能:读一个字节 unsigned char Ds18b20ReadOneByte(void) //子程序功能:从DS18B20读一个字节 { unsigned char i=0; unsigned char byte=0; for(i=0;i<8;i++) { byte>>=1; DQ=0;// DQ_L; delay_3us(); DQ=1; delay_3us(); delay_3us(); if(DQ==1) byte|=0x80; delay_50us(1); //延时40us } return(byte); } //***函数名称:void Ds18b20WriteOneByte(unsigned char dat) //***函数功能:写一个字节 void Ds18b20WriteOneByte(unsigned char dat) //子程序功能:向DS18B20写一字节的数据 { unsigned char i=0; for(i=0;i<8;i++) { DQ=0;//拉低总线 delay_3us();//至少维持1US,表示写时序(包括写0时序或写1时序)开始 if (dat & 0x01) DQ=1; //DQ = 1 delay_50us(1); //延时50us 以上 dat>>=1; DQ=1; ///写完后必须释放总线 } delay_50us(1); } //***函数名称:void GetTemp(void) //***函数功能:读取温度函数 void GetTemp(void) //读取温度函数 { unsigned char temp; //定义温度变量 DS18B20_Init(); //复位 Ds18b20WriteOneByte(0xcc); //跳过读序列号的操作 Ds18b20WriteOneByte(0x44); //开启温度转换 delay_8us(2); //延时 DS18B20_Init(); //复位 Ds18b20WriteOneByte(0xcc); //跳过读序列号的操作 Ds18b20WriteOneByte(0xbe); //读取温度寄存器等(共可读9个寄存器) 前两个就是温度 a=Ds18b20ReadOneByte(); //读取高速暂存字节0,温度低8位 b=Ds18b20ReadOneByte(); //读取高速暂存字节1,温度高8位 if((b&0xf8))//判断温度的正负性把读取到的温度值高8位跟11111000做与运算判断温度正负,若高5位全部为1即为负否则为正 { temp_flag=0; //给出温度为负的标志 f_x=tabl3[a & 0x0f]; //计算温度的小数 temp=b<<4; temp+=(a&0xf0)>>4; temp=~temp+1; f_b=temp/100%10; //计算温度的百位数据 f_s=temp/10%10; //计算温度的十位数据 f_g=temp%10; //计算温度的个位数据 } else //温度为正数 { t_x=tabl3[a & 0x0f]; //计算温度的小数 temp=b & 0x0f; temp<<=4; a>>=4; temp=temp| a; t_b=(temp)/100%10; //计算温度的百位数据 -2是18B20个体补偿 t_s=(temp)/10%10; //计算温度的十位数据 t_g=(temp)%10; //计算温度的个位数据 temp_flag=1; //给出温度为正数的标志 } } #endif |
#ifndef __ziku_H #define __ziku_H #include<reg51.h> //51系列单片机头文件 #include<intrins.h> unsigned char code hz[]=/*-- 楷体_GB231212; 此字体下对应的点阵为:宽x高=16x16 --*/ { /*0x00,0x40,0x40,0x40,0x40,0x40,0x40,0xFE,0xFE,0x20,0x20,0x20,0x20,0x20,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x3F,0x00,0x00,0x00,0x00,0x00,0x00,/*--十--0*/ /*0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xC0,0x40,0x40,0x40,0xC0,0xC0,0x80, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*--一--1*/ /*0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x18,0x18,0x08,0x08,0x08,0x08,0x00,0x00,0x00, 0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x0C,0x04,0x04,0x04,0x04,0x04,0x06,0x06,0x06,/*--二--2*/ /*0x00,0x00,0x00,0x00,0x10,0x10,0x10,0x98,0x88,0x88,0x88,0x08,0x00,0x00,0x00,0x00, 0x00,0x00,0x10,0x10,0x10,0x11,0x11,0x11,0x19,0x08,0x08,0x08,0x08,0x08,0x08,0x08,/*--三--3*/ /*0x00,0x70,0xF0,0x90,0x10,0xF0,0xF0,0x10,0xF8,0xF8,0x88,0x88,0xF8,0xF8,0x00,0x00, 0x00,0x00,0x00,0x07,0x07,0x05,0x05,0x04,0x04,0x04,0x04,0x04,0x0C,0x0F,0x07,0x00,/*--四--4*/ /*0x00,0x00,0x00,0x80,0x88,0x88,0xF8,0x7C,0x44,0x44,0xC4,0xC4,0x00,0x00,0x00,0x00, 0x00,0x10,0x10,0x10,0x10,0x18,0x1F,0x0F,0x08,0x08,0x0F,0x0F,0x08,0x08,0x08,0x08,/*--五--5*/ /*0x00,0x40,0x40,0x40,0x40,0x40,0x44,0x4C,0x68,0x20,0x20,0x20,0x20,0x20,0x20,0x00, 0x00,0x00,0x10,0x10,0x18,0x0C,0x06,0x02,0x00,0x01,0x03,0x06,0x1C,0x18,0x00,0x00,/*--六--6*/ /*0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xFE,0x80,0xC0,0x40,0x60,0x20,0x20,0x20,0x00, 0x00,0x02,0x02,0x02,0x02,0x03,0x01,0x0F,0x1F,0x10,0x10,0x10,0x10,0x1C,0x1C,0x00,/*--七--7*/ /*0x00,0x00,0x00,0x00,0xC0,0xC4,0x0C,0x38,0x70,0xC0,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x08,0x0C,0x06,0x03,0x01,0x00,0x00,0x00,0x00,0x00,0x01,0x07,0x0E,0x0C,0x08,/*--八--8*/ /*0x00,0x40,0x40,0x40,0x40,0xC0,0xFE,0x3E,0x20,0xE0,0xE0,0x00,0x00,0x00,0x00,0x00, 0x00,0x20,0x20,0x30,0x18,0x0E,0x07,0x01,0x00,0x1F,0x3F,0x20,0x20,0x20,0x20,0x3C,/*--九--9*/ /*0x00,0x20,0x20,0xA0,0xF0,0xF2,0xB6,0x84,0x20,0x20,0xE0,0xF0,0x10,0xF0,0xF0,0x00, 0x00,0x04,0x06,0x03,0x01,0x3F,0x3F,0x13,0x1A,0x0C,0x07,0x0B,0x18,0x18,0x1F,0x07,/*--初--10*/ /*0x80,0x80,0x80,0x80,0xB8,0xF8,0xC0,0x40,0x40,0xC0,0xFE,0x3E,0x20,0x20,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x1F,0x1F,0x08,0x08,0x0F,0x0F,0x08,0x00,0x00,0x00,/*--廿--11*/ /*0x00,0x00,0x00,0x1C,0x7C,0x76,0xD3,0xEB,0xAA,0xBA,0xBE,0x0E,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x30,0x3F,0x1F,0x15,0x3F,0x3F,0x1A,0x0B,0x0F,0x1C,0x30,0x78,0x78,/*--鼠--12*/ /*0x00,0x00,0x00,0x40,0x78,0x38,0x10,0xFF,0xFF,0x88,0x88,0x88,0x88,0x80,0x80,0x00, 0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,/*--牛--13*/ /*0x00,0x00,0x00,0xF0,0xF0,0x50,0x50,0xFF,0xFF,0xAA,0xAA,0xDA,0xD8,0x08,0x00,0x00, 0x00,0x40,0x60,0x38,0x5F,0x47,0x60,0x3C,0x1E,0x02,0x3E,0x7E,0x40,0x40,0x40,0x78,/*--虎--14*/ /*0x00,0x00,0x00,0xF0,0xF8,0x2C,0xE7,0xF7,0xBC,0xDC,0xF4,0x30,0x00,0x00,0x00,0x00, 0x00,0x00,0x20,0x20,0x31,0x19,0x0F,0x07,0x1F,0x3F,0x22,0x26,0x24,0x20,0x20,0x3C,/*--兔--15*/ /*0x00,0x00,0x20,0x20,0x20,0xE0,0xFE,0xDE,0xD0,0x10,0x12,0xD6,0xC4,0x00,0x00,0x00, 0x00,0x20,0x30,0x18,0x0C,0x07,0x13,0x18,0x1F,0x3F,0x26,0x23,0x21,0x20,0x20,0x3C,/*--龙--16*/ /*0x00,0xE0,0xE0,0xFC,0xFC,0xF0,0xF0,0x60,0x60,0xA2,0xB6,0x14,0x90,0xB0,0x30,0x00, 0x00,0x08,0x09,0x09,0x0F,0x07,0x06,0x06,0x04,0x00,0x1F,0x3F,0x23,0x21,0x20,0x3C,/*--蛇--17*/ /*0x00,0x00,0x00,0x00,0x84,0xF4,0x74,0x86,0xE2,0xFE,0x9E,0x80,0x80,0x80,0x00,0x00, 0x00,0x00,0x08,0x08,0x08,0x09,0x0D,0x05,0x05,0x04,0x24,0x64,0x60,0x3F,0x1F,0x00,/*--马--18*/ /*0x00,0x00,0x00,0x00,0x10,0x52,0x56,0xFC,0xFC,0x2F,0x2B,0x09,0x00,0x00,0x00,0x00, 0x00,0x00,0x02,0x02,0x02,0x02,0x02,0x02,0x7F,0x7F,0x01,0x01,0x01,0x01,0x01,0x01,/*--羊--19*/ /*0x00,0x44,0x6C,0xF8,0xFC,0x6C,0xF8,0xFE,0xE6,0xE8,0xBC,0xDC,0x5C,0x50,0x10,0x00, 0x00,0x04,0x16,0x33,0x3F,0x1F,0x00,0x3F,0x3F,0x33,0x1A,0x0F,0x0F,0x19,0x31,0x21,/*--猴--20*/ /*0x00,0x50,0xD0,0x98,0xC8,0xF8,0x38,0xF8,0xF8,0x2F,0x67,0x7C,0x7C,0x00,0x00,0x00, 0x00,0x08,0x0C,0x06,0x03,0x13,0x16,0x14,0x13,0x1B,0x0A,0x0B,0x49,0x49,0x7F,0x3F,/*--鸡--21*/ /*0x00,0x40,0x44,0x6C,0xB8,0xFE,0xEE,0x60,0xB8,0x9E,0x96,0x10,0x10,0xF0,0xF0,0x00, 0x00,0x04,0x04,0x06,0x13,0x31,0x3F,0x1F,0x03,0x03,0x03,0x13,0x30,0x30,0x1F,0x0F,/*--狗--22*/ /*0x00,0x44,0x6C,0xB8,0xFC,0xEC,0x40,0x50,0xFE,0xFE,0x68,0x30,0x38,0x28,0x20,0x20, 0x00,0x04,0x06,0x13,0x31,0x3F,0x1F,0x06,0x3F,0x3F,0x15,0x15,0x3F,0x3F,0x00,0x00,/*--猪--23*/ /*0x00,0x00,0x00,0x10,0xF8,0xEC,0x27,0x27,0xFC,0xFE,0x12,0x12,0x10,0x00,0x00,0x00, 0x00,0x02,0x02,0x02,0x02,0x03,0x01,0x01,0x01,0x7F,0x7F,0x01,0x01,0x01,0x01,0x01,/*--年--24*/ /*0x00,0x00,0x00,0x00,0x00,0xFC,0xFC,0xB6,0x92,0x92,0xFE,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x40,0x60,0x30,0x1C,0x0F,0x03,0x01,0x10,0x30,0x3F,0x1F,0x00,0x00,0x00,/*--月--25*/ /*0x00,0x00,0x00,0x00,0xF8,0xF8,0x88,0xCC,0x44,0x44,0xFC,0xFC,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0C,0x04,0x04,0x0C,0x0F,0x0F,0x00,0x00,0x00,/*--日--26*/ /*0x00,0x00,0x00,0xFC,0xFC,0xA4,0xA4,0xFE,0x7A,0x52,0x52,0x42,0xFE,0xFE,0x00,0x00, 0x00,0x40,0x60,0x38,0x1F,0x07,0x06,0x0E,0x0B,0x09,0x0F,0x27,0x60,0x7F,0x3F,0x00,/*--周--27*/ //* (16 X 16 , 宋体, 加粗 ) /* 0x00,0x40,0x40,0x40,0x40,0x40,0x40,0xFE,0xFE,0x40,0x40,0x40,0x40,0x40,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"十",0 0x00,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//"一",1 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00, 0x00,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,//"二",2 0x00,0x00,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x00, 0x00,0x40,0x40,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x40,0x40,0x00,//"三",3 0x00,0x00,0xFC,0xFC,0x04,0x04,0xFC,0xFC,0x04,0xFC,0xFC,0x04,0x04,0xFC,0xFC,0x00, 0x00,0x00,0x7F,0x7F,0x28,0x2C,0x27,0x23,0x20,0x23,0x27,0x24,0x24,0x7F,0x7F,0x00,//"四",4 0x00,0x00,0x84,0x84,0x84,0x84,0xFC,0xFC,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00, 0x00,0x40,0x40,0x40,0x78,0x7F,0x47,0x40,0x40,0x40,0x40,0x7F,0x7F,0x40,0x40,0x00,//"五",5 0x00,0x20,0x20,0x20,0x20,0x20,0x22,0x26,0x3C,0x38,0x20,0x20,0x20,0x20,0x20,0x00, 0x00,0x40,0x60,0x30,0x1C,0x0F,0x03,0x00,0x00,0x01,0x03,0x06,0x1C,0x78,0x60,0x00,//"六",6 0x00,0x80,0x80,0x80,0x80,0x80,0xFE,0xFE,0x40,0x40,0x60,0x20,0x20,0x20,0x20,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x7F,0x40,0x40,0x40,0x40,0x40,0x70,0x70,0x00,//"七",7 0x00,0x00,0x00,0x00,0x00,0xF8,0xF8,0x00,0x00,0x7E,0xFE,0x80,0x00,0x00,0x00,0x00, 0x00,0x40,0x60,0x38,0x1F,0x07,0x00,0x00,0x00,0x00,0x07,0x1F,0x38,0x60,0x40,0x00,//"八",8 0x00,0x00,0x10,0x10,0x10,0xFE,0xFE,0x10,0x10,0x10,0xF0,0xF0,0x00,0x00,0x00,0x00, 0x00,0x40,0x60,0x30,0x1C,0x0F,0x03,0x00,0x00,0x00,0x3F,0x7F,0x40,0x70,0x70,0x00,//"九",9 0x00,0x10,0x12,0xD6,0xF4,0xB0,0x90,0x08,0x08,0xF8,0xF8,0x08,0x08,0xF8,0xF8,0x00, 0x00,0x02,0x03,0x7F,0x7F,0x47,0x66,0x30,0x1C,0x0F,0x03,0x40,0x40,0x7F,0x3F,0x00,//"初",10 0x00,0x10,0x10,0xFE,0xFE,0x10,0x10,0x10,0x10,0x10,0x10,0xFE,0xFE,0x10,0x10,0x00, 0x00,0x00,0x00,0x7F,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x7F,0x00,0x00,0x00,//"廿",11 0x01,0x00,0x7C,0x54,0x54,0x52,0x50,0x40,0x50,0x54,0x54,0x54,0x7C,0x00,0x00,0x01, 0x80,0x00,0x7F,0x24,0x09,0x02,0x7F,0x20,0x09,0x12,0x00,0x1F,0x20,0x78,0x00,0x80,//鼠",12 0x01,0x80,0x60,0x1C,0x10,0x10,0x10,0xFE,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x01, 0x80,0x02,0x02,0x02,0x02,0x02,0x02,0x7F,0x02,0x02,0x02,0x02,0x02,0x02,0x00,0x80,//牛",13 0x01,0x00,0x00,0xF0,0x10,0x90,0x90,0xFE,0x54,0x54,0x54,0x14,0x90,0x30,0x00,0x01, 0x80,0x40,0x30,0x0F,0x40,0x20,0x1C,0x04,0x05,0x05,0x3D,0x41,0x41,0x60,0x00,0x80,//"虎",14 0x01,0x20,0xD0,0x48,0x4E,0x48,0x48,0xC8,0x48,0x68,0x58,0x40,0xC0,0x00,0x00,0x01, 0x80,0x40,0x43,0x22,0x12,0x0A,0x06,0x03,0x3E,0x42,0x4A,0x52,0x43,0x70,0x00,0x80,//"免",15 0x01,0x20,0x20,0x20,0x20,0xA0,0x7E,0x20,0xE0,0x24,0x28,0x20,0xA0,0x20,0x00,0x01, 0x80,0x40,0x20,0x10,0x0C,0x23,0x20,0x10,0x3F,0x44,0x42,0x41,0x40,0x70,0x00,0x80,//"龙",16 0x01,0xF0,0x10,0xFE,0x10,0xF0,0x00,0x18,0xC8,0x0A,0x0C,0x08,0x08,0x98,0x00,0x01, 0x80,0x23,0x22,0x3F,0x12,0x1B,0x30,0x00,0x3F,0x42,0x42,0x41,0x41,0x70,0x00,0x80,//"蛇",17 0x01,0x00,0x02,0xFA,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x80,0x80,0x80,0x00,0x01, 0x80,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x40,0x40,0x3F,0x00,0x80,//"马",18 0x01,0x00,0x10,0x90,0x92,0x9C,0x90,0xF0,0x90,0x98,0x96,0x90,0x10,0x00,0x00,0x01, 0x80,0x04,0x04,0x04,0x04,0x04,0x04,0x7F,0x04,0x04,0x04,0x04,0x04,0x04,0x00,0x80,//"羊",19 0x01,0x44,0x28,0x10,0xEE,0x40,0x20,0xF8,0x06,0x20,0xE4,0xA4,0xBC,0xA0,0x00,0x01, 0x80,0x04,0x42,0x41,0x3F,0x00,0x00,0x7F,0x00,0x45,0x34,0x0F,0x34,0x44,0x00,0x80,//"猴",20 0x01,0x00,0x48,0x88,0x08,0xC8,0x38,0x00,0xF8,0x0C,0xAA,0x88,0xF8,0x00,0x00,0x01, 0x80,0x20,0x10,0x0C,0x03,0x06,0x18,0x00,0x0B,0x0A,0x0A,0x4A,0x42,0x3E,0x00,0x80,//"鸡",21 0x01,0x44,0x28,0x10,0xEE,0x00,0x20,0xD0,0x4E,0x48,0xC8,0x08,0x08,0xF8,0x00,0x01, 0x80,0x04,0x42,0x41,0x3F,0x00,0x00,0x1F,0x08,0x08,0x0F,0x40,0x40,0x3F,0x00,0x80,//"狗",22 0x01,0x44,0x28,0x10,0xEE,0x00,0x48,0x48,0xC8,0x7E,0x68,0x50,0x4C,0x40,0x00,0x01, 0x80,0x04,0x42,0x41,0x3F,0x04,0x02,0x7F,0x2A,0x2A,0x2A,0x2A,0x7E,0x00,0x00,0x80,//"猪",23 0x00,0x40,0x60,0x30,0xDE,0xCE,0x48,0x48,0xF8,0xF8,0x48,0x48,0x48,0x08,0x00,0x00, 0x00,0x04,0x04,0x04,0x07,0x07,0x04,0x04,0x7F,0x7F,0x04,0x04,0x04,0x04,0x04,0x00,//"年",24 0x00,0x00,0x00,0x00,0xFE,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0xFE,0x00,0x00, 0x00,0x00,0x40,0x70,0x3F,0x0F,0x02,0x02,0x02,0x02,0x42,0x42,0x7F,0x7F,0x00,0x00,//"月",25 0x00,0x00,0xFE,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0xFE,0x00,0x00, 0x00,0x00,0x7F,0x7F,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x7F,0x7F,0x00,0x00,//"日",26 0x00,0x00,0x00,0xFE,0xFE,0x82,0x92,0x92,0xFE,0xFE,0x92,0x92,0x82,0xFE,0xFE,0x00, 0x00,0x40,0x70,0x3F,0x0F,0x00,0x1E,0x1E,0x12,0x12,0x1E,0x5E,0x40,0x7F,0x7F,0x00,//"周",27 0x00,0x0C,0x12,0x12,0xCC,0xE0,0x30,0x10,0x10,0x10,0x30,0x60,0xF0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0F,0x1F,0x30,0x60,0x40,0x40,0x40,0x20,0x10,0x00,0x00,0x00,//℃",28 0x00,0x00,0x40,0x60,0x30,0x3E,0x6E,0xC8,0xC8,0x68,0x38,0x18,0x00,0x00,0x00,0x00, 0x00,0x04,0x04,0x06,0x12,0x13,0x15,0x35,0x2D,0x69,0x4B,0x02,0x06,0x04,0x04,0x00,//冬",29 0x00,0x00,0xFC,0xFC,0x44,0xFC,0xFC,0x48,0x7E,0x7E,0x48,0x7E,0x7E,0x48,0x40,0x00, 0x00,0x40,0x7F,0x3F,0x42,0x7F,0x7F,0x7F,0x7F,0x49,0x49,0x49,0x7F,0x7F,0x00,0x00,//"腊",30 */ //* (16 X 16 , 宋体 )共阴/列行式/点阵16*索引16/逆向/16进制/像素8/C51格式*/ 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"十",0*/ 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/*"一",1*/ 0x00,0x00,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,0x00,0x00, 0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x10,0x00,/*"二",2*/ 0x00,0x04,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x84,0x04,0x00,0x00, 0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x20,0x00,/*"三",3*/ 0x00,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00, 0x00,0x7F,0x28,0x24,0x23,0x20,0x20,0x20,0x20,0x21,0x22,0x22,0x22,0x7F,0x00,0x00,/*"四",4*/ 0x00,0x02,0x42,0x42,0x42,0xC2,0x7E,0x42,0x42,0x42,0x42,0xC2,0x02,0x02,0x00,0x00, 0x40,0x40,0x40,0x40,0x78,0x47,0x40,0x40,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x00,/*"五",5*/ 0x20,0x20,0x20,0x20,0x20,0x20,0x21,0x22,0x2C,0x20,0x20,0x20,0x20,0x20,0x20,0x00, 0x00,0x40,0x20,0x10,0x0C,0x03,0x00,0x00,0x00,0x01,0x02,0x04,0x18,0x60,0x00,0x00,/*"六",6*/ 0x80,0x80,0x80,0x80,0x80,0x40,0xFF,0x40,0x40,0x40,0x20,0x20,0x20,0x20,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x40,0x40,0x40,0x78,0x00,0x00,/*"七",7*/ 0x00,0x00,0x00,0x00,0x00,0xFC,0x00,0x00,0x00,0x7E,0x80,0x00,0x00,0x00,0x00,0x00, 0x00,0x80,0x60,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x03,0x0C,0x30,0x40,0x80,0x00,/*"八",8*/ 0x00,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0xF0,0x00,0x00,0x00,0x00,0x00, 0x80,0x40,0x20,0x18,0x07,0x00,0x00,0x00,0x00,0x00,0x3F,0x40,0x40,0x40,0x78,0x00,/*"九",9*/ 0x08,0x08,0x89,0xEA,0x18,0x88,0x00,0x04,0x04,0xFC,0x04,0x04,0x04,0xFC,0x00,0x00, 0x02,0x01,0x00,0xFF,0x01,0x86,0x40,0x20,0x18,0x07,0x40,0x80,0x40,0x3F,0x00,0x00,/*"初",10*/ 0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x20,0x20,0x20,0xFF,0x20,0x20,0x20,0x00, 0x00,0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,/*"廿",11*/ 0x00,0x00,0x7E,0x4A,0x4A,0x49,0x40,0x40,0x40,0x4A,0x4A,0x4A,0x7E,0x00,0x00,0x00, 0x00,0x00,0xFF,0x80,0x49,0x12,0x00,0xFF,0x80,0x49,0x12,0x00,0x3F,0x40,0xF0,0x00,/*"鼠",12*/ 0x00,0x40,0x20,0x1E,0x10,0x10,0x10,0xFF,0x10,0x10,0x10,0x10,0x10,0x00,0x00,0x00, 0x02,0x02,0x02,0x02,0x02,0x02,0x02,0xFF,0x02,0x02,0x02,0x02,0x02,0x02,0x02,0x00,/*"牛",13*/ 0x00,0x00,0xF8,0x08,0x48,0x48,0x48,0xFF,0x4A,0x2A,0x2A,0x0A,0xCA,0x18,0x00,0x00, 0x80,0x60,0x1F,0x80,0x40,0x20,0x1C,0x04,0x05,0x05,0x7D,0x81,0x81,0xE0,0x00,0x00,/*"虎",14*/ 0x40,0x20,0xF0,0x28,0x27,0x24,0x24,0xE4,0x24,0x34,0x2C,0x20,0xE0,0x00,0x00,0x00, 0x80,0x80,0x47,0x22,0x12,0x0A,0x06,0x03,0x7E,0x82,0x8A,0xB2,0x87,0x80,0xE0,0x00,/*"兔",15*/ 0x10,0x10,0x10,0x10,0x10,0xFF,0x10,0x10,0xF0,0x10,0x11,0x16,0xD0,0x10,0x10,0x00, 0x80,0x40,0x20,0x18,0x06,0x41,0x20,0x10,0x3F,0x44,0x42,0x41,0x40,0x40,0x78,0x00,/*"龙",16*/ 0x00,0xF8,0x08,0xFF,0x08,0xF8,0x20,0x18,0xC8,0x08,0x09,0x0E,0x88,0x28,0x18,0x00, 0x20,0x63,0x21,0x1F,0x11,0x19,0x30,0x00,0x3F,0x44,0x42,0x41,0x40,0x40,0x78,0x00,/*"蛇",17*/ 0x00,0x02,0x02,0xF2,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x80,0x80,0x80,0x00,0x00, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x48,0x80,0x40,0x3F,0x00,0x00,/*"马",18*/ 0x00,0x08,0x88,0x88,0x89,0x8E,0x88,0xF8,0x88,0x8C,0x8B,0x88,0x88,0x08,0x00,0x00, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0xFF,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x00,/*"羊",19*/ 0x22,0x14,0x08,0xF4,0x42,0x20,0xF8,0x07,0x10,0xF2,0x92,0x92,0x9E,0x90,0x10,0x00, 0x44,0x82,0x41,0x3F,0x00,0x00,0xFF,0x00,0x85,0x44,0x34,0x0F,0x34,0x44,0x84,0x00,/*"猴",20*/ 0x08,0x48,0x88,0x08,0xC8,0x38,0x00,0x00,0xFC,0x06,0x15,0x44,0x84,0x7C,0x00,0x00, 0x20,0x10,0x0C,0x03,0x04,0x18,0x00,0x10,0x13,0x12,0x12,0x52,0x92,0x42,0x3E,0x00,/*"鸡",21*/ 0x40,0x22,0x14,0x08,0xF4,0x22,0x10,0xCC,0x4B,0x48,0xC8,0x08,0x08,0xF8,0x00,0x00, 0x08,0x44,0x82,0x41,0x3F,0x00,0x00,0x0F,0x04,0x04,0x4F,0x80,0x40,0x3F,0x00,0x00,/*"狗",22*/ 0x22,0x14,0x08,0xF4,0x02,0x20,0x24,0x24,0xA4,0x7F,0x24,0x34,0x28,0x26,0x20,0x00, 0x44,0x82,0x41,0x3F,0x00,0x04,0x02,0xFF,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,0x00,/*"猪",23*/ 0x00,0x20,0x18,0xC7,0x44,0x44,0x44,0x44,0xFC,0x44,0x44,0x44,0x44,0x04,0x00,0x00, 0x04,0x04,0x04,0x07,0x04,0x04,0x04,0x04,0xFF,0x04,0x04,0x04,0x04,0x04,0x04,0x00,/*"年",24*/ 0x00,0x00,0x00,0xFE,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0x22,0xFE,0x00,0x00,0x00, 0x80,0x40,0x30,0x0F,0x02,0x02,0x02,0x02,0x02,0x02,0x42,0x82,0x7F,0x00,0x00,0x00,/*"月",25*/ 0x00,0x00,0x00,0xFE,0x82,0x82,0x82,0x82,0x82,0x82,0x82,0xFE,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0xFF,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0xFF,0x00,0x00,0x00,0x00,/*"日",26*/ 0x00,0x00,0xFE,0x82,0x92,0x92,0x92,0xFE,0x92,0x92,0x92,0x82,0xFE,0x00,0x00,0x00, 0x80,0x60,0x1F,0x00,0x00,0x1E,0x12,0x12,0x12,0x1E,0x40,0x80,0x7F,0x00,0x00,0x00,/*"周",27*/ 0x00,0x0C,0x12,0x12,0xCC,0xE0,0x30,0x10,0x10,0x10,0x30,0x60,0xF0,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x0F,0x1F,0x30,0x60,0x40,0x40,0x40,0x20,0x10,0x00,0x00,0x00,/*℃",28*/ 0x00,0x20,0x10,0x08,0x94,0xA7,0x44,0x44,0x44,0xA4,0x94,0x0C,0x00,0x00,0x00,0x00, 0x02,0x02,0x01,0x01,0x20,0x24,0x24,0x44,0x48,0x88,0x10,0x01,0x01,0x02,0x02,0x00,/*"冬",29*/ 0x00,0xFE,0x22,0x22,0xFE,0x40,0x48,0x48,0x7F,0x48,0x48,0x48,0x7F,0x48,0x48,0x00, 0x80,0x7F,0x02,0x82,0xFF,0x00,0x00,0xFF,0x49,0x49,0x49,0x49,0x49,0xFF,0x00,0x00,/*"腊",30*/ //* (16 X 16 , 宋体 ) 0x00,0x20,0x22,0xEC,0x00,0x00,0xFC,0x84,0xA4,0xFC,0xA4,0xA4,0x84,0xFC,0x00,0x00, 0x00,0x00,0x00,0x1F,0x08,0x44,0x3F,0x00,0x1E,0x12,0x12,0x5E,0x40,0x7F,0x00,0x00,//"调",31 0x00,0x04,0x74,0xD4,0xFE,0xD4,0x74,0x24,0x10,0xAE,0x48,0xA8,0x18,0x08,0x00,0x00, 0x00,0x42,0x45,0x44,0x77,0x44,0x45,0x7C,0x55,0x54,0x54,0x54,0x45,0x41,0x00,0x00,//整",32 0x00,0x00,0xF2,0x04,0x20,0x24,0x2C,0xF4,0x24,0x24,0x24,0x24,0x04,0xFC,0x00,0x00, 0x00,0x00,0x7F,0x00,0x1F,0x01,0x01,0x7F,0x01,0x11,0x11,0x5F,0x40,0x7F,0x00,0x00,//"闹",33 0x00,0x20,0x50,0xCE,0x48,0x48,0x00,0xF0,0x10,0x10,0xFE,0x10,0x10,0xF0,0x00,0x00, 0x00,0x02,0x02,0x7F,0x22,0x12,0x00,0x07,0x02,0x02,0x7F,0x02,0x02,0x07,0x00,0x00,//"钟",34 0x00,0xF8,0x88,0x88,0xF8,0x00,0x10,0x90,0x10,0x10,0x10,0xFE,0x10,0x10,0x00,0x00, 0x00,0x1F,0x08,0x08,0x1F,0x00,0x00,0x00,0x03,0x40,0x40,0x7F,0x00,0x00,0x00,0x00,//"时",35 0x00,0x80,0x40,0xA0,0x98,0x86,0x80,0x80,0x80,0x86,0x98,0x20,0x40,0x80,0x00,0x00, 0x00,0x40,0x20,0x10,0x08,0x07,0x00,0x00,0x40,0x40,0x3F,0x00,0x00,0x00,0x00,0x00,//"分",36 0x00,0x1C,0x86,0x62,0x12,0x10,0x08,0xE8,0x08,0x08,0x10,0x12,0x62,0x86,0x1C,0x00, 0x00,0x00,0x43,0x2C,0x10,0x10,0x20,0x21,0x21,0x21,0x11,0x11,0x2C,0x43,0x00,0x00,//闹钟,37 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,//空,38 // 0x00,0x00,0x04,0xC4,0xC4,0x04,0x04,0xFC,0xFC,0x04,0x04,0x04,0x04,0x04,0x00,0x00, // 0x00,0x40,0x40,0x7F,0x7F,0x40,0x40,0x7F,0x7F,0x41,0x41,0x41,0x41,0x40,0x40,0x00,//正,39 0x00,0x02,0x02,0xC2,0x02,0x02,0x02,0xFE,0x82,0x82,0x82,0x82,0x82,0x02,0x00,0x00, 0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x7F,0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00,/*"正",39*/ 0x00,0x00,0x00,0x00,0x00,0x00,0xFE,0xA9,0x01,0xFE,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x38,0x7C,0xFF,0xFE,0xFE,0xFF,0x7C,0x38,0x00,0x00,0x00,0x00,//"!"温度图标,40 }; //-----------数字16*32---------------------- unsigned char code dazi[]= /*pyhzbj取模方式:纵向取模,字节倒序*/ { //0 0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00, 0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0xC0,0x30,0x0C,0xFF,0xFF,0xFF,0xFF,0x00, 0x00,0xFF,0xFF,0xFF,0xFF,0x30,0x0C,0x03,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00, 0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00, //1 0x00,0x00,0x00,0x00,0x18,0x18,0x1C,0xFC,0xFE,0xFE,0xFE,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x60,0x60,0x7F,0x7F,0x7F,0x7F,0x60,0x60,0x00,0x00,0x00, //2 0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00, 0x00,0x1F,0x1F,0x1F,0x1F,0x00,0x00,0x00,0x80,0xC0,0xE0,0xFF,0xFF,0xFF,0x7F,0x00, 0x00,0xC0,0xE0,0xF0,0xF8,0xFC,0x7E,0x3F,0x1F,0x0F,0x07,0x03,0x01,0x00,0x00,0x00, 0x00,0x7F,0x7F,0x7F,0x7F,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x78,0x00, //3 0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00, 0x00,0x07,0x07,0x07,0xC7,0xC0,0xC0,0xC0,0xC0,0xC0,0xE0,0xFF,0xFF,0x7F,0x3F,0x00, 0x00,0xE0,0xE0,0xE0,0xE3,0x03,0x03,0x03,0x03,0x03,0x07,0xFF,0xFF,0xFE,0xFC,0x00, 0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00, //4 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xC0,0xE0,0xF0,0xFC,0xFE,0xFE,0x00,0x00,0x00, 0x00,0x00,0x80,0xE0,0xF8,0xFE,0x7F,0x1F,0x07,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00, 0x00,0xFE,0xFF,0xFF,0xFF,0xF1,0xF0,0xF0,0xF0,0xFF,0xFF,0xFF,0xFF,0xF0,0xF0,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00, //5 0x00,0xFE,0xFE,0xFE,0xFE,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x00, 0x00,0xFF,0xFF,0xFF,0xFF,0xF0,0x78,0x78,0x78,0x78,0xF8,0xF8,0xF0,0xE0,0xC0,0x00, 0x00,0xF1,0xF1,0xF1,0xF1,0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00, 0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00, //6 0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00, 0x00,0xFF,0xFF,0xFF,0xFF,0xE0,0xF0,0xF0,0xF0,0xF0,0xF0,0xF1,0xE1,0xC1,0x81,0x00, 0x00,0xFF,0xFF,0xFF,0xFF,0x01,0x00,0x00,0x00,0x00,0x01,0xFF,0xFF,0xFF,0xFF,0x00, 0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00, //7 0x00,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x1E,0x9E,0xFE,0xFE,0xFE,0x7E,0x1E,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0xE0,0xFC,0xFF,0xFF,0x1F,0x03,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x7F,0x7F,0x7F,0x7F,0x00,0x00,0x00,0x00,0x00,0x00, //8 0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00, 0x00,0x1F,0x3F,0xFF,0xFF,0xF0,0xE0,0xE0,0xE0,0xE0,0xF0,0xFF,0xFF,0x3F,0x1F,0x00, 0x00,0xFE,0xFF,0xFF,0xFF,0x03,0x01,0x01,0x01,0x01,0x03,0xFF,0xFF,0xFF,0xFE,0x00, 0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00, //9 0x00,0xF0,0xF8,0xFC,0xFE,0x3E,0x1E,0x1E,0x1E,0x1E,0x3E,0xFE,0xFC,0xF8,0xF0,0x00, 0x00,0xFF,0xFF,0xFF,0xFF,0x80,0x00,0x00,0x00,0x00,0x80,0xFF,0xFF,0xFF,0xFF,0x00, 0x00,0x81,0x83,0x87,0x8F,0x0F,0x0F,0x0F,0x0F,0x0F,0x07,0xFF,0xFF,0xFF,0xFF,0x00, 0x00,0x0F,0x1F,0x3F,0x7F,0x7C,0x78,0x78,0x78,0x78,0x7C,0x7F,0x3F,0x1F,0x0F,0x00, //双方型冒号 10 0x00,0x00,0x00,0x00,0x00,0xC0,0xC0,0xC0,0xC0,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x0F,0x0F,0x0F,0x0F,0x0F,0x0F,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0xF0,0xF0,0xF0,0xF0,0xF0,0xF0,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x03,0x03,0x03,0x03,0x03,0x03,0x00,0x00,0x00,0x00,0x00, //空 11 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00, }; unsigned char code number[]=/*-- 新宋体12; 此字体下对应的点阵为:宽x高=8x16 --*/ { 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x0F,0x10,0x20,0x20,0x10,0x0F,0x00,/*0--0*/ 0x00,0x10,0x10,0xF8,0x00,0x00,0x00,0x00,0x00,0x20,0x20,0x3F,0x20,0x20,0x00,0x00,/*1--1*/ 0x00,0x70,0x08,0x08,0x08,0x88,0x70,0x00,0x00,0x30,0x28,0x24,0x22,0x21,0x30,0x00,/*2--2*/ 0x00,0x30,0x08,0x88,0x88,0x48,0x30,0x00,0x00,0x18,0x20,0x20,0x20,0x11,0x0E,0x00,/*3--3*/ 0x00,0x00,0xC0,0x20,0x10,0xF8,0x00,0x00,0x00,0x07,0x04,0x24,0x24,0x3F,0x24,0x00,/*4--4*/ 0x00,0xF8,0x08,0x88,0x88,0x08,0x08,0x00,0x00,0x19,0x21,0x20,0x20,0x11,0x0E,0x00,/*5--5*/ 0x00,0xE0,0x10,0x88,0x88,0x18,0x00,0x00,0x00,0x0F,0x11,0x20,0x20,0x11,0x0E,0x00,/*6--6*/ 0x00,0x38,0x08,0x08,0xC8,0x38,0x08,0x00,0x00,0x00,0x00,0x3F,0x00,0x00,0x00,0x00,/*7--7*/ 0x00,0x70,0x88,0x08,0x08,0x88,0x70,0x00,0x00,0x1C,0x22,0x21,0x21,0x22,0x1C,0x00,/*8--8*/ 0x00,0xE0,0x10,0x08,0x08,0x10,0xE0,0x00,0x00,0x00,0x31,0x22,0x22,0x11,0x0F,0x00,/*9--9*/ 0x00,0x00,0x00,0xC0,0xC0,0x00,0x00,0x00,0x00,0x00,0x00,0x30,0x30,0x00,0x00,0x00,/*:--10*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x01,0x01,0x01,0x01,0x01,0x01,0x01,0x00,/*---11*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,/* --12*/ 0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x00,0x18,0x18,0x00,0x00,0x00,/*.--13*/ }; #endif |
#ifndef __nongli_H #define __nongli_H #include<reg51.h> //51系列单片机头文件 #include<intrins.h> /********************************************************************************* C51写的公历转农历和星期 ********************************************************************************** 公历是全世界通用的历法以地球绕太阳的一周为一年一年365 天分为12 个月1 3 5 7 8 10 12 月为 31 天2 月为28 天其余月份为30 天事实上地球绕太阳一周共365 天5 小时48 分46 秒比公历一年多出5 小时48 分46 秒为使年误差不累积公历年用闰年法来消除年误差 由于每年多出5 小时48 分46 秒每4 年累计多出23 小时15 分4 秒接近1 天天文学家就规定每4 年有一个闰年把2 月由28 天改为29 天凡是公历年代能被4 整除 的那一年就是闰年但是这样一来每4 年又少了44 分56 秒为了更准确地计时天文学家又规定凡能被100 整除 的年份只有能被400 整除才是闰年即每400 年要减掉3 个闰年经过这样处理后实际上每400 年的误差只有2 小时 53 分20 秒已相当准确了 农历与公历不同农历把月亮绕地球一周作为一月因为月亮绕地球一周不是一整天所以农历把月分为大月和小 月大月30 天小月29 天通过设置大小月使农历日始终与月亮与地球的位置相对应为了使农历的年份与公历年 相对应农历通过设置闰月的办法使它的平均年长度与公历年相等农历是中国传统文化的代表之一并与农业生产联 系密切中国人民特别是广大农民十分熟悉并喜爱农历 公历与农历是我国目前并存的两种历法各有其固有的规律农历与月球的运行相对应其影响因素多它的大小 月和闰月与天体运行有关计算十分复杂且每年都不一致因此要用单片机实现公历与农历的转换用查表法是最方 便实用的办法 51 系列单片机因其在功能上能满足大部份对速度要求不高的应用场合的要求且价格低廉开发工具普及程度高 是目前应用最多的单片机之一本文介绍一种用51 单片机实现从1901 年到2099 年2199 年公历日到农历日及星期 的转换方法并向读者提供完整的51C程序 二 基本原理 实现公历与农历的转换一般采用查表法按日查表是速度最快的方法但51 单片机寻址能力有限不可能采用 按日查表的方法除按日查外我们可以通过按月查表和按年查表的方法再通过适当的计算来确定公历日所对应的 农历日期本文采用的是按年查表法最大限度地减少表格所占的程序空间 对于农历月来说大月为30 天小月为29 天这是固定不变的这样我们就可用1 个BIT 位来表示大小月信 息农历一年如有闰月为13 个月否则是12 个月所以一年需要用13 个BIT 闰月在农历年中所在的月份并不固定 大部分闰月分布在农历2 8 月但也有少量年份在9 月以后所以要表示闰月的信息至少要4BIT 在这里我们用4BIT 的值来表示闰月的月份值为0 表示本年没有闰月有了以上信息还不足以判断公历日对应的农历日因为还需要一 个参照日我们选用农历正月初一所对应的公历日期作参照日公历日最大为31 日需要5BIT 来表示而春节所在的 月份不是1 月就是2 月用1BIT 就够了考虑到表达方便我们用2BIT 来表示春节月2BIT 的值直接表示月份这 样一年的农历信息只用3 个字节就全部包括了 计算公历日对应的农历日期的方法先计算出公历日离当年元旦的天数然后查表取得当年的春节日期计算出春 节离元旦的天数二者相减即可算出公历日离春节的天数以后只要根据大小月和闰月信息减一月天数调整一月农 历月份即可推算出公历日所对应的农历日期如公历日不到春节日期农历年要比公历年小一年农历大小月取前一 年的信息农历月从12 月向前推算 公历日是非常有规律的所以公历日所对应的星期天可以通过计算直接得到理论上公元0 年1 月1 日为星期日 只要求得公历日离公元0 年1 月1 日的日子数除7 后的余数就是星期天为了简化计算采用月校正法根据公历的 年月日可直接计算出星期天其算法是日期年份所过闰年数月校正数之和除7 的余数就是星期天但如果是在 闰年又不到3 月份上述之和要减一天再除7 其1 12 月的校正数据为6 2 2 5 0 3 5 1 4 6 2 4 在 本程序中采用1 个字节表示年份闰年数也只计算1900 年以后的闰年数所以实际校正数据也和上述数据不同 公历年对应的农历数据,每年三字节, 格式第一字节BIT7-4 位表示闰月月份,值为0 为无闰月,BIT3-0 对应农历第1-4 月的大小 第二字节BIT7-0 对应农历第5-12 月大小,第三字节BIT7 表示农历第13 个月大小 月份对应的位为1 表示本农历月大(30 天),为0 表示小(29 天) 第三字节BIT6-5 表示春节的公历月份,BIT4-0 表示春节的公历日期 *************************************************************************************************/ code unsigned char year_code[597]= { 0x04,0xAe,0x53, //1901 0x0A,0x57,0x48, //1902 0x55,0x26,0xBd, //1903 0x0d,0x26,0x50, //1904 0x0d,0x95,0x44, //1905 0x46,0xAA,0xB9, //1906 0x05,0x6A,0x4d, //1907 0x09,0xAd,0x42, //1908 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 0x0C,0x96,0x45, //2000 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 unsigned char day_code1[9]={0x0,0x1f,0x3b,0x5a,0x78,0x97,0xb5,0xd4,0xf3};//月份数据表 code unsigned int day_code2[3]={0x111,0x130,0x14e}; bit c_moon; data unsigned char year_moon,month_moon,day_moon; /*************************************************************************************** * 函数名称 :get_moon_day * 功能描述 :用于读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0 * 参数 : ***************************************************************************************/ bit get_moon_day(unsigned char month_p,unsigned int table_addr) //读取数据表中农历月的大月或小月,如果该月为大返回1,为小返回0 { unsigned char temp; switch (month_p) { case 1:{temp=year_code[table_addr]&0x08; if (temp==0)return(0);else return(1); break;} case 2:{temp=year_code[table_addr]&0x04; if (temp==0)return(0);else return(1); break;} case 3:{temp=year_code[table_addr]&0x02; if (temp==0)return(0);else return(1); break;} case 4:{temp=year_code[table_addr]&0x01; if (temp==0)return(0);else return(1); break;} case 5:{temp=year_code[table_addr+1]&0x80; if (temp==0)return(0);else return(1); break;} case 6:{temp=year_code[table_addr+1]&0x40; if (temp==0)return(0);else return(1); break;} case 7:{temp=year_code[table_addr+1]&0x20; if (temp==0)return(0);else return(1); break;} case 8:{temp=year_code[table_addr+1]&0x10; if (temp==0)return(0);else return(1); break;} case 9:{temp=year_code[table_addr+1]&0x08; if (temp==0)return(0);else return(1); break;} case 10:{temp=year_code[table_addr+1]&0x04; if (temp==0)return(0);else return(1); break;} case 11:{temp=year_code[table_addr+1]&0x02; if (temp==0)return(0);else return(1); break;} case 12:{temp=year_code[table_addr+1]&0x01; if (temp==0)return(0);else return(1); break;} case 13:{temp=year_code[table_addr+2]&0x80; if (temp==0)return(0);else return(1); break;} default: break; } } /************************************************************************************* * 函数名称 :Conversion * 功能描述 :输入阳历数据,输出阴历数据(只允许1901-2099年) * 参数 :参数名称 ****************************************************************************************/ void Conversion(bit c,char year,char month,char day) //输入阳历数据,输出阴历数据(只允许1901-2099年) { //c=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据 //输入输出都是10进制参数 unsigned char temp1,temp2,temp3,month_p; unsigned int temp4,table_addr; bit flag2,flag_y; //定位数据表地址 if(c==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)&&(year!=0)) temp4+=1; //如果公历月大于2月并且该年的2月为闰月,天数加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;c=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=c; //原程序这里又把这得出的值变回BCD码。但根据我后面的程序,我不需要。 //后面用来显示的农历信息的程序分别是disp_t3()和disp_t4() year_moon=year; month_moon=month; day_moon=day; } /****************************************************************************************** * 函数名称 :Conver_week * 功能描述 :输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年) * 参数 : 参数名称: 输入/输出? 类型 描述 * 算法:日期+年份+所过闰年数+月较正数之和除7 的余数就是星期,但如果是在 闰年又不到3 月份上述之和要减一天再除7星期数。余数为0时,为星期天。 ******************************************************************************************/ bit century; //世纪位标志,0为20世纪,1为19世纪 code unsigned char table_week[12]={0,3,3,6,1,4,6,2,5,0,3,5}; //月修正数据表 void Conver_week() //输入BCD阳历数据,输出BCD星期数据(只允许1901-2099年) {//century=0 为21世纪,c=1 为19世纪 输入输出数据均为BCD数据 unsigned char temp1,temp2; temp1=year; if (century==0){temp1=temp1+100;} //如果为21世纪,年份数加100 temp2=temp1/4; //所过闰年数只算1900年之后的 temp2=temp1+temp2; temp2=temp2%7; //为节省资源,先进行一次取余,避免数大于255 temp2=temp2+day+table_week[month-1]; if (year%0x4==0&&month<3)temp2-=1; week=temp2%7; } #endif |
#ifndef __DS3231_H__ #define __DS3231_H__ #define uchar unsigned char #define uint unsigned int #include <intrins.h> // IO口模拟I2C通信 sbit DS3231_SCL=P3^6; // ds32321模拟I2C数据传送位SDA sbit DS3231_SDA=P3^7; // 模拟I2C时钟控制位SCL bit ack; //应答标志位 /******************************************************************************************************** ** DS3231常数定义 ********************************************************************************************************/ #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_TEMPERATUREH 0x11 //温度寄存器高字节(8位) 整数部分 #define DS3231_TEMPERATUREL 0x12 //温度寄存器低字节(低2位) 小数部分 #define NACK 1 #define ACK 0 char hour,min,sec,year,month,day,date,week; //定义读取3231的时分秒年月日星期变量 char Tem_L,Tem_H; //定义读取3231的温度高字节整数部分和低字节小数部分变量 unsigned int TH3231; //unsigned char nians,niang,yues,yueg,ris,rig,shis,shig,fens,feng,miaos,miaog; //定义分解变量 ///***************按键端口************/// sbit KEY1= P1^1; //调整 sbit KEY2= P1^2; //++ sbit KEY3= P1^3; //-- sbit KEY4= P1^4; //退出 unsigned char a1,a2,a3,a4; //按键消抖用 unsigned char disflag=0,b1; //时间调整相关//b1用来计数进入设置到10秒后如果没有按键按下就返回时间显示 void Delay5US() //@12.000MHz 延时5us { _nop_(); //_nop_(); _nop_();_nop_(); //1T单片机用4个nop,12T用1个nop } /*1T 12M 延时函数 Delay_us(1)时大约1us*/ void Delay_us(uint us) { while(us--) { _nop_(); _nop_(); } } /********************************************** //IIC Start IIC总线产生起始信号函数 **********************************************/ void IIC_Start() { DS3231_SDA = 1; //拉高时钟线 Delay_us(1); DS3231_SCL = 1; //拉高数据线 Delay_us(5); //起始条件建立时间大于4.7us,延时 DS3231_SDA = 0; //在时钟线为高电平时,拉低数据线,产生起始信号 发送起始信号 Delay_us(1); DS3231_SCL = 0; //钳住I2C总线,准备发送或接收数据 Delay_us(1); } /*IIC_Stop IIC总线产生停止信号函数*/ void IIC_Stop() { DS3231_SDA = 0; //拉低数据线 Delay_us(1); DS3231_SCL = 0; //拉低数据线 Delay_us(5); //起始条件建立时间大于4.7us,延时 DS3231_SCL = 1; //时钟时线为高电平时,拉高数据线,产生停止信号 Delay_us(1); DS3231_SDA = 1; //时钟时线为高电平时,拉高数据线,产生停止信号 } unsigned char BCD2HEX(unsigned char val) //BCD转换为Byte { return ((val>>4)*10)+(val&0x0f); } unsigned char HEX2BCD(unsigned char val) //B码转换为BCD码 { return (((val%100)/10)<<4)|(val%10); } /******************************************************************* 字节数据发送函数 函数原型: void SendByte(uchar Dat); 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对 此状态位进行操作.(不应答或非应答都使ack=0) ack=1 发送数据正常, ack=0 被控器无应答或损坏。 ********************************************************************/ void SendByte(unsigned char c) { unsigned char BitCnt; for(BitCnt=0;BitCnt<8;BitCnt++) //要传送的数据长度为8位 { if((c<<BitCnt)&0x80) DS3231_SDA=1; //判断发送位 else DS3231_SDA=0; Delay_us(1); DS3231_SCL=1; //置时钟线为高,通知被控器开始接收数据位 Delay_us(5); //保证时钟高电平周期大于4μs DS3231_SCL=0; } DS3231_SDA=1; //8位发送完后释放数据线,准备接收应答位 Delay_us(1); DS3231_SCL=1; Delay_us(3); if(DS3231_SDA==1) ack=0; else ack=1; //判断是否接收到应答信号 DS3231_SCL=0; Delay_us(3); } /*用来接收从器件传来的数据,并判断总线错误(不发应答信号),发完后请用应答函数应答从机*/ unsigned char RcvByte() { unsigned char retc; unsigned char BitCnt; retc=0; DS3231_SDA=1; //置数据线为输入方式 for(BitCnt=0;BitCnt<8;BitCnt++) { Delay_us(1); DS3231_SCL=0; //置时钟线为低,准备接收数据位 Delay_us(5); //时钟低电平周期大于4.7μs DS3231_SCL=1; //置时钟线为高使数据线上数据有效 Delay_us(3); retc=retc<<1; if(DS3231_SDA==1) retc=retc+1; //读数据位,接收的数据位放入retc中 Delay_us(2); } DS3231_SCL=0; Delay_us(1); return(retc); } /*主控器进行应答信号(可以是应答或非应答信号,由位参数a决定)*/ void Ack_I2C(bit a) { if(a==0)DS3231_SDA=0; //在此发出应答或非应答信号 else(DS3231_SDA=1); Delay_us(3); DS3231_SCL=1; Delay_us(5); //时钟低电平周期大于4us DS3231_SCL=0; //清时钟线,钳住I2C总线以便继续接收 Delay_us(2); } unsigned char write_byte(unsigned char addr, unsigned char write_data) //DS3231写一字节数据 { IIC_Start(); SendByte(DS3231_WriteAddress); //器件写地址0xD0 if (ack == 0) return 0; SendByte(addr); if (ack == 0) return 0; SendByte(write_data); if (ack == 0) return 0; IIC_Stop(); Delay_us(10); return 1; } unsigned char read_current() //DS3231读一字节数据 { unsigned char read_data; IIC_Start(); SendByte(DS3231_ReadAddress); //器件读地址0xD1 if(ack==0) return(0); read_data = RcvByte(); Ack_I2C(1); IIC_Stop(); return read_data; } unsigned char read_random(unsigned char random_addr) //DS3231读时钟数据 { unsigned char Tmp; IIC_Start(); SendByte(DS3231_WriteAddress); //器件写地址0xD0 if(ack==0) return(0); SendByte(random_addr); if(ack==0) return(0); Tmp=read_current(); if(random_addr==DS3231_HOUR) Tmp&=0x3f; return(BCD2HEX(Tmp));//都转10进制输出 //BCD转换为Byte } ///**********************************读温度函数***********************************/// unsigned char read_random1(unsigned char random_addr) //这个是读温度函数 { unsigned char Tmp; write_byte(0x0e,0x20);//0x0e寄存器的CONV位置1开启温度转换,要这句,温度实时刷新,这句不要,温度要64s才刷新1次 IIC_Start(); SendByte(DS3231_WriteAddress); if(ack==0) return(0); SendByte(random_addr); if(ack==0) return(0); Tmp=read_current(); return Tmp; } ///************************DS3231时间调整和读出各项数据***************************************************//// void ModifyTime(unsigned char address,unsigned char num) //DS3231写时钟数据 { unsigned char temp=0; if(address>6 && address <0) return; temp=HEX2BCD(num); write_byte(address,temp); } void read3231() //读出DS3231的各个数据 { year = read_random(DS3231_YEAR); //读出年数据 month = read_random(DS3231_MONTH); //读出月数据 day = read_random(DS3231_DAY); //读出日数据 week = read_random(DS3231_WEEK); //读出星期数据 hour = read_random(DS3231_HOUR); //读出小时数据 min = read_random(DS3231_MINUTE) ; //读出分钟数据 sec = read_random(DS3231_SECOND); //读出秒数据 Tem_H=read_random1(DS3231_TEMPERATUREH); //读出温度 高字节 整数部分 Tem_L=((read_random1(DS3231_TEMPERATUREL))>>6)*0.25*100; //读出温度 低字节 小数部分 /* nians=year/10;niang=year%10; yues=month/10;yueg=month%10; ris=day/10;rig=day%10; shis=hour/10;shig=hour%10; fens=min/10;feng=min%10; miaos=sec/10;miaog=sec%10; */ } void Set(unsigned char sel,unsigned char selby) //年月日时分秒限定调整范围并写入时钟数据 { unsigned char address; char item; unsigned char max,min; if(sel==1) {address=DS3231_HOUR; max=23;min=0;} //小时 if(sel==2) {address=DS3231_MINUTE; max=59;min=0;} //分钟 if(sel==3) {address=DS3231_SECOND; max=59;min=0;} //秒 if(sel==4) {address=DS3231_YEAR; max=99;min=0;} //年 if(sel==5) {address=DS3231_MONTH; max=12;min=1;} //月 if(sel==6) //日 { if(month==2) { if(((year%4==0)&&(year%100!=0))||(year%400==0)) //闰年2月29天 原作者if(month == 2 && year % 4 != 0) { {address=DS3231_DAY; max=29;min=1;} } else //非闰年2月28天 { {address=DS3231_DAY; max=28;min=1;} } } else { if(month==1|month==3|month==5|month==7|month==8|month==10|month==12) //大月 31天 { {address=DS3231_DAY; max=31;min=1;} } if(month==4|month==6|month==9|month==11) //小月 30天 { {address=DS3231_DAY; max=30;min=1;} } } } //if(sel==7) {address=DS3231_WEEK; max=7; min=1;} //星期 星期根据年月日数据求出,这里屏蔽掉 item= read_random(address); //DS3231读时钟数据 if (selby==0) item++; else item--; if(item>max) item=min; if(item<min) item=max; ModifyTime(address, item); //DS3231写时间数据 } void KEY() //按键程序 { if(a1==0) { if(KEY1==0) { Delay5US(); if(KEY1==0) { b1=0; //10秒延时b1清零,加这句是使每次进入设置时a1计数都能从0秒开始计数延时,极端情况刚进设置就退出来了,因为a1始终都在循环累加 disflag++; if(disflag>=7 || KEY4==0) //如果需要手动调星期就disflag>=8 { disflag=0; } a1=1; } } } if(KEY1==1) { a1=0; } if(a2==0) { if(KEY2==0) { Delay5US(); if(KEY2==0) { b1=0; //10秒延时b1清零 Set(disflag,0); a2=1; } } } if(KEY2==1) { a2=0; } if(a3==0) { if(KEY3==0) { Delay5US(); if(KEY3==0) { b1=0; //10秒延时b1清零 Set(disflag,1); a3=1; } } } if(KEY3==1) { a3=0; } //******************************** if(a4==0) { if(KEY4==0) { Delay5US(); if(KEY4==0 && disflag!=0 ) { b1=0; //10秒延时b1清零 disflag=0; } a4=1; } } if(KEY4==1) { a4=0; } } #endif |
#include<reg51.h> //用89C52单片机 #include<intrins.h> #include<18B20.h> //18B20头文件 #include<DS3231.h> //DS1302头文件 #include<nongli.h> //农历转换头文件 #include<ziku.h> //字库头文件 #include<string.h> #define uchar unsigned char #define uint unsigned int /******LCD12864通讯端口******/ sbit RS_LCD12864=P2^7; //定义选择显示类型, 定义数据或指令,1=数据,0=指令 sbit RW_LCD12864=P2^6; //定义读写信号控制端, 定义读或写??1=读,??0=写 sbit EN_LCD12864=P2^5; //定义数据锁存信号, 定义使能操作, 1=能,??0=否 #define LCD12864_Databus P0 //定义数据端 #define sc0 0 #define sc1 1 unsigned char fb; sbit CS1=P2^4; //定义选择芯片右半屏信号 sbit CS2=P2^3; //定义选择芯片左半屏信号 unsigned char shan_count; //:号闪烁计时变量 unsigned char shan_js; //校时闪烁计时变量 bit flag; //校时闪烁标志位 void Timer0Init(); //声明定时器初始化函数 10毫秒 /********************************LCD12864部分*****************************/ /****************************************************************************** 端口说明:EN_LCD12864:使能端锁存信号。RS_LCD12864:D/I 命令/数据寄存器选择端 RW_LCD12864:读写信号控制端. define LCD_Data P0 RS(D/I)=1,表示DB0-DB7显示数据; RS(D/I)=0,表示DB0-DB7显示指令数据 RW=1,E=1,数据被读到DB7-DB0;RW=0,E=1--0,数据被读到DB7-DB0;数据被 写到IR或DR。 (定义数据端口为 LCD_Data为P0口) RST_LCD12864复位端口,不接或接高电平,低电平会导致复位 函数名称:void Lcd12864_BusyChk() 函数功能:忙检测,若忙则等待,最长等待时间为60MS(此判忙函数经过仿真已OK) 入口参数:无 出口参数:无 ***********************************************************************/ void Lcd12864_BusyChk() //忙检测,若忙则等待,最长等待时间为60MS { LCD12864_Databus=0x00; EN_LCD12864=0; RS_LCD12864=0; RW_LCD12864=1; EN_LCD12864=1; while(LCD12864_Databus&0x80); //判断P0.7口 _nop_(); EN_LCD12864=0; } /********************************************************************** * 函数名称: void set_xy(unsigned char x,unsigned char y) (实物时的函数,已OK) * 功能描述: 设置显示位置! X,Y分别代表横纵坐标! * 输入参数?: unsigned char x,unsigned char y *输出参数: 无?? *参数名称:? ?//列地址赋值,?x取值0----64,页面地址赋值,y取值0----8 ***********************************************************************/ void set_xy(unsigned char x,unsigned char y) // 设置显示位置! X,Y分别代表横纵坐标! { if (x>=64) {CS1=sc0;CS2=sc1;} //选择右半屏 else {CS1=sc1;CS2=sc0;} //选择左半屏 Lcd12864_BusyChk(); RS_LCD12864=0; RW_LCD12864=0; LCD12864_Databus=0x40|x; //列地址赋值,x取值0----64 EN_LCD12864=1; EN_LCD12864=0; Lcd12864_BusyChk(); RS_LCD12864=0; RW_LCD12864=0; LCD12864_Databus=0xb8|y; //页面地址赋值,y取值0----8 EN_LCD12864=1; EN_LCD12864=0; LCD12864_Databus=0xff; } /******************************************************************************* * 函数名称: void lw(uchar x,uchar y,uchar dd) * 功能描述: 在指定的位置显示数据 * 输入参数?:(unsigned char x,unsigned char y,uchar dd) *输出参数: 无?? ?*******************************************************************************/ void Lcd12864_WriteData(unsigned char x,unsigned char y,unsigned char dd) //在指定的位置显示数据 { set_xy(x,y); Lcd12864_BusyChk(); RS_LCD12864=1; RW_LCD12864=0; LCD12864_Databus=dd; //数据送显 EN_LCD12864=1; EN_LCD12864=0; LCD12864_Databus=0xff; } /********************************************************************** * 函数名称: void lcd12864_Init(void)(仿真时的函数,已仿真OK) * 功能描述: 显示初始化 * 输入参数?:无 * 输出参数: 无?? ***********************************************************************/ void lcd12864_Init(void) //12864 显示初始化 { unsigned char x,y; RS_LCD12864=0; RW_LCD12864=0; EN_LCD12864=0; CS1=sc1; //选择左半屏显示 LCD12864_Databus=0x3f; //打开左半屏显示 EN_LCD12864=1; EN_LCD12864=0; CS2=sc1; //选择右半屏显示 LCD12864_Databus=0x3f; //打开右半屏显示 EN_LCD12864=1; EN_LCD12864=0; CS1=sc1; Lcd12864_BusyChk(); RS_LCD12864=0; RW_LCD12864=0; LCD12864_Databus=0xc0; //设置左半屏起始行,是第一行 EN_LCD12864=1; EN_LCD12864=0; CS2=sc1; Lcd12864_BusyChk(); RS_LCD12864=0; RW_LCD12864=0; LCD12864_Databus=0xc0; //设置右半屏起始行,是第一行 EN_LCD12864=1; EN_LCD12864=0; CS1=sc1; CS2=sc1; for (y=0;y<8;y++) { for (x=0;x<128;x++) Lcd12864_WriteData(x,y,0); //全屏清零显示 } } /********************************************************************** * 函数名称: void Lcd12864_DispWord(uchar x,uchar y,uchar n,uchar fb) * 功能描述:显示一个汉字,n代表字表里第n个字!fb==1:反白显示 * 输入参数?:(uchar x,uchar y,uchar n,uchar fb) *输出参数: 无?? * 显示方式为先上半部第一列,再下半部第一列,然后上半部第二列... ?***********************************************************************/ void Lcd12864_DispWord(unsigned char x,unsigned char y,unsigned char n,unsigned char fb) //显示16X16汉字 { unsigned char i,dd; for (i=0;i<16;i++) { dd=hz[i+n*32]; if (fb) dd=255-dd; Lcd12864_WriteData(x*8+i,y,dd); //显示汉字的上半部分 dd=hz[i+n*32+16]; if (fb) dd=255-dd; Lcd12864_WriteData(x*8+i,y+1,dd); //显示汉字的下半部分 } } /********************************************************************** * 函数名称:void Lcd12864_DispDaShuZi(uchar x,uchar y,uchar n,uchar fb) * 功能描述:显示一个大的数字,n代表字表里第n个数字!fb==1:反白显示 * 输入参数?:(uchar x,uchar y,uchar n,uchar fb) * 输出参数: 无?? * 显示方式为先上半部第一列,再下半部第一列,然后上半部第二列... ?***********************************************************************/ void Lcd12864_DispDaShuZi(unsigned char x,unsigned char y,unsigned char n,unsigned char fb) //显示一个大的数字16X32 { unsigned char i,dd; for (i=0;i<16;i++) { dd=dazi[i+n*64]; if (fb) dd=255-dd; Lcd12864_WriteData(x*8+i,y,dd); dd=dazi[i+n*64+16]; if (fb) dd=255-dd; Lcd12864_WriteData(x*8+i,y+1,dd); //显示大数字的上半部分 dd=dazi[i+n*64+32]; if (fb) dd=255-dd; Lcd12864_WriteData(x*8+i,y+2,dd); dd=dazi[i+n*64+48]; if (fb) dd=255-dd; Lcd12864_WriteData(x*8+i,y+3,dd); //显示大数字的下半部分 } } /********************************************************************** * 函数名称: void Lcd12864_DispChar(uchar x,uchar y,uchar n,uchar fb) * 功能描述: 显示一个数字,n代表字表里第n个数字!fb==1:反白显示 X; 0-7列,共64列, y: 0-7页 * 功能描述: 显示年月日,温度的数字 * 输入参数?:(uchar x,uchar y,uchar n,uchar fb) *输出参数: 无?? ?***********************************************************************/ void Lcd12864_DispChar(unsigned char x,unsigned char y,unsigned char n,unsigned char fb) //显示年月日,温度的数字/8X16数据 { unsigned char i,dd; for (i=0;i<8;i++) { dd=number[i+n*16]; //8X16,0-9,:,-, .等 if (fb) dd=255-dd; Lcd12864_WriteData(x*8+i,y,dd); //显示数字的上半部分 dd=number[i+n*16+8]; if (fb) dd=255-dd; Lcd12864_WriteData(x*8+i,y+1,dd); //显示数字的下半部分 } } /*************************************************************************************** 函数名称:void LCD12864_DispYanYueRi(fb) 函数功能:设置日期的时候,选中的参数可以反白显示,右屏第一行显示程序, 由which决定第几个参数黑显,如which==1时,年份黑显. 入口参数:无 出口参数:无 ****************************************************************************************/ void LCD12864_DispYanYueRi(fb) //显示年月日 { if(century) //如果世纪为1 { Lcd12864_DispChar(2,0,1,0); //第1行第3列显示世纪的十位’1” Lcd12864_DispChar(3,0,9,0); //第1行第4列显示世纪的个位’9” } else { Lcd12864_DispChar(2,0,2,0); //第1行第3列显示世纪的十位’2” Lcd12864_DispChar(3,0,0,0); //第1行第4列显示世纪的个位’0” } if(disflag==4 && flag==0) //校正年的时候年闪烁 { Lcd12864_DispChar(4,0,12,fb); //第1行第5不显示年十位数 Lcd12864_DispChar(5,0,12,fb); //第1行第6不显示年个位数 } else { Lcd12864_DispChar(4,0,year/10,fb); //第1行第5显示年十位数 Lcd12864_DispChar(5,0,year%10,fb); //第1行第6显示年个位数 } Lcd12864_DispChar(6,0,11,0); //第1行第7显示第11个数据”-” if(disflag==5 && flag==0) //校正月的时候月闪烁 { Lcd12864_DispChar(7,0,12,fb); //第1行第8不显示月十位数 Lcd12864_DispChar(8,0,12,fb); //第1行第9列不显示月个位数 } else { Lcd12864_DispChar(7,0,month/10,fb); //第1行第8显示月十位数 Lcd12864_DispChar(8,0,month%10,fb); //第1行第9列显示月个位数 } Lcd12864_DispChar(9,0,11,0); //第1行第10列显示第11个数据”-” if(disflag==6 && flag==0) //校正日期的时候日闪烁 { Lcd12864_DispChar(10,0,12,fb); //第1行第11列不显示日十位数 Lcd12864_DispChar(11,0,12,fb); //第1行第12列不显示日个位数 } else { Lcd12864_DispChar(10,0,day/10,fb); //第1行第11列显示日十位数 Lcd12864_DispChar(11,0,day%10,fb); //第1行第12列显示日个位数 } } /****************************************************************************** 函数名称:void LCD12864_DispShiFenMiao(fb) 显示时分秒 函数功能:设置时间的时候,选中的参数可以反白显示,右屏第二行显示程序, 由which决定第几个参数黑显,如which==1时,年份黑显. 入口参数:无 出口参数:无 ***********************************************************************/ void LCD12864_DispShiFenMiao(fb) //显示时分秒 { if(disflag==1 && flag==0) //时钟小时的时候小时闪烁 { Lcd12864_DispDaShuZi(0,2,11,fb); //第3行第1/2列不显示小时十位数 Lcd12864_DispDaShuZi(2,2,11,fb); //第3行第3/4列不显示小时个位数 } else { if((hour/10)!=0) //10点到23点显示小时的十位 { Lcd12864_DispDaShuZi(0,2,hour/10,fb); //第3行第1/2列显示小时十位数 Lcd12864_DispDaShuZi(2,2,hour%10,fb); //第3行第3/4列显示小时个位数 } else //0点至9点不显示小时的十位0 { Lcd12864_DispDaShuZi(0,2,11,fb); //第3行第1/2列不显示小时十位数 Lcd12864_DispDaShuZi(2,2,hour%10,fb); //第3行第3/4列显示小时个位数 } } if(shan_count >=10 && disflag==0) //正常走时,如果shan_count>=10 ,冒号闪烁 { Lcd12864_DispDaShuZi(4,2,10,0); //第3行第5/6列第10个大数字为显示冒号,不反白 Lcd12864_DispDaShuZi(10,2,10,0); //第3行第11/12列第10个大数字为显示冒号,不反白 } else //大于0.5秒时两点不显示形成闪烁效果 { Lcd12864_DispDaShuZi(4,2,11,0); //第3行第5/6列第11个大数字为显示空,不反白 Lcd12864_DispDaShuZi(10,2,11,0); //第3行第11/12列第11个大数字为显示空,不反白 } if(disflag==2 && flag==0) //设置分的时候分闪烁 { Lcd12864_DispDaShuZi(6,2,11,fb); //第3行第7/8列不显示分钟的十位数 Lcd12864_DispDaShuZi(8,2,11,fb); //第3行第9/10列不显示分钟的个位数 } else { Lcd12864_DispDaShuZi(6,2,min/10,fb); //第3行第7/8列显示分钟的十位数 Lcd12864_DispDaShuZi(8,2,min%10,fb); //第3行第9/10列显示分钟的个位数 } if(disflag==3 && flag==0) //校时的时候秒闪烁 { Lcd12864_DispDaShuZi(12,2,11,fb); //第3行第13/14列不显示秒钟的十位数 Lcd12864_DispDaShuZi(14,2,11,fb); //第3行第15/16列不显示秒钟的个位数 } else { Lcd12864_DispDaShuZi(12,2,sec/10,fb); //第3行第13/14列显示秒钟的十位数 Lcd12864_DispDaShuZi(14,2,sec%10,fb); //第3行第15/16列显示秒钟的个位数 } } /****************************************************************************** 函数名称:void LCD12864_DispWeek(fb) 显示 周 函数功能:设置时间的时候,选中的参数可以反白显示,右屏第一行显示程序, 由which决定第几个参数黑显,如which==1时,年份黑显. 入口参数:无 出口参数:无 *******************************************************************************/ void LCD12864_DispWeek() //显示星期/周 生肖属性 { unsigned char temp; Lcd12864_DispWord(12,0,27,0); //第1行第13列第27个汉字为显示“周”字 Conver_week(); //调用星期阳历数据 if(week) temp=week; //赋week值为1----6,用来显示“一”----“六” else week=26; //赋week值为0时,赋值26用来显示“日” Lcd12864_DispWord(14,0,week,0); //第1行第14列第26个汉字为显示“日” read3231(); //读出DS3231的各个数据 Conversion(century,year,month,day); //得到农历日期 if(c_moon) //century=0 为21世纪,c=1 为19世纪 temp=year_moon%12+12; //如果是19世纪,则可直接得出年的属性 加12是因为生肖在字库的第13个开始 else temp=(year_moon+100)%12+12; //农历年也过了世纪,则农历年加100再求属性 加12是因为生肖在字库的第13个开始 Lcd12864_DispWord(0,0,temp,1);// 第1行第1列 显示十二生肖属性 1反显 } /****************************************************************************** 函数名称:void LCD12864_DispNongLiRiQi(fb) 显示 农历日期 函数功能:第4行农历显示 由which决定第几个参数黑显,如which==1时,年份黑显. 入口参数:无 出口参数:无 *******************************************************************************/ void LCD12864_DispNongLiRiQi() //显示农历日期 { unsigned char temp1,temp2; // verify_time(); Conversion(century,year,month,day); //得到农历日期,世纪/年/月/日 temp1=month_moon/10; //农历月份高位 两位农历月份求模送显示 temp2=month_moon%10; //农历月份低位 两位农历月份求模送显示 //月份高位为0,低位为1,则月份前位显"正",后位显示“月”字 if(temp1==0&&temp2==1) //如果农历日期,月的十位为0,个位为1,则为正月 { Lcd12864_DispWord(0,6,39,0); //第7行第1列 显示”正”字 Lcd12864_DispWord(2,6,25,0); //第7行第3列 显示”月”字 } //月份高位为0,低位都大于等于2,则月份高位显月份,后位显月。 else if (temp1==0&&temp2>=2) { Lcd12864_DispWord(0,6,temp2,0);//第7行第1列 显示月份 Lcd12864_DispWord(2,6,25,0); //第7行第3列 显示”月”字 } //月份高位为1,低位为0,则月份高位显“十”,后位显月。 else if (temp1==1&&temp2==0) { Lcd12864_DispWord(0,6,0,0); //第7行第1列 显示”十”字 Lcd12864_DispWord(2,6,25,0); //第7行第3列 显示”月”字 } //月份高位为1,低位为1,则月份高位显“冬”,后位显月。 else if (temp1==1&&temp2==1) { Lcd12864_DispWord(0,6,29,0); //第7行第1列 显示”冬”字 Lcd12864_DispWord(2,6,25,0); //第7行第3列 显示”月”字 } else { Lcd12864_DispWord(0,6,30,0); //第7行第1列 显示”腊”字 Lcd12864_DispWord(2,6,25,0); //第7行第3列 显示”月”字 } temp1=day_moon/10; //农历日期高位 两位农历日期求模送显示 temp2=day_moon%10; //农历日期地位 两位农历日期求余送显示 switch (temp1) { //日期高位为0,则前位显“初” case 0: Lcd12864_DispWord(4,6,10,0); //第7行第5列 显示”初”字 Lcd12864_DispWord(6,6,temp2,0);//第7行第7列 显示低位字 break; //日期高位为1且低位不为0,则前位显“十” case 1: if(temp2) { Lcd12864_DispWord(4,6,0,0); //第7行第5列 显示”十”字 Lcd12864_DispWord(6,6,temp2,0); //第7行第7列 显示低位农历月份 break; } else //日期高位为1且低位为0,则显“初十” { Lcd12864_DispWord(4,6,10,0); //第7行第5列 显示”初”字 Lcd12864_DispWord(6,6,0,0); //第7行第7列 显示”十”字 break; } //日期高位为2,则前位显“廿” case 2: Lcd12864_DispWord(4,6,11,0); //第7行第5列 显示”"廿"字 Lcd12864_DispWord(6,6,temp2,0); //第7行第7列 显示低位农历月份 break; //日期高位为3,则前位显“三”,低位显“十” case 3: Lcd12864_DispWord(4,6,3,0); //第7行第5列 显示”三”字 Lcd12864_DispWord(6,6,temp2,0); //第7行第7列 显示低位农历月份 break; } } void Lcd12864_DispTemp() //温度显示程序 正显 { if(temp_flag==1)//温度为正数标志 { if((t_b==0)&(t_s==0))//10度以下时不显示十位 { Lcd12864_DispWord(8,6,40,0); //第7行第9列10列固定显示温度"!"图标,16X16数据 Lcd12864_DispChar(10,6,t_g,0); //第7行第11列/显示个位数据 8*16数据 Lcd12864_DispChar(11,6,13,0); //第7行第12列/显示数据为“.”字符 8*16数据 Lcd12864_DispChar(12,6,t_x,0); //第7行第13列/显示小数位 8*16数据 Lcd12864_DispChar(13,6,12,0); //第7行第14列/(12)不显示 8*16数据 第四位/1反白0正显示 } else { Lcd12864_DispWord(8,6,40,0); //第7行第9列10列固定显示温度"!"图标,16X16数据 Lcd12864_DispChar(10,6,t_s,0); //第7行第11列/显示十位数据 8*16数据 Lcd12864_DispChar(11,6,t_g,0); //第7行第12列/显示个位数据 8*16数据 Lcd12864_DispChar(12,6,13,0); //第7行第13列/显示数据为“.”字符 8*16数据 Lcd12864_DispChar(13,6,t_x,0); //第7行第14列/显示小数位 8*16数据 } } /* if(temp_flag==0)//温度为负数时 { Lcd12864_DispWord(8,6,40,0); //第7行第9列10列固定显示温度"!"图标,16X16数据 Lcd12864_DispChar(10,6,11,0); //第7行第11列/显示-负号 8*16数据 Lcd12864_DispChar(11,6,f_g,0); //第7行第12列/显示负温度个位数据 8*16数据 Lcd12864_DispChar(12,6,13,0); //第7行第13列/显示数据为“.”字符 8*16数据 Lcd12864_DispChar(13,6,f_x,0); //第7行第14列/显示负温度小数位数据 8*16数据 } */ Lcd12864_DispWord(14,6,28,0); //第7行第15列16列固定显示温度"℃"图标,16X16数据 } /****************************************************************************** 函数名称:void Lcd12864_DispTime() 显示 日期与时钟 函数功能://第一行显示年月日8X16数字,最后为周 //第二行显示时分秒,大数字 //第三行显示农历,温度 入口参数:无 出口参数:无 *******************************************************************************/ void Lcd12864_DispTime() //显示日期与时钟子程序 { LCD12864_DispYanYueRi(0); //第一行显示年月日 LCD12864_DispShiFenMiao(0); //第二行显示时分秒,大数字 LCD12864_DispWeek(); //第一行显示星期 生肖 LCD12864_DispNongLiRiQi(); //第三行显示农历 } /*主程序*/ void main(void) { Timer0Init(); //10毫秒@11.0592MHz lcd12864_Init(); //液晶初始化,此函数只起清屏的作用 century=0; //对世纪赋初值 while(1) { read3231(); //读出DS3231的各个数据 GetTemp(); //读取温度函数 Lcd12864_DispTemp(); //温度显示处理函数 KEY(); //按键程序 Lcd12864_DispTime(); //这里调用显示时间程序 } } void Timer0Init(void) //10毫秒@11.0592MHz { TMOD=0x01;//设定定时器工作方式1,定时器定时50毫秒 TH0=(65536-50000)/256; TL0=(65536-50000)%256; EA=1;//开总中断 ET0=1;//允许定时器0中断 TR0 = 1; //定时器0开始计时 } /**************定时器0 中断函数******************/ void timer0() interrupt 1 { TH0=(65536-50000)/256; //1次中断50毫秒 TL0=(65536-50000)%256; shan_count++; //时钟:号闪烁计数 shan_js++; //校时闪烁计数 if(shan_count == 20) //:号闪烁,亮0.5秒,灭0.5秒;闪烁频率可调。 { shan_count = 0; b1++; //10秒延时b1自加 } if(b1>10) //10秒延时 { b1=0; //10秒延时b1清零 disflag=0; //设置标志位清零 } if(shan_js == 10) //250ms闪烁一次 { shan_js = 0; flag = !flag; //250毫秒标志位 } } |
hnxtlxx 发表于 2023-6-2 06:47 朋友,我是业余玩玩的,这有半年没弄过了,不记得当时改了那些地方,压缩上传我也不会弄,我试试把所有文件贴在这里看行不行 |
niehaitao 发表于 2022-12-18 09:30 请教大佬,我做出来后,按键减少调整不了,并且秒钟的调整有问题,请问大佬怎么解决的,谢谢。如果解决了,能共享一下程序吗?感激不尽 |
按键调整减貌似有问题,另外就是调秒钟时,秒钟数字乱跳,还有闹钟无法调整 |
IMG_20230601_231400.jpg (218.9 KB, 下载次数: 125)
请问各位大佬,1302的晶振焊在哪里,能发个电路图吗?非常感谢 |
谢谢分享,制作精良,外观漂亮。 |
太厉害了,小白仰慕 |
谢谢分享,制作精良,外观漂亮。 |
要对作者支持鼓励··谢谢分享 |
hchi2006 发表于 2022-11-22 22:58 用的不带字库屏 |
紫气东来 发表于 2022-12-4 15:32 你会让24064显示就可以自己改显示部分啊,或者搜索一下,比如这个显示 |
紫气东来 发表于 2022-12-20 14:23 不带字库的,程序里面有自建的字库文件 |
niehaitao 发表于 2022-12-18 09:30 12864带不带字库 |
谢谢分享,已经制作成功,稍微作了下改动,原来秒的两点是显示1秒灭1秒,加了定时器大约500毫秒亮500毫秒灭,然后把小时的十位在是0的时候不显示 |
51hei图片_20221218092339.jpg (127.68 KB, 下载次数: 145)
51hei图片_20221218092349.jpg (127.17 KB, 下载次数: 148)
51hei图片_20221218093016.jpg (121.03 KB, 下载次数: 149)
谢谢分享万年历。 |
非常好,还没有仔细看,非常精炼,我写的没带万年历还有近4K字节,要借鉴一下 |
要是能用在24064屏就好了,因为我手头就一个24064的屏 |
这么好的东东怎么没人顶呀,我正想学习呢,请问楼主用的屏带中文字库的吗?看仿真好像不带哟。谢谢楼主无私奉献! |